Как завершить приложение cli, если stdout содержит определенную строку?

279
Brad Parks

У меня есть приложение командной строки, которое выводит много информации на стандартный вывод.

Как я могу завершить программу, когда стандартный вывод содержит определенную строку?

например что-то вроде:

my_program | terminate_if_contains ERROR 

Причина, по которой я хочу это сделать, заключается в том, что программа написана третьей стороной и выводит много ошибок в стандартный вывод, но я хочу остановиться на первой ошибке, поэтому мне не нужно ждать, пока программа не завершится.

1

2 ответа на вопрос

1
Brad Parks

Вот мое быстрое решение этой проблемы:

Примеры использования:

$ 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 
1
John1024

Пытаться:

my_program | sed '/ERROR/q' 

Это печатает все до и включая первую строку, содержащую ERROR. В этот момент sedвыходит. Вскоре после этого my_programбудет получен сигнал о разрыве канала (SIGPIPE), который приводит к остановке большинства программ.

отлично! Я не знал об этой опции `/ q` ... круто! Brad Parks 7 лет назад 1