Pipe

為什麼“tail -f … | tail”無法產生任何輸出?

  • September 12, 2020

為什麼以下命令不產生任何輸出?

$ 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 行。

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