如何使用 shell 脚本运行不同文件夹中的代码?

如何使用 shell 脚本运行不同文件夹中的代码?

我有一堆 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_10exec30_10execs./execs/exec30_10

相关内容