stdout に特定の文字列が含まれている場合に CLI アプリを終了するにはどうすればよいでしょうか?

stdout に特定の文字列が含まれている場合に CLI アプリを終了するにはどうすればよいでしょうか?

大量の情報を標準出力に出力するコマンドライン アプリがあります。

stdout に特定の文字列が含まれている場合にプログラムを終了するにはどうすればよいですか?

例えば次のようになります:

my_program | terminate_if_contains ERROR

これを実行する理由は、プログラムがサードパーティによって作成され、stdout に多数のエラーを出力するが、プログラムが終了するまで待たずに最初のエラーで停止したいからです。

答え1

試す:

my_program | sed '/ERROR/q'

これは、 を含む最初の行までのすべてを出力しますERROR。その時点で、sedは終了します。その後すぐに、 はmy_program壊れたパイプ信号 (SIGPIPE) を受信し、ほとんどのプログラムが停止します。

答え2

この問題に対する私の簡単な解決策は次のとおりです。

使用例:

$ watch_and_kill_if.sh ERROR my_program

ウォッチアンドキル

#!/usr/bin/env bash

function show_help()
{
  IT=$(CAT <<EOF

  usage: ERROR_STR YOUR_PROGRAM

  e.g. 

  this will watch for the word ERROR coming from your long running program

  ERROR my_long_running_program
EOF
  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$2" ]
then
  show_help
fi

ERR=$1
shift;

$* |
  while IFS= read -r line
  do
    echo $line
    if [[ $line == *"$ERR"* ]]
    then
      exit;
    fi
  done

    if [ "$1" == "help" ]
    then
      show_help
    fi
    if [ -z "$2" ]
    then
      show_help
    fi

    ERR=$1
    shift;

    $* |
      while IFS= read -r line
      do
        echo $line
        if [[ $line == *"$ERR"* ]]
        then
          exit;
        fi
      done

関連情報