我有一堆 shell 脚本,用于按顺序运行不同参数的代码。例如,其中一个文件包含如下行:
./exec30_10 55000 6234611 41 0 -4 1
./exec30_10 55000 6234611 41 0 -3 1
./exec30_10 55000 6234611 41 0 -2 1
./exec30_10 55000 6234611 41 0 -1 1
./exec30_10 55000 6234611 41 0 0 1
其中 exec30_10 是与我的同一目录中的可执行文件.sh脚本。它们有很多,我想把它们都放在一个文件夹中。但是现在 shell 脚本的目录不一样了。但是有没有办法使用 shell 脚本在不同的目录中运行代码?
答案1
该脚本有一个错误。./
每行上的 都强制您进入cd
这些文件所在的目录,然后它才能正常工作。
也许你可以用类似的东西来改变它
sed 's%\./%/path/to/dir/%' script.sh | sh
该sed
命令将修改后的脚本版本打印到其标准输出,然后我们将其提供给另一个sh
实例来执行它。(也许首先取出管道,以便sh
您可以看到它正在打印的内容,当然,修改替换字符串以指向正确的目录。)
如果您希望使此更改永久生效,某些sed
变体允许您使用-i
选项将更改写回文件而不是打印它们。
一般来说,正确编写的脚本应该在任何目录中运行,而不是硬编码任何路径。如果不了解您的具体用例,很难说。如果使用循环,错误的脚本显然会更加优雅,因此只有一个地方需要更改;也许您可以将其设为一个变量,您可以在运行时更改它而无需修改脚本,方法是读取配置文件或接受命令行参数。或者它应该简单地做
cd "$(dirname "$0")"
在顶部,封装并屏蔽用户在特定目录中运行的要求。(这只会在脚本运行期间更改工作目录;当它退出时,父 shell 会重新获得控制权,并且当然会保留在您启动的目录中。)另一个技巧是将当前目录添加到前面PATH
,尽管在这种情况下这可能有点可疑。
PATH="$(dirname "$0"):$PATH"
循环可以简单地
while IFS= read -r speed gain frob offset luck charm; do
./exec30_10 "$speed" "$gain" "$frob" "$offset" "$luck" "$charm"
done <<\____HERE
55000 6234611 41 0 -4 1
55000 6234611 41 0 -3 1
55000 6234611 41 0 -2 1
55000 6234611 41 0 -1 1
55000 6234611 41 0 0 1
____HERE
这也在某种程度上通过变量名记录了参数的含义(虽然显然我只能胡乱猜测,因为我不知道)。或者如果你的例子很有代表性,而且其中大多数都不是变量,也许
# Bash-only syntax
for((i=-4; i<=0; ++i)); do
./exec30_10 55000 6234611 41 0 "$i" 1
done
这里,我假设您cd "$(dirname "$0")"
在脚本顶部使用了(因此./
可执行文件名称之前的可以并且应该保留)。(变量$0
是脚本本身的名称,如果调用者指定了前导路径,则任何前导路径都是完整的。)
答案2
您可以通过输入绝对路径(即 )来运行脚本,/home/bobe/script.sh
而不管它在文件系统中的哪个位置。例如,如果您移动exec30_10
到,则可以输入脚本。如果您移动到与调用脚本相同的目录中的目录,则可以运行。/var
/var/exec30_10
exec30_10
execs
./execs/exec30_10