Repetir o comando do terminal até a saída especificada

4

Eu gostaria de definir um apelido que execute um comando a cada x segundos até que um processo subjacente forneça uma saída designada. Então, o comando deve parar de ser executado.

Isso é possível e, em caso afirmativo, como? Ajuda é muito apreciada.

Estou quase satisfeito com

alias test1='while true; do <command>; sleep 1; done'

exceto que tenho que pará-lo manualmente e, portanto, não posso fazer com que ele execute um novo comando quando terminar.

O motivo da pergunta: Dropbox sincroniza mal no trabalho. Às vezes, tenho que reiniciá-lo. Eu gostaria de fazer isso usando um comando que também informa quando a sincronização é feita, por exemplo, por

alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'

Eu gostaria que a repetição fosse interrompida quando o Dropbox mostrasse 'Atualizada'.

    
por Rasmus 23.02.2016 / 09:41

3 respostas

3

Definir uma condição para o loop while

Se você substituir

while true

por:

while [ "$(dropbox status)" != "Up to date" ]

funciona como você descreve.

O comando

Para parar / iniciar Dropbox e terminar após a conclusão da sincronização:

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do dropbox status; sleep 1; done

Ou melhor (para evitar o dobro de dropbox status ):

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do echo "Updating"; sleep 1 ; done && echo "Finished"

Explicação

while true está aguardando uma condição de quebra dentro do loop (que nunca aparece), mas while [ "$(dropbox status)" != "Up to date" faz o loop quebrar se dropbox status retornar Up to date

    
por Jacob Vlijm 23.02.2016 / 10:03
4

Como Jacob diz, use a condição no loop. Sugiro um loop until :

dropbox stop && dropbox start && 
until dropbox status | grep -q "Up to date";
do 
  sleep 1; 
done

until é executado até o comando retornar verdadeiro, quando dropbox status output contém Up to date .

    
por muru 23.02.2016 / 11:36
1

Defina-o como uma função no seu $HOME/.bashrc

syncDropBox()
{
dropbox stop && \
dropbox start && 
while true; 
do 
  STAT="$(dropbox status)"
  if [ "$STAT" = "Up to date"  ] ; then
  break # or add more commands to finilize the process
  fi
  sleep 1; 
done
}

Agora, não tenho o aplicativo dropbox cmd, portanto, dependendo da maneira como ele gera o status, você pode ou não processá-lo com AWK ou grep .

Mas o ponto é que você pode armazenar a saída no valor ou redirecionar a saída para outro comando e avaliá-los. Quando tivermos uma string de saída específica - break

    
por Sergiy Kolodyazhnyy 23.02.2016 / 10:03