Как завершить приложение cli, если stdout содержит определенную строку?
У меня есть приложение командной строки, которое выводит много информации на стандартный вывод.
Как я могу завершить программу, когда стандартный вывод содержит определенную строку?
например что-то вроде:
my_program | terminate_if_contains ERROR
Причина, по которой я хочу это сделать, заключается в том, что программа написана третьей стороной и выводит много ошибок в стандартный вывод, но я хочу остановиться на первой ошибке, поэтому мне не нужно ждать, пока программа завершится.
2 ответа
Решение
Пытаться:
my_program | sed '/ERROR/q'
Это печатает все, вплоть до первой строки, содержащей ERROR
, В таком случае, sed
квиты. Вскоре после этого, my_program
получит сигнал об обрыве трубы (SIGPIPE), который приведет к остановке большинства программ.
Вот мое быстрое решение этой проблемы:
Примеры использования:
$ watch_and_kill_if.sh ERROR my_program
watch_and_kill_if.sh
#!/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