shell 脚本中 for 循环后的 & 符号

shell 脚本中 for 循环后的 & 符号

在终端上运行以下命令有什么区别?

命令1

for i in {1..3}; do ./script.sh >& log.$i  & done

命令2

for i in {1..3}; do ./script.sh >& log.$i  & done &

运行第一个命令会在屏幕上显示三个作业 ID,我可以在终端上键入下一个命令。

第二个命令有点奇怪,它没有在屏幕上显示任何作业 ID,运行jobs命令后我也看不到它们。工作岗位都去哪儿了?

在 script.sh 内部我有以下循环

for k in 1; do
 ./tmp -arguments
done

echo "hello"

如果我使用命令 1,我可以通过htop./tmp可执行文件正在运行但echo "hello"尚未执行(不在日志文件中)。

如果我使用命令 2,我可以通过htop./tmp可执行文件正在运行并且echo "hello"已经执行(如日志文件中所示)。

为什么&终端上的 an 会改变 shell 脚本内 for 循环的行为?

[GNU bash,版本 4.3.11(1)-发布 (x86_64-pc-linux-gnu)]

答案1

第一个

for i in {1..3}; do
    ./script.sh >& log.$i  &
done

在当前 shell 中运行。循环的每次迭代都将script.sh脚本作为当前 shell 的作业来运行,因此您可以这样看到它们。

第二个

for i in {1..3}; do
    ./script.sh >& log.$i  &
done &

首先启动一个控制循环的子shell。然后 3 次迭代创建 3 个子流程shell,而在当前 shell 中,您只能看到 1 个作业,这是整个命令,尚未分解为特定作业。 (您应该看到这 1 份工作。要么作为跑步一个或作为完毕.)

在这两种情况下,可执行./tmp文件应以相同的方式运行。如果你看到echo "hello"已经执行过,这意味着./tmp之前已经完成了。如果它表现异常,您应该进行调试(并将详细信息添加到您的问题中)。特别是,请确保在两种情况下调用时的启动条件相同。例如。如果检查现有文件,请确保在这两种情况下它们确实存在/不存在,等等。

答案2

末尾的“&”导致命令在后台运行。有关此内容的完整说明,请查看此链接。

在后台运行 Bash 命令

相关内容