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

3

Eu quero repetir um comando enquanto houver uma string específica em sua 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 houver 'string' em ./inst.log . Como posso fazer isso a partir de uma linha de comando bash?

    
por Weylyn Savan 28.04.2017 / 10:49

2 respostas

3

Encontre uma string em um arquivo:

grep -q string file

O valor de saída informa se o grep encontrou alguma coisa.

Depois, você pode fazer o loop desde que um comando retorne um verdadeiro valor de saída:

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.

    
por 28.04.2017 / 11:03
4

Note que em while while-cmd-list; do do-cmd-list; done , while-cmd-list é também uma 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 que grep poderia sair antes, fazendo com que o instalador recebesse um SIGPIPE).

    
por 28.04.2017 / 11:30