my_program
診断メッセージをstdoutに印刷するというプログラムがあります。
診断メッセージに文字列が含まれていることを確認し"TEST FAILURE"
、その場合は、プログラムの完了後にいくつかのコマンドを実行したいと思います。
私が見つけた最も近い答えは
if [ !my_program | grep "TEST FAILURE" ]
then
some_cmd
fi
ただし、この方法では、すべての診断メッセージが無音になります。私はまだメッセージを標準出力に表示したいです。何人かの人々はプログラムを使用せずに最初にプログラムをgrep
実行し、次にプログラムを2番目に実行してパイピングすることを提案しますgrep
が、私のプログラムは実行に1時間かかりますので、大きなプログラムを2回実行することを避けたいと思います。
どんなアイデアがありますか?
ベストアンサー1
tee
以下を使用してコマンド出力をgrep
端末に送信できます/dev/tty
。
# Note grep's stdout is redirected to /dev/null
# because we only care about its exit code
if echo foo | tee /dev/tty | grep foo > /dev/null; then
echo OK
fi
POSIXではディレクトリ構造とデバイス:
/dev/tty
各プロセスで、そのプロセスのプロセスグループに関連付けられている制御端末の同義語(存在する場合)。出力のリダイレクト方法に関係なく、端末からメッセージを書き込んだり、端末からデータを読み取るようにしたいプログラムやシェルプロセスに役立ちます。出力を入力する必要があり、現在使用中の端末を見つけるのが難しい場合は、出力ファイル名が必要なアプリケーションでも使用できます。
コマンドの出力をスクリプトの標準出力(ターミナルではない可能性がある)にリダイレクトしたい場合は役に立ちません。
ただし、さらなる処理のためにコマンド出力を保存することができます。
# Save output in a variable (or a regular file, a named pipe, etc.)
output="$(echo foo)"
# Dump output to script's stdout
cat <<< "${output}"
# Check if output matches some pattern
if grep foo <<< "${output}" > /dev/null; then
echo OK
fi