我发现了我不理解的 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 打印)。