8

stmというプログラムを実行しています。テキスト「ERROR」を含む stderr メッセージのみをテキスト ファイルに保存したいと考えています。また、コンソールにメッセージが必要です。

bashでそれを行うにはどうすればよいですか?

4

3 に答える 3

2

これは、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
于 2013-05-01T20:57:15.987 に答える
0

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 コマンド。

于 2013-05-01T23:02:37.113 に答える