¿Cómo finalizar una aplicación CLI cuando la salida estándar contiene una cadena determinada?

¿Cómo finalizar una aplicación CLI cuando la salida estándar contiene una cadena determinada?

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, sedse da por vencido. Poco después, my_programrecibirá 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

información relacionada