使用 tail 時抑制“文件被截斷”消息
我正在使用一個日誌文件
tail -f messages.log
,這是輸出的一部分:Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget tellus sit amet odio porttitor rhoncus. Donec consequat diam sit amet tellus viverra pellentesque. tail: messages.log: file truncated Suspendisse at risus id neque pharetra finibus in facilisis ipsum.
它顯示
tail: messages.log: file truncated
文件何時自動截斷並且應該發生,但我只想tail
顯示沒有此截斷消息的輸出。我已經嘗試過使用
tail -f messages.log | grep -v truncated
,但無論如何它都會向我顯示消息。有什麼方法可以抑制這個消息嗎?
該消息像所有警告和錯誤消息一樣在stderr上輸出。
您可以刪除所有錯誤輸出:
tail -f file 2> /dev/null
或僅過濾掉包含以下內容的錯誤消息
truncate
:{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1
但是,這意味著您將失去
tail
. 一些 shell 有一個pipefail
選項(使用 啟用),讓該管道在失敗set -o pipefail
時報告退出狀態。並且還可以在其/數組中報告管道的各個組件的狀態。tail``zsh``bash``$pipestatus``$PIPESTATUS
使用
zsh
orbash
,您可以使用:tail -f file 2> >(grep -v truncated >&2)
但請注意,
grep
不會等待該命令,因此tail
退出後可能會顯示任何錯誤消息,並且 shell 已經開始執行腳本中的下一個命令。在
zsh
中,您可以通過編寫它來解決這個問題:{ tail -f file; } 2> >(grep -v truncated >&2)
這在以下
zsh
文件中進行了討論info zsh 'Process Substitution'
:還有一個問題
>(PROCESS)
; 當它附加到外部命令時,父 shell 不會等待 PROCESS 完成,因此緊隨其後的命令不能依賴於完成的結果。問題和解決方案與註釋 Redirection::中的**MULTIOS部分中描述的相同。因此,在上述範例的簡化版本中:paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
(請注意,不涉及 MULTIOS),就父 shell 而言,PROCESS 將非同步執行。解決方法是:
{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
這裡的額外程序是從等待它們完成的父 shell 產生的。