私はstdoutとstderrに出力するプログラムを持っていますが、正しい方法でそれらを使用していません。いくつかのエラーはstdoutに行きます、いくつかはstderrに行きます、エラー以外のものはstderrに行き、stdoutに関する多くの情報を表示します。私が行うためのパイプラインを作りたい、この修正するには:ファイル$logfile
にstdoutとstderr io-redirectionを使用してプログラムから正常なエラー/警告メッセージを出力するにはどうすればよいですか?
- 保存(標準エラー出力と標準出力の両方から)
$cmd
のすべての出力を(それを画面に印刷されません)。 - stderrとstdout(警告|エラーから空行まで)のすべての警告とエラーメッセージを除外し、 "エラー"ワードのみを色付けします(出力をstderrにリダイレクトします)。
- ステップ2の出力をファイル
$logfile:r.stderr
に保存します。 - コマンドから正しい終了コードを使用して終了します。私は多くのことを試みたが、それは仕事を得ることができない
$!/bin/zsh # using zsh 4.2.0 setopt no_multios # Don't error out if sed or grep don't find a match: alias -g grep_err_warn="(sed -n '/error\|warning/I,/^$/p' || true)" alias -g color_err="(grep --color -i -C 1000 error 1>&2 || true)" alias -g filter='tee $logfile | grep_err_warn | tee $logfile:r.stderr | color_err' # use {} around command to avoid possible race conditions: { eval $cmd } 2>&1 | filter exit $pipestatus[1]
:
は、これまでのところ、私はこれを持っています。 $cmd
が呼び出すシェルスクリプトです:
- のみ標準入力フィルタ
注意に入る:私は私の問題は、現在あるなど、「Zシェルにバッシュから」多くの記事を読みました接頭辞は/usr/bin/time -p
です。これはパイプラインの問題を引き起こすと思われるので、すべての出力がパイプに入る{…}
にコマンドをラップします。
'{eval $ cmd}'はzshで動作します。 '$ logfile'は' filter 'エイリアス。 – Gilles
Doah、それを指摘してくれてありがとう。 – shellter