在终端上运行以下命令有什么区别?
命令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
末尾的“&”导致命令在后台运行。有关此内容的完整说明,请查看此链接。