私は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
の終了ステータスを失うことを意味します。いくつかのシェルには、パイプラインが失敗した場合にpipefail
の終了ステータスを報告するtail
オプション(_set -o pipefail
_で有効化)があります。 zsh
およびbash
は、_$pipestatus
_/_$PIPESTATUS
_配列でパイプラインの個々のコンポーネントのステータスを報告することもできます。
zsh
またはbash
では、以下を使用できます。
_tail -f file 2> >(grep -v truncated >&2)
_
ただし、grep
コマンドは待機されないため、tail
が終了し、シェルがスクリプト内の次のコマンドの実行を開始した後に、エラーメッセージが表示される場合があることに注意してください。
zsh
では、次のように記述することで対処できます。
_{ tail -f file; } 2> >(grep -v truncated >&2)
_
これについては、_info zsh 'Process Substitution'
_のzsh
ドキュメントで説明されています。
>(PROCESS)
にはさらに問題があります。これが外部コマンドにアタッチされている場合、親シェルはPROCESSが終了するのを待たないため、直後のコマンドは完了した結果に依存できません。問題と解決策は、セクション[〜#〜] multios [〜#〜]note Redirection ::で説明されているものと同じです。したがって、上記の例の簡略化されたバージョンでは:_paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
_(MULTIOSは関与しないことに注意してください)、PROCESSは親シェルに関する限り非同期で実行されます。回避策は次のとおりです。
_{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
_ここでの追加のプロセスは、その完了を待機する親シェルから生成されます。
grep
が出力を取り除かない場合、それはおそらく標準エラーに出力されています。それを取り除く最も簡単な方法は、単にそれをダンプすることです:
tail -f messages.log 2>/dev/null
このエラーの原因を修正できるかどうかを確認してください。これは、「>>」ではなく「>」を上書きしてファイルに書き込むために発生しました。