
Tengo una aplicación de línea de comandos que genera mucha información en la salida estándar.
¿Cómo puedo finalizar el programa cuando la salida estándar contiene una cadena determinada?
por ejemplo, algo como:
my_program | terminate_if_contains ERROR
La razón por la que quiero hacer esto es porque el programa está escrito por un tercero y genera muchos ERRORES en la salida estándar, pero quiero detenerme en el primer error, para no tener que esperar hasta que finalice el programa.
Respuesta1
Intentar:
my_program | sed '/ERROR/q'
Esto imprime todo hasta la primera línea que contiene ERROR
. En ese momento, sed
se da por vencido. Poco después, my_program
recibirá una señal de tubería rota (SIGPIPE) que provocará que la mayoría de los programas se detengan.
Respuesta2
Aquí está mi solución rápida a este problema:
Ejemplos de uso:
$ watch_and_kill_if.sh ERROR my_program
ver_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