Como repetir um comando quando há uma string específica em um arquivo?

Como repetir um comando quando há uma string específica em um arquivo?

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 grepque poderia sair mais cedo, fazendo com que o instalador recebesse um SIGPIPE).

informação relacionada