Shell
將命令的輸出通過管道傳輸到 grep,然後再傳輸到另一個命令
我正在獲取一個腳本的輸出,然後將此 putput 傳輸到 grep 並將 grep 的輸出傳輸到另一個腳本:
./script1 | grep 'expr' | ./script2
但是,第二個腳本永遠不會得到任何輸入。同樣,當我
script2
用cat
和script1
替換時,什麼也沒有列印出來ping
:ping localhost | grep localhost | cat
grep
如果我替換為,也會發生同樣的事情awk
:ping localhost|awk '{print $1}'|cat
到底是怎麼回事?
grep
正在緩衝(因為它確定其輸出不是終端;嚴格來說,這是 C 庫的行為)。要禁用此功能,請使用以下命令執行它
unbuffer -p
(從其標準輸入中讀取-p
是必需的):unbuffer
ping localhost | unbuffer -p grep localhost | cat
或告訴
grep
逐行緩衝(如果它支持的話):ping localhost | grep --line-buffered localhost | cat