[英]In a bash script, how can I tell if the script output is redirected to a file?
[英]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
。
在第二個命令中, grep
到cat
管道的輸出是行緩沖的,因此您應該看到每行的終端輸出,即或多或少的連續輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.