stmというプログラムを実行しています。テキスト「ERROR」を含む stderr メッセージのみをテキスト ファイルに保存したいと考えています。また、コンソールにメッセージが必要です。
bashでそれを行うにはどうすればよいですか?
これは、stdout ではなく stderr をパイプする方法の複製のように見えますか?
stderr を「&1」にリダイレクトします。これは、「stdout と同じ場所」を意味します。次に、stdout を /dev/null にリダイレクトします。次に、通常のパイプを使用します。
$ date -g
date: invalid option -- 'g'
Try `date --help' for more information.
$
$ (echo invent ; date -g)
invent (stdout)
date: invalid option -- 'g' (stderr)
Try `date --help' for more information. (stderr)
$
$ (echo invent ; date -g) 2>&1 >/dev/null | grep inv
date: invalid option -- 'g'
$
上記のコマンドの出力をファイルにコピーするには、> リダイレクトまたは「tee」を使用できます。tee コマンドは、出力の 1 つのコピーをコンソールに出力し、2 番目のコピーをファイルに出力します。
$ stm 2>&1 >/dev/null | grep ERROR > errors.txt
また
$ stm 2>&1 >/dev/null | grep ERROR | tee errors.txt
stderr と stdout の両方をコンソールに表示し、"ERROR" を含む stderr (stdout ではない) のみをファイルに記録したいということですか? エレガントなソリューションを見つけるのが難しいのは、最後の条件です。それがあなたが探しているものなら、ここに私の非常に醜い解決策があります:
touch stm.out stm.err
stm 1>stm.out 2>stm.err & tail -f stm.out & tail -f stm.err & \
wait `pgrep stm`; pkill tail; grep ERROR stm.err > error.log; rm stm.err stm.out
私はそれが醜いことについてあなたに警告しました。関数で非表示にしたり、mktemp を使用して一時的なファイル名を作成したりできます。エラー テキストをファイルに記録する前に stm が終了するのを待ちたくない場合はtail -f stm.err | grep ERROR > error.log &
、他の tail コマンドの後に追加し、削除することができます。最後の行の grep コマンド。