Execute um programa X vezes


18

Como executo um programa X vezes no terminal?

Eu li que tenho que fazer um bin / bash txt, mas não sei como executar isso X vezes.


o que é, um script, um aplicativo, o que faz? o que deve acontecer em caso de erros? fecha depois de ser executado? deve ser verificado se está fechado?
Jacob Vlijm

é apenas um clique, clique em xdotool Eu não acho que possa criar um erro.
User3597989

@ KasiyA: Não exatamente como todas essas respostas estão em loop para sempre. Aqui, o OP solicita um número fixo de loops.
Sylvain Pineau

4
Ou o de Blufter: askubuntu.com/a/508752/158442 - mas os dois não pertencem a ele, mas aqui. : D
muru 12/09/14

2
@ KasiyA: A resposta da Ask não deve estar aqui Repita um comando a cada x intervalo de tempo no terminal?
Sylvain Pineau

Respostas:


24

Você pode usar xargse seq. Geralmente:

seq nr_of_times_to_repeat | xargs -Iz command

Por exemplo:

seq 10 | xargs -Iz xdotool click 1

executará o xdotool click 1comando 10 vezes.


11
Esta é provavelmente a solução mais elegante, sem mencionar a mais simples.
Seth

Eu acho que este é realmente um bom exemplo para explicar o caráter do pipe.
PascalVKooten

10

Abra um terminal e use o seguinte bashcomando:

for i in {1..5}; do xdotool click 1; done

Com um pouco de verbosidade e atraso de 1s:

for i in {1..5}; do echo click \#$i && xdotool click 1 && sleep 1; done
click #1
click #2
click #3
click #4
click #5

erro de
sintax

@ user3597989 Funciona para mim, você pode verificar novamente?
Sylvain Pineau

@ user3597989 oh eu sei, por favor remova o primeiro $. Está lá apenas para indicar um prompt de shell como sylvain@sylvain-ThinkPad-T430s:~$. Geralmente, o adicionamos às respostas da linha de comando para diferenciar o comando de seus resultados.
Sylvain Pineau

@ user3597989: Eu removi o shell prompt para confusão evitar
Sylvain Pineau

5

Isso deve fazer:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  x=$(( $x + 1 ))
done

onde 10 é o número de vezes para executar o comando

se você precisar criar uma pequena pausa:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  sleep 1
  x=$(( $x + 1 ))
done

Copie o script em um arquivo vazio, substitua <command to run>pelo seu xdotoolcomando, salve-o como run_xdotool.sh, execute-o pelo comando:

sh /path/to/run_xdotool.sh

Como alternativa, você pode torná-lo executável e simplesmente executá-lo

/path/to/run_xdotool.sh

Outra solução: usando a opção de repetição incorporada do xdotool

Como você menciona usá-lo para fazer cliques, o mais fácil pode ser usar xdotoola própria opção de repetição interna. O formato é:

xdotool click --delay <delay> --repeat <repeats> <button>
(delay in milliseconds between the clicks)

Para fazer 10 cliques do mouse (botão 1) seguidos, com um segundo de intervalo, o comando é:

xdotool click --delay 1000 --repeat 10 1

5

Se você possui o GNU Parallel, você pode executar:

seq 10 | parallel -N0 doit

Todos os novos computadores possuem múltiplos núcleos, mas a maioria dos programas é de natureza serial e, portanto, não usa os múltiplos núcleos. No entanto, muitas tarefas são extremamente paralelizáveis:

  • Execute o mesmo programa em muitos arquivos
  • Execute o mesmo programa para cada linha em um arquivo
  • Execute o mesmo programa para cada bloco em um arquivo

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas às quais você tem acesso ssh.

Se você tiver 32 tarefas diferentes que deseja executar em 4 CPUs, uma maneira direta de paralelizar é executar 8 tarefas em cada CPU:

Programação simples

O GNU Parallel gera um novo processo quando se termina - mantendo as CPUs ativas e economizando tempo:

Programação paralela GNU

Instalação

Uma instalação pessoal não requer acesso root. Isso pode ser feito em 10 segundos, fazendo o seguinte:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Saber mais

Veja mais exemplos: http://www.gnu.org/software/parallel/man.html

Assista aos vídeos de introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Percorra o tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscreva-se na lista de e-mails para obter suporte: https://lists.gnu.org/mailman/listinfo/parallel


11
Eu amo paralelo e tento sugerir seu uso sempre que posso. Uma pergunta à sua opção específica: por que você preferiu sugerir este formulário em vez deparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann 16/02/17

11
O {1..10}não funciona em (t) csh / fish / ash, e a {1..10}construção é limitada pelo comprimento da linha de comando, portanto, isso não funciona: ao {1..1000000000}passo seq 1000000000que funcionará bem. Mas para a maioria das situações {1..10}funcionará como esperado, e eu também uso isso frequentemente.
precisa

4

Você pode usar um forloop de estilo C que tem a vantagem sobre a versão brace-expansion ( {1..5}) de poder usar variáveis ​​para especificar os pontos finais. Qualquer uma das versões é melhor do que usar um utilitário externo ( seq).

t=5
for ((x = 1; x <= t; x++))
do
    xdotool click 1
done

Tudo em uma linha:

t=5; for ((x = 1; x <= t; x++)); do xdotool click 1; done

Ou você pode fazê-lo sem um loop (para este utilitário e função específicos):

xdotool click --repeat 5 --delay 50 1

0

Simplesmente você pode usar o comando watch:

watch -n x <your command>

mude x para o tempo em segundos.

Exemplo:

watch -n 1 xdotool click 1 

Portanto, o xdotool click 1 será repetido a cada 1 s, encerre-o quando terminar.


4
Eu acho que a pergunta é específica sobre a execução do comando um número definido de vezes , não tanto em um intervalo definido.
Jacob Vlijm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.