Como executar o mesmo comando “X” várias vezes com um atraso de alguns segundos? [duplicado]

13

Eu sei como executar vários comandos ao mesmo tempo, mas agora o que eu preciso é executar o mesmo comando várias vezes com algum atraso entre a execução do comando.

Requisitos

  • Eu não quero usar um script para isso
  • Um único comando de uma linha para realizar isso
  • Precisa ser executado no Linux
  • Precisa controlar o número de vezes que o comando será executado
por Özzesh 22.11.2013 / 07:17

3 respostas

23

Você pode usar este forro para fazer o que está perguntando:

$ cmd="..some command..."; for i in $(seq 5); do $cmd; sleep 1; done

Exemplo

$ date
Fri Nov 22 01:37:43 EST 2013

$ cmd="echo"; for i in $(seq 5); do $cmd "count: $i"; sleep 1;done
count: 1
count: 2
count: 3
count: 4
count: 5

$ date
Fri Nov 22 01:37:51 EST 2013

Você pode ajustar o sleep ... para o atraso que quiser entre os comandos e alterar cmd=... para o comando que quiser.

Expansões de contraventamentos vs. seq cmd

Você também pode usar expansões de chaves em vez do comando seq para gerar intervalos de valores. Isso é um pouco mais eficiente, já que as expansões de chaves serão executadas no mesmo shell que o loop for . Usar o subshell ( $(seq ..) ) é um pouco menos eficiente, já que está gerando um subshell dentro dos limites do shell que o loop for está executando.

Exemplo

$ cmd="echo"; for i in {1..5}; do $cmd "count: $i"; sleep 1;done
count: 1
count: 2
count: 3
count: 4
count: 5
    
por 22.11.2013 / 07:40
13

com zsh :

repeat 10 {date; sleep 5}

Isso executa os comandos (aqui date como exemplo) com um intervalo de 5 segundos entre eles.

Se, em vez disso, você quiser executá-lo a cada 5 segundos (e supondo que o comando leve menos de 5 segundos para ser executado):

typeset -F SECONDS=0; repeat 10 {date; ((n=5-SECONDS)); SECONDS=0; LC_ALL=C sleep $n}

(Supondo uma implementação sleep que suporte segundos fracionários).

    
por 22.11.2013 / 11:54
5

Isso executa o comando date por 10 vezes com um retardo de 5 segundos. Altere o 10 em seq 1 10 para o número de vezes que você deseja, substitua date pelo comando desejado e altere o 5 em sleep 5 para alterar o tempo de atraso.

for d in $(seq 1 10); do date; sleep 5; done;
    
por 22.11.2013 / 07:40