Bash

困惑為什麼腳本不退出

  • December 22, 2018

我有這個腳本逐字:

#!/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 手動殺死它,因為它不會自行退出。

我要做的就是將 subshel​​l 的標準輸出發送到 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連接到 的標準輸入cmd2bash 等待兩者都完成以認為管道已完成。

相比之下,cmd1 > >(cmd2)幾乎相同,除了 bash 在繼續執行其他命令之前不會等待cmd2完成(在這種情況下,列印“zoom”然後退出,讓互動式 bash 列印其提示):如果偶然,cmd2完成比 花費的時間要多得多cmd1,然後您觀察到的那種令人驚訝的競爭條件就會發生。

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