Exécuter un programme X fois

18

Comment exécuter un programme X fois dans le terminal?

J'ai lu que je dois faire un txt bin / bash, mais je ne sais pas comment exécuter ce X fois.

user3597989
la source
qu'est-ce qu'un script, une application, que fait-il? que doit-il se passer en cas d'erreur? ferme-t-il après avoir couru? faut-il vérifier s'il a fermé?
Jacob Vlijm
c'est juste un clic, cliquez sur xdotool Je ne pense pas que cela puisse créer une erreur.
user3597989
@KasiyA: Pas exactement car toutes ces réponses sont en boucle pour toujours. Ici, l'OP demande un nombre fixe de boucles.
Sylvain Pineau
4
Ou Blufter: askubuntu.com/a/508752/158442 - mais les deux n'y appartiennent pas, mais ici. : D
muru
2
@KasiyA: La réponse de Ask devrait être ici pas dans Répéter une commande tous les x intervalles de temps dans le terminal?
Sylvain Pineau

Réponses:

24

Vous pouvez utiliser xargset seq. Généralement:

seq nr_of_times_to_repeat | xargs -Iz command

Par exemple:

seq 10 | xargs -Iz xdotool click 1

exécutera la xdotool click 1commande 10 fois.

Radu Rădeanu
la source
1
C'est probablement la solution la plus élégante, sans parler de la plus simple.
Seth
Je pense que c'est un très bon exemple pour expliquer le caractère de la pipe.
PascalVKooten
10

Ouvrez un terminal et utilisez la bashcommande suivante :

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

Avec un peu de verbosité et 1s de retard:

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
Sylvain Pineau
la source
erreur sintax avec 'do' ..
user3597989
@ user3597989 Cela fonctionne pour moi, pourriez-vous vérifier à nouveau?
Sylvain Pineau du
@ user3597989 oh je sais, veuillez supprimer le premier $. Il est juste là pour indiquer une invite shell comme sylvain@sylvain-ThinkPad-T430s:~$. Nous l'ajoutons généralement aux réponses en ligne de commande pour différencier la commande de ses résultats.
Sylvain Pineau
@ user3597989: J'ai supprimé l'invite du shell pour éviter toute confusion
Sylvain Pineau
5

Cela devrait faire:

#!/bin/bash

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

où 10 est le nombre d'exécutions de la commande

si vous avez besoin de faire une petite pause:

#!/bin/bash

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

Copiez le script dans un fichier vide, remplacez-le <command to run>par votre xdotoolcommande, enregistrez-le sous run_xdotool.sh, exécutez-le par la commande:

sh /path/to/run_xdotool.sh

Alternativement, vous pouvez le rendre exécutable et l'exécuter simplement par

/path/to/run_xdotool.sh

Une autre solution: utiliser l'option de répétition intégrée de xdotool

Puisque vous mentionnez de l'utiliser pour faire des clics, le plus simple pourrait être d'utiliser xdotoolla propre option de répétition intégrée de. Le format est:

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

Pour effectuer 10 clics de souris (bouton 1) d'affilée, une seconde entre les deux, la commande est:

xdotool click --delay 1000 --repeat 10 1
Jacob Vlijm
la source
5

Si vous avez GNU Parallel, vous pouvez exécuter:

seq 10 | parallel -N0 doit

Tous les nouveaux ordinateurs ont plusieurs cœurs, mais la plupart des programmes sont de nature série et n'utiliseront donc pas les cœurs multiples. Cependant, de nombreuses tâches sont extrêmement parallélisables:

  • Exécutez le même programme sur de nombreux fichiers
  • Exécutez le même programme pour chaque ligne d'un fichier
  • Exécutez le même programme pour chaque bloc d'un fichier

GNU Parallel est un paralléliseur général et permet d'exécuter facilement des travaux en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez accès ssh.

Si vous souhaitez exécuter 32 tâches différentes sur 4 processeurs, une manière simple de paralléliser consiste à exécuter 8 tâches sur chaque processeur:

Planification simple

GNU Parallel génère à la place un nouveau processus à la fin - en maintenant les CPU actifs et en économisant ainsi du temps:

Planification parallèle GNU

Installation

Une installation personnelle ne nécessite pas d'accès root. Cela peut être fait en 10 secondes en procédant comme suit:

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

Pour d'autres options d'installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Apprendre encore plus

Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html

Regardez les vidéos d'introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Parcourez le didacticiel: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscrivez-vous à la liste de diffusion pour obtenir de l'aide: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
la source
1
J'adore le parallèle et j'essaie de suggérer son utilisation partout où je peux. Une question cependant à votre option spécifique: pourquoi avez-vous préféré suggérer ce formulaire au lieu deparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann
1
Le {1..10}ne fonctionne pas dans (t) csh / fish / ash, et la {1..10}construction est limitée par la longueur de la ligne de commande, donc cela ne fonctionnera pas: {1..1000000000}alors que seq 1000000000cela fonctionnera très bien. Mais pour la plupart des situations, {1..10}cela fonctionnera comme prévu, et j'utilise souvent cela aussi.
Ole Tange
4

Vous pouvez utiliser une forboucle de style C qui a l'avantage par rapport à la version avec accolade ( {1..5}) de pouvoir utiliser des variables pour spécifier les points finaux. L'une ou l'autre version est meilleure que l'utilisation d'un utilitaire externe ( seq).

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

Tout sur une seule ligne:

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

Ou vous pouvez le faire sans boucle (pour cet utilitaire et cette fonction spécifiques):

xdotool click --repeat 5 --delay 50 1
En pause jusqu'à nouvel ordre.
la source
0

Vous pouvez simplement utiliser la commande watch:

watch -n x <your command>

changer x en temps en secondes.

Exemple :

watch -n 1 xdotool click 1 

Donc, xdotool click 1 sera répété toutes les 1 s, terminez-le lorsque vous avez terminé.

nux
la source
4
Je pense que la question est spécifique sur l'exécution de la commande un nombre défini de fois , pas tellement à un intervalle défini.
Jacob Vlijm