Bash
困惑為什麼腳本不退出
我有這個腳本逐字:
#!/usr/bin/env bash handle_json(){ while read line; do cat <<EOF {"@json-stdio":true,"value":{"mark":"$1","v":"$line"}} EOF done; } ( echo; echo; echo 'du results:'; exit 0 ) > >(handle_json foo); echo "zoom"
當我執行它時,我得到了這個:
我必須用 ctrl-C 手動殺死它,因為它不會自行退出。
我要做的就是將 subshell 的標準輸出發送到 bash 函式,以便它對輸出進行 JSON 字元串化(現在不用擔心轉義特殊字元)。
有人知道為什麼這個腳本不能自行退出嗎?
更新:
這實際上做了我想要它做的事情:
( echo; echo; echo 'du results'; ) | handle_json 'foo'; echo "zoom"
以上使用管道運算符而不是重定向/處理替換。我從沒想過管道操作員會在這里工作。有人可以解釋它為什麼/如何工作嗎?
據我所知,您的腳本確實退出了;只是在外殼列印其提示後,程序替換完成了在後台執行和列印。
避免這種情況的一種方法是簡單地通過管道輸入您的函式,而不是使用
> >(...)
:( echo; echo; echo 'du results:'; exit 0 ) | handle_json foo
這是因為,在編寫 時
cmd1 | cmd2
,兩個命令並行啟動,標準輸出cmd1
連接到 的標準輸入cmd2
,而bash 等待兩者都完成以認為管道已完成。相比之下,
cmd1 > >(cmd2)
幾乎相同,除了 bash 在繼續執行其他命令之前不會等待cmd2
完成(在這種情況下,列印“zoom”然後退出,讓互動式 bash 列印其提示):如果偶然,cmd2
完成比 花費的時間要多得多cmd1
,然後您觀察到的那種令人驚訝的競爭條件就會發生。