
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-list
estambié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 grep
que podría salir antes de tiempo y provocar que el instalador reciba un SIGPIPE).