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.