Eu tenho um script que quero executar a cada x segundos até que a saída seja alterada. Com um loop while ou until simples, eu sei como verificar a saída de uma string específica usando grep, mas o que eu quero fazer é continuar iterando o loop até que a saída da iteração atual não seja igual à saída da iteração anterior.
Como posso conseguir isso no bash?
O mais próximo que cheguei está abaixo, onde o comando é executado duas vezes em cada iteração, mas isso produz execuções extras porque o loop while não consegue lembrar a saída da iteração anterior.
while [ "$(command)" = "$(command)" ]; do sleep 10m; done
De
man 1 watch
:watch
não é exigido pelo POSIX, mas é bastante comum de qualquer maneira. No Debian ou no Ubuntu está noprocps
pacote junto comkill
eps
(e algumas outras ferramentas).Exemplo:
Isso deve fazer o truque - explicações em linha:
Provavelmente existem maneiras mais simples de fazer isso, mas tem alguns recursos úteis:
mktemp
para cada saída.diff
comando veja dois arquivos idênticos. Isso evita duplicar o comando que estamos testando, às custas de umadiff
execução extra.Obviamente,
watch
é o caminho a seguir, conforme descrito em outra resposta . Mas se você quiser ou precisar fazer isso no shell, aqui está uma maneira de fazer isso:"${prev+set}"
expande paraset
seprev
foi definido como um valor após ser desdefinido no início, então, na verdade, força o conteúdo do loop a ser executado pelo menos uma vez. Alternativamente, poderíamos apenas inicializarprev
aoprev=$(some_command)
custo de executarsome_command
um tempo adicional no início do loop.Além disso, conforme observado nos comentários, a substituição de comando remove todas as novas linhas à direita da saída do comando, portanto, se as únicas alterações no resultado forem com essas, isso não poderá diferenciar as saídas. Isso raramente deve importar, no entanto.