私はテールログファイルを使用しています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 でパイプラインのさまざまなコンポーネントの状態を報告することもできます。tail
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)
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)
ここの追加プロセスは、親シェルで作成され、完了するまで待ちます。