Estou tentando descobrir uma maneira simples de continuar reexecutando um comando sempre que ele for concluído, por qualquer motivo (erro ou não).
Qual seria a melhor maneira de abordar isso?
Edição: Eu não estava claro o suficiente antes. Preciso que a próxima execução aguarde até a anterior terminar.
EDIT 2: Quase todas as respostas funcionam muito bem. Eu pensei erroneamente que a maioria das respostas iria bifurcar o processo ou executá-lo apenas uma vez, nenhuma das quais é desejada.
Respostas:
Isso cria um loop infinito, executando
command
repetidamente.fonte
while true; do echo 'Hit CTRL+C'; sleep 1; done
graças a cyberciti.biz/faq/bash-infinite-loopO
watch
comando repetirá um comando para sempre com um intervalo especificado:Definir
-n
zero efetivamente coloca o intervalo em nada (acho que são realmente 0,1 segundos).watch
também possui os benefícios adicionais de alinhar a saída para que as alterações visuais possam ser vistas facilmente e possui uma opção para destacar as alterações da última execução.Referência: a página do manual do relógio :
fonte
watch ls
em um diretório que contém arquivos, não recebe nada?Uma solução simples seria:
;
separa comandos, permitindo vários comandos em uma linha ( Bash: Lists )!#
diz ao bash para "repetir tudo o que escrevi até agora nesta linha" ( Bash: Designadores de Eventos )fonte
yourcommand; !!
, na verdade, não funciona com comandos na mesma linha,!#
parece funcionar. Felicidades!; !#
não funcionou no ZSH, apenas expande a declaração essencialmente cloná-lo, não provocá-loVocê pode planejar com antecedência durante a execução do comando (desde que não seja interativo) e inserir o
!!
que executará o comando anterior novamente. Isso funciona, por exemplo, duranteping -c 5
.Você também pode definir uma função em
bash
:Para persistir, armazene-o
~/.bashrc
.Em seguida, você pode executar seu comando assim:
Se é um comando específico que você deseja executar repetidamente (e não, por exemplo, qualquer comando), você pode substituir
"$@"
esse trecho pelo seu comando real e nomear a função, por exemplorepeat_ping
.Para torná-lo um loop infinito, você pode fazer o que @Dennis sugere. Eu recomendo que você adicione um período de espera se você pretende usá-lo em um shell interativo, como este:
Caso contrário, é bastante inconveniente abortar esse loop infinito usando
Ctrl-Z
.fonte
Dê a um
while
loop uma condição booleana, como a seguir:Isso será executado repetidamente até que o bash receba um sinal para finalizar o processo. Geralmente na forma de
ctrl+c
.Você também pode usar o
watch
comando para executar um script repetidamente também. Por exemplo, um relógio simples no seu terminal bash usandowatch
pode se parecer com:A
-t
opção informawatch
para não exibir um título do processo que está sendo executado. Isso fornece uma saída limpa apenas do comando que está sendo repetido. A-n1
opção informa ao relógio para repetir a cadan
segundo. Nesse caso,-n1
haverá intervalos de1
segundo. Em seguida, odate +%T
comando mostra a hora no momento da conclusão do comando. Ao executar este comando, você terá um relógio ativo no seu terminal.E então mais um método que não está em nenhuma das outras respostas seria uma chamada de função infinita.
É essencialmente o mesmo que o
while
loop booleano, usando apenas chamadas de função recursivas.(edit) Para manter os recursos da sua máquina em mente, eu adicionei o
&& wait
para que, sempre que um processo for executado, os loops "aguardem" até que o processo termine com o status de saída 0 antes da próxima iteração. Isso é útil em um script de shell interativo.fonte
while
exemplo de loop, mas ele não está usando umatrue
sintaxe booleana . Há umwatch
exemplo, mas ele não fornece muitas sintaxes úteis. Estou explicando isso para quem puder ajudar. Eu queria dar alguma utilidade prática a eles. Owhile
loop booleano também pode serfalse
e não ser executado até que uma condição falsa seja atendida. É bastante útil.if
continuar reexecutando?if
instrução.Este é outro método que eu uso para repetir um comando no bash. Para alguns, isso pode parecer bobo, pois não envolve escrever um script e pode ser conhecido por muitos. Mas acho que vale a pena mencionar, pois é rápido e fácil para iniciantes, no sentido de que não há muita sintaxe para lembrar. Eu só testei isso no gnome-terminal do Ubuntu e outros terminais podem não suportar isso.
Você não precisa esperar para colar até que cada comando termine. Os comandos colados entram em uma fila e são executados um após o outro.
fonte
Estou me sentindo mal hoje.
Leia de um dos fluxos infinitos e canalize-o para
xargs
Se você precisar fazer uma pequena pausa, provavelmente precisará executar
sh
fonte