Bash

如果退出命令與不同的命令並行執行,則會話結束

  • December 9, 2016

我發現了一種我不理解的 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 列印)。

引用自:https://unix.stackexchange.com/questions/329308