出力に影響を与えずにstdoutで文字列の存在をどのように検出できますか? [コピー]

出力に影響を与えずにstdoutで文字列の存在をどのように検出できますか? [コピー]

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

おすすめ記事