Bash
如果退出命令與不同的命令並行執行,則會話結束
我發現了一種我不理解的 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。
你的第一個命令,
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),然後執行echo foo > /tmp/bar
。所以“主”外殼不會退出並且終端保持打開狀態,這讓您可以看到[2] 13777
其次是
exit
(由退出的外殼列印)然後
[1]+ Done exit
(當後台 shell 退出時由主 shell 列印)。