私は何かが間違っているときにエラーメッセージを印刷しますが、それに応じて終了ステータスを設定しないプログラムを使用しています。終了ステータスは常に 0 で、成功を示します。シェルスクリプトでこのプログラムを実行し、エラーメッセージが表示されたら、スクリプトがプログラムに失敗するように指示できるように、ゼロ以外の終了ステータスを取得したいと思います。
エラーメッセージは、一致が見つかったかどうかに応じて終了ステータスを一致させ設定できる予測可能なパターンに従い、grep
プログラムgrep
の出力をここにパイプし、grep
結果を無効にして目的の!
終了ステータスを取得できます。
問題は、パイプで接続するとgrep
できないことです。バラよりプログラムの出力はgrep
消費されたため、もはや存在しません。どういうわけか出力からエラーメッセージを検索したいのですが、エラーに加えて他の重要なメッセージがあるので、出力も正常に表示したいと思います。残念ながら、grep
すべての入力、一致する行、一致しない行を渡すオプションはありません。
私が見つけた一つの方法最大作品は次のとおりです
! my_program | tee /dev/stderr | grep -q "error message"
これはプログラムの出力をstderrに入れますが、grep
stderrにもコピーするので、私が見ることができるようにリダイレクトされません。私のスクリプトのstdoutとstderrの両方がターミナルに送信されても大丈夫です(したがって、どちらがメッセージを受け取るかは問題ではありません)。ただし、stdoutとstderrが別の場所にリダイレクトされると、メッセージが終了する可能性があります。間違った場所。
POSIXシェルとGNUツールを使用してプログラムの標準出力および/または標準エラーストリームをスキャンし、それに応じて終了ステータスを設定し、両方のストリームを通常のターゲットに到達させるbash
(簡潔な)方法はありますか?grep
(my_program
stderrではなくstdoutにエラーメッセージを書き込むので、stdoutストリームのみをスキャンできるソリューションは理想的ではありませんが、問題ありません。違いがある場合はCentOS 7でこれを行っています。)
ベストアンサー1
...grepなどのツールを使用してプログラムのstdoutストリームおよび/またはstderrストリームをスキャンし、それに応じて終了ステータスを設定し、同時に2つのストリームを通常のターゲットに到達させる(簡潔な)方法はありますか?
...my_programは、標準エラーではなく標準出力にエラーメッセージを記録します。標準出力ストリームのみをスキャンするソリューションは問題ありません。しかし、理想的ではありません。
私の解決策は答えた。勇敢な上部です。
最も簡単な方法は次のことだと思いますawk
。
myprogram |
awk 'BEGIN {status = 0} /error message/ {status = 1} 1; END {exit(status)}'
このawk
コマンドは、入力したすべてをそのまま出力しますが、最終的に終了する状態は、「エラーメッセージ」が入力の一部かどうかによって異なります。
簡潔なバージョン(短い変数名):
myprogram | awk 'BEGIN{s=0} /error message/{s=1} 1; END{exit(s)}'