Esegui un programma X volte


18

Come eseguo un programma X volte nel terminale?

Ho letto che devo fare un bin / bash txt, ma non so come eseguire questa X volte.


che cos'è, uno script, un'applicazione, che cosa fa? cosa dovrebbe succedere in caso di errori? si chiude dopo l'esecuzione? dovrebbe essere controllato se ha chiuso?
Jacob Vlijm,

è solo un clic, clic xdotool Non credo che possa creare un errore.
user3597989,

@KasiyA: Non esattamente come tutte quelle risposte sono in loop per sempre. Qui l'OP richiede un numero fisso di loop.
Sylvain Pineau,

4
O Blufter: askubuntu.com/a/508752/158442 - ma entrambi non appartengono a questo, ma qui. : D
muru,

2
@KasiyA: la risposta di Ask non dovrebbe essere qui in Ripeti un comando ogni x intervallo di tempo nel terminale?
Sylvain Pineau,

Risposte:


24

Puoi usare xargseseq . Generalmente:

seq nr_of_times_to_repeat | xargs -Iz command

Per esempio:

seq 10 | xargs -Iz xdotool click 1

eseguirà il xdotool click 1comando per 10 volte.


1
Questa è probabilmente la soluzione più elegante, per non parlare della più semplice.
Seth,

Penso che questo sia davvero un buon esempio per spiegare il personaggio della pipa.
PascalVKooten,

10

Apri un Terminale e usa il seguente bashcomando:

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

Con un po 'di verbosità e ritardo di 1 secondo:

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

errore di sintassi con 'do' ..
user3597989

@ user3597989 Funziona per me, puoi controllare di nuovo?
Sylvain Pineau,

@ user3597989 oh lo so, per favore rimuovi il primo $. È lì solo per indicare un prompt della shell come sylvain@sylvain-ThinkPad-T430s:~$. Di solito lo aggiungiamo alle risposte della riga di comando per differenziare il comando dai suoi risultati.
Sylvain Pineau,

@utente3597989: ho rimosso il prompt della shell per evitare confusione
Sylvain Pineau,

5

Questo dovrebbe fare:

#!/bin/bash

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

dove 10 è il numero di volte per eseguire il comando

se hai bisogno di costruire in una piccola pausa:

#!/bin/bash

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

Copia lo script in un file vuoto, sostituiscilo <command to run>con il tuo xdotoolcomando, salvalo come run_xdotool.sh, eseguilo con il comando:

sh /path/to/run_xdotool.sh

In alternativa, puoi renderlo eseguibile e semplicemente eseguirlo

/path/to/run_xdotool.sh

Un'altra soluzione: usare l'opzione di ripetizione integrata di xdotool

Dato che dici di usarlo per fare clic, il più semplice potrebbe essere usare xdotoolla propria opzione di ripetizione integrata. Il formato è:

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

Per eseguire 10 clic del mouse (pulsante 1) in una riga, tra un secondo, il comando è:

xdotool click --delay 1000 --repeat 10 1

5

Se hai GNU Parallel puoi eseguire:

seq 10 | parallel -N0 doit

Tutti i nuovi computer dispongono di più core, ma la maggior parte dei programmi è di natura seriale e pertanto non utilizzerà più core. Tuttavia, molte attività sono estremamente parallelizzabili:

  • Esegui lo stesso programma su molti file
  • Esegui lo stesso programma per ogni riga di un file
  • Esegui lo stesso programma per ogni blocco in un file

GNU Parallel è un parallelizzatore generale e semplifica l'esecuzione di lavori in parallelo sulla stessa macchina o su più macchine a cui hai accesso ssh.

Se hai 32 lavori diversi che vuoi eseguire su 4 CPU, un modo semplice per parallelizzare è quello di eseguire 8 lavori su ogni CPU:

Pianificazione semplice

GNU Parallel invece genera un nuovo processo al termine - mantenendo attive le CPU e risparmiando tempo:

GNU Programmazione parallela

Installazione

Un'installazione personale non richiede l'accesso come root. Si può fare in 10 secondi facendo questo:

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

Per altre opzioni di installazione consultare http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Per saperne di più

Vedi altri esempi: http://www.gnu.org/software/parallel/man.html

Guarda i video introduttivi: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Segui il tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Iscriviti alla lista e-mail per ottenere supporto: https://lists.gnu.org/mailman/listinfo/parallel


1
Adoro il parallelo e cerco di suggerirne l'utilizzo ovunque possibile. Una domanda però alla tua opzione specifica: perché hai preferito suggerire questo modulo invece diparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann

1
Il {1..10}non funziona in (t) csh / pesce / cenere, e il {1..10}costrutto è limitata dalla lunghezza della linea di comando, quindi questo non funzionerà: {1..1000000000}che seq 1000000000funziona bene. Ma per la maggior parte delle situazioni {1..10}funzionerà come previsto, e spesso lo uso anche io.
Ole Tange,

4

È possibile utilizzare un forloop in stile C che presenta il vantaggio rispetto alla versione di espansione del controvento ( {1..5}) di poter utilizzare le variabili per specificare i punti finali. Entrambe le versioni sono migliori dell'utilizzo di un'utilità esterna ( seq).

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

Tutto su una riga:

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

Oppure potresti essere in grado di farlo senza un ciclo (per questa specifica utilità e funzione):

xdotool click --repeat 5 --delay 50 1

0

Semplicemente puoi usare il comando watch:

watch -n x <your command>

cambia da x a tempo in secondi.

Esempio :

watch -n 1 xdotool click 1 

Quindi xdotool click 1 verrà ripetuto ogni 1 s, terminandolo al termine.


4
Penso che la domanda sia specifica nell'esecuzione del comando un numero definito di volte , non tanto a un intervallo definito.
Jacob Vlijm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.