
Quero repetir um comando enquanto houver uma string específica na saída, o que indica que houve um erro. O comando é gksu ./installer.run > ./inst.log 2>&1
O que eu quero fazer é repeti-lo enquanto estiver 'string'
no arquivo ./inst.log
. Como posso fazer isso a partir de uma linha de comando do bash?
Responder1
Encontre string em um arquivo:
grep -q string file
O valor de saída informa se o grep encontrou alguma coisa.
Então você pode fazer um loop desde que um comando retorne um valor de saída verdadeiro:
while command ; do
repeat this
done
Embora você queira executar o comando pelo menos uma vez, talvez
while true ; do
some command
if ! grep -q string file ; then
break # jump out of the loop if it's _not_ there
fi
done
Caso contrário, você precisará repetir o comando antes do loop e dentro dele.
Responder2
Observe que em while while-cmd-list; do do-cmd-list; done
, while-cmd-list
étambémuma lista de comandos. Não precisa ser um único comando.
Então você pode fazer:
while
gksu ./installer.run > ./inst.log 2>&1
grep -q string inst.log
do
echo >&2 "Trying again, output contained string"
done
Embora aqui, você também possa fazer:
while
gksu ./installer.run 2>&1 |
tee ./inst.log |
grep string > /dev/null
do
echo >&2 "Trying again, output contained string"
done
(observe que não estamos usando -q
, pois isso significaria grep
que poderia sair mais cedo, fazendo com que o instalador recebesse um SIGPIPE).