¿Cómo repetir un comando cuando hay una cadena específica en un archivo?

¿Cómo repetir un comando cuando hay una cadena específica en un archivo?

Quiero repetir un comando mientras hay una cadena específica en su salida, lo que indica que hubo un error. El comando es gksu ./installer.run > ./inst.log 2>&1 Lo que quiero hacer es repetirlo mientras esté 'string'en ./inst.log. ¿Cómo puedo hacer esto desde una línea de comandos de bash?

Respuesta1

Buscar cadena en un archivo:

grep -q string file

El valor de salida le indica si grep encontró algo.

Luego puede realizar un bucle siempre que un comando devuelva un valor de salida verdadero:

while command ; do
    repeat this
done

Aunque desea ejecutar el comando al menos una vez, tal vez

while true ; do
    some command
    if ! grep -q string file ; then
        break         # jump out of the loop if it's _not_ there
    fi
done

De lo contrario, necesitarás repetir el comando antes del bucle y dentro de él.

Respuesta2

Tenga en cuenta que en while while-cmd-list; do do-cmd-list; done, while-cmd-listestambiénuna lista de comandos. No tiene por qué ser un solo comando.

Entonces puedes hacer:

while
  gksu ./installer.run > ./inst.log 2>&1
  grep -q string inst.log
do
  echo >&2 "Trying again, output contained string"
done

Aunque aquí también puedes hacer:

while
  gksu ./installer.run 2>&1 |
    tee ./inst.log |
    grep string > /dev/null
do
  echo >&2 "Trying again, output contained string"
done

(tenga en cuenta que no estamos usando -q, ya que eso significaría grepque podría salir antes de tiempo y provocar que el instalador reciba un SIGPIPE).

información relacionada