web-dev-qa-db-ja.com

テールを使用するときに「ファイルが切り捨てられた」メッセージを抑制します

私は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を使用してみましたが、それでもメッセージが表示されます。

このメッセージを抑制する方法はありますか?

11
Bas Peeters

そのメッセージは、すべての警告およびエラーメッセージと同様に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)
_

ここでの追加のプロセスは、その完了を待機する親シェルから生成されます。

15

grepが出力を取り除かない場合、それはおそらく標準エラーに出力されています。それを取り除く最も簡単な方法は、単にそれをダンプすることです:

tail -f messages.log 2>/dev/null
2
l0b0

このエラーの原因を修正できるかどうかを確認してください。これは、「>>」ではなく「>」を上書きしてファイルに書き込むために発生しました。

1
BG Bruno