碰到一個意外的bash
/sh
行爲,我想知道有人可以解釋它背後的基本原理,併爲下面的問題提供解決方案。當執行單個命令時,Bash'吞嚥'子shell子進程
在交互式bash
shell會話,我執行:
$ bash -c 'sleep 10 && echo'
隨着ps
在Linux上看起來是這樣的:
\_ -bash \_ bash -c sleep 10 && echo \_ sleep 10
進程樹是我所期望的:
- 我互動的bash shell進程(
$
) - 一個孩子shell進程(
bash -c ...
) - 睡眠的孩子處理
但是,如果我bash -c
的命令部分是單命令,例如:
$ bash -c 'sleep 10'
然後,中間子外殼被吞噬,並且當兒童處理時,我的交互式終端會話「直接」執行睡眠。 進程樹是這個樣子:
\_ -bash \_ sleep 10
所以從進程樹的角度來看,這兩個產生相同的結果:
$ bash -c 'sleep 10'
$ sleep 10
這是怎麼回事在這?
現在我的問題:有沒有辦法強制中間殼,無論表達式的複雜度傳遞給bash -c ...
?
(我可以追加類似; echo;
到我的實際命令和「作品」,但我寧願不有沒有更合適的方式來迫使中間過程產生了。?)
(編輯:錯字在ps
輸出;去除sh
標籤在評論建議;多一個錯字)
爲什麼你會*不*希望這種優化時,它的可能嗎? –
在用戶可以傳遞任意命令的環境中處理子進程時,主要確保一致的行爲。我不確定繞過這個優化是我的解決方案(我遇到的實際問題必須處理sudo的更改:https://stackoverflow.com/a/34376188)。但是這種行爲很有趣,我想了解更多。 – Marco
偉大的問題。你的意思是說你在第一個ps樹的第2行用'\ _ bash -c sleep 10 && echo'代替'\ _ bash -c sleep 10 && sleep 10'嗎? – codeforester