我想知道当想要在正在运行的命令完成后附加要执行的命令时,bash 中的 Ctrl+Z 和 fg 的行为是什么。例如,在下面的命令序列中,我希望控制台显示“1”,然后显示“2”,然后显示“3”,然后显示“4”,但在 sleep 30 完成后,我只得到最后一个命令 echo 4:
avilella@magneto:~$ sleep 30 && echo 1
^Z
[1]+ Stopped sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 2
sleep 30
^Z
[1]+ Stopped sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 3
sleep 30
^Z
[1]+ Stopped sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 4
sleep 30
4
有任何想法吗?
答案1
Control-Z 暂停作业(不是您的 shell 命令行),因此所有其他命令将运行而无需等待它。似乎当您停止作业时,shell 会尝试运行下一个作业,但正如您使用的那样,&&
并且前一个命令没有完成 OK(根本没有完成但暂停了),带有 && 的命令将被丢弃。另一方面,如果您在命令行中使用;
第二&&
个命令,那么您会看到第二个命令在第一个命令暂停时执行:
$ perl -e '$|=1;for (1..5){ sleep 1;print}print qq{END\n} ';echo test_z00000000000000
12^Z
[1]+ Stopped perl -e '$|=1;for (1..5){ sleep 1;print} '
test_z00000000000000
$ fg
perl -e '$|=1;for (1..5){ sleep 1;print} '
345END
$
答案2
这不是fg
你想要的;可能是wait
。例如
$ cp large.file some/where
^Z
[1]+ 22224 suspended cp
$ wait && beep # beep when first command completes
更多信息:
$ help wait