tailを使用するときに「ファイルを切り捨てる」メッセージを抑制します。

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が、まだメッセージが表示されます。

このメッセージを表示しない方法はありますか?

答え1

このメッセージは次の形式で出力されます。標準エラーすべての警告とエラーメッセージと同じです。

すべてのエラー出力を削除できます。

tail -f file 2> /dev/null

または、以下を含むエラーメッセージのみをフィルタリングしますtruncate

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

ただし、これは終了ステータスが失われることを意味しますtail。一部のシェルには、パイプにpipefail障害が発生したときに終了ステータスを報告するオプション(有効化を使用)がありますset -o pipefail。また、/array でパイプラインのさまざまなコンポーネントの状態を報告することもできます。tailzshbash$pipestatus$PIPESTATUS

zshまたはを使用すると、bash次のようになります。

tail -f file 2> >(grep -v truncated >&2)

grepただし、コマンドは待たないため、終了後にエラーメッセージ(存在する場合)が表示されることがあり、シェルはスクリプトで次のコマンドの実行を開始しました。tail

では、zsh以下を作成してこの問題を解決できます。

{ tail -f file; } 2> >(grep -v truncated >&2)

zshこれについてはマニュアルで説明していますinfo zsh 'Process Substitution'

追加の問題があります>(PROCESS)。外部コマンドに接続すると、親シェルはPROCESSが完了するのを待たないため、後続のコマンドが完了する結果に依存することはできません。問題と解決方法は第1章で説明したものと同じです。多数存在するリダイレクトに注意してください::。したがって、上記の例の単純化されたバージョンでは次のようになります。

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(MULTIOS は関係ありません。) PROCESS は、親シェルに関する限り、非同期で実行されます。解決策は次のとおりです。

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

ここの追加プロセスは、親シェルで作成され、完了するまで待ちます。

答え2

これはファイルの内容が原因で発生します。

上書き>- 追加されたコンテンツはありません。>>

答え3

出力が削除されないと、grep標準エラーで印刷される可能性が高くなります。これを取り除く最も簡単な方法は、単に捨てることです。

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

関連情報