如果 exit 命令与不同命令并行运行,则会话结束

如果 exit 命令与不同命令并行运行,则会话结束

我发现了我不理解的 shell 行为。当你执行

echo foo > /tmp/bar & exit

,终端关闭。但是当你执行

exit & echo foo > /tmp/bar

,终端保持打开状态,类似

[1] 4001

上面印有。

如果您使用 登录到不同的帐户,也可以看到第一个版本的输出su,因为这样,只有您登录的用户的会话su才会结束,并且您的终端保持打开状态。它是这样的:

[2] 13777
exit
[1]+  Done                    exit

exit如果是第一个命令,为什么会话没有结束?

以防万一您无法在 Unix 系统上复制此内容:我使用的是 Ubuntu 16.04。

答案1

你的第一个命令,

echo foo > /tmp/bar & exit

在后台启动一个子 shell 来运行echo foo > /tmp/bar,然后退出(前台 shell)。这将关闭您的终端,就像简单地键入 一样exit。背景外壳不会停留很长时间,所以你不会参加比赛;但如果您使用运行时间较长的命令执行此操作,根据您的 shell 和选项,您将得到不同的行为:

sleep 60 & exit

可能不会退出,但会抱怨您正在运行作业。

在这两种情况下,shell 都会打印一行表单,[1] 7149但如果您的终端关闭,您将没有时间看到它。

你的第二个命令,

exit & echo foo > /tmp/bar

在后台启动一个子 shell 来运行exit,该子 shell 退出(从子 shell 中)并运行echo foo > /tmp/bar。因此“主”shell 不会退出并且终端保持打开状态,这使您可以看到

[2] 13777

其次是

exit

(由退出的 shell 打印)然后

[1]+  Done                    exit

(当后台 shell 退出时,由主 shell 打印)。

相关内容