簡體   English   中英

bash標准輸出無法重定向到文件

[英]bash standard output can not be redirected into file

我正在閱讀“高級bash腳本”,在第31章中有問題。 我想不明白。

tail -f /var/log/msg | grep 'error' >> logfile

為什么什么都沒有輸出到日志文件?
你能給我一個解釋嗎? 先感謝您

正如@chepner所評論的那樣, grep使用更大的緩沖區(也許4k或更多)來緩沖其stdout。 管道或重定向到文件時,大多數標准實用程序都會執行此操作。 它們通常僅在直接輸出到終端時才切換到行緩沖模式。

您可以使用stdbuf實用程序強制grep對輸出進行行緩沖:

tail -f /var/log/msg | stdbuf -oL grep 'error' >> logfile

為了容易觀察到這種效果,您可以嘗試以下兩個命令:

for ((i=0;;i++)); do echo $i; sleep 0.001; done | grep . | cat

for ((i=0;;i++)); do echo $i; sleep 0.001; done | stdbuf -oL grep . | cat

在第一個命令中, grep .的輸出grep . (即匹配所有行)緩沖進入管道到cat 在我看來,緩沖區大約為4k。 隨着緩沖區被填充然后刷新,您將看到升序輸出的數據chunks

在第二個命令中, grepcat管道的輸出是行緩沖的,因此您應該看到每行的終端輸出,即或多或少的連續輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM