
大量の情報を標準出力に出力するコマンドライン アプリがあります。
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