Pipe
為什麼“tail -f … | tail”無法產生任何輸出?
為什麼以下命令不產生任何輸出?
$ tail -f /etc/passwd | tail
在閱讀了有關緩衝後,我嘗試了以下方法無濟於事:
$ tail -f /etc/passwd | stdbuf -oL tail
請注意,以下內容確實會產生輸出:
$ tail /etc/passwd | tail
這樣做也是如此:
$ tail -f /etc/passwd | head
我正在使用尾部版本 8.21(GNU coreutils)。
tail -f
的尾巴,其實是目前不為人知的東西,接下來應該怎麼tail
知道。另一方面tail -f
,頭部是已知的,因此可以進行處理。或者更簡單地說:
tail
是相對於文件的結尾,但是tail -f
沒有得到 EOF 的輸出流(至少在它終止之前沒有)。如果你找到第一個
tail
的 pid 並殺死它,你應該會看到第二個的輸出。
技術解答
當以流作為輸入執行時,
tail
保留一個n
在讀取流時填充的 -line 緩衝區,但在到達流的末尾之前它不能輸出這些行,即它EOF
在嘗試從輸入中讀取時接收到一個特殊程式碼溪流。呼叫tail -f
不會退出,因此它永遠不會關閉其流,這使得無法返回該流的最後 10 行。