我有一个命令行应用程序,可以向标准输出输出大量信息。
当标准输出包含某个字符串时,如何终止程序?
例如:
my_program | terminate_if_contains ERROR
我想要这样做的原因是该程序是由第三方编写的,并向标准输出输出大量错误,但我想在第一个错误时停止,所以我不必等到程序完成。
答案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