254 votes

Comment exécuter une commande plusieurs fois, en utilisant bash Shell ?

Existe-t-il un moyen d'exécuter une commande (par ex. ps aux|grep someprocess ) pour n fois ?

Quelque chose comme :

run -n 10  'ps aux|grep someprocess'

Je veux l'utiliser de manière interactive.

Mise à jour : La raison pour laquelle je pose cette question est que je travaille sur de nombreuses machines et je ne veux pas importer tous mes scripts adaptés etc. dans chaque boîte pour obtenir la même fonctionnalité sur toutes les machines.

338voto

sjors miltenburg Points 694

Je ne pense pas qu'une commande ou un Shell intégré pour cela existe, car c'est un sous-ensemble trivial de ce que le Shell de Bourne. for est conçue pour et la mise en œuvre d'une telle commande par vous-même est donc assez simple.

Selon la suggestion de JimB, utilisez l'utilitaire Bash pour générer des séquences :

for i in {1..10}; do command; done

Pour les très anciennes versions de bash, vous pouvez utiliser l'option seq commandement :

for i in `seq 10`; do command; done

Ceci itère dix fois en exécutant command à chaque fois - il peut s'agir d'un pipe ou d'une série de commandes séparées par des ; o && . Vous pouvez utiliser le $i pour savoir dans quelle itération vous vous trouvez.

Si vous considérez cette ligne unique comme un script et donc pour une raison non spécifiée (mais peut-être valide) indésirable, vous pouvez l'implémenter comme une commande, peut-être quelque chose comme ceci sur votre .bashrc (non testé) :

#function run
run() {
    number=$1
    shift
    for i in `seq $number`; do
      $@
    done
}

Utilisation :

run 10 command

Beispiel:

run 5 echo 'Hello World!'

45voto

Lekensteyn Points 5981

ps aux | grep someprocess On dirait que vous voulez regarder les changements d'un programme pour une durée déterminée. Eduardo a donné une réponse qui répond exactement à votre question mais il existe une alternative : watch :

watch 'ps aux | grep someprocess'

Notez que j'ai mis la commande entre guillemets simples pour éviter que le Shell n'interprète la commande comme "run watch ps aux" et pipe le résultat à travers grep someprocess . Une autre façon d'effectuer la commande précédente serait :

watch ps aux \| grep someprocess

Par défaut, watch se rafraîchit toutes les deux secondes, ce qui peut être modifié à l'aide de la fonction -n option. Par exemple, si vous voulez avoir un intervalle de 1 seconde :

watch -n 1 'ps aux | grep someprocess'

29voto

hdaz Points 279

Juste pour le plaisir

pgrep ssh ;!!;!!;!!;!!;!!;!!

; est un séparateur de commande et !! rejouer la dernière commande en bash. Donc ceci fonctionne pgrep ssh puis le rejoue 6 fois.

25voto

Buttle Butkus Points 331

Similaire aux réponses précédentes, mais ne nécessite pas le boucle for :

seq 10 | xargs -I -- echo "hello"

pipe la sortie de seq vers xargs sans arguments ni options

19voto

android42 Points 191

Essayez ça :

yes ls | head -n5 | bash

Cela nécessite que la commande soit exécutée dans un sous-Shell, une légère pénalité de performance. YMMV. En gros, vous obtenez que la commande "yes" répète la chaîne "ls" N fois ; tandis que "head -n5" termine la boucle à 5 répétitions. Le pipe final envoie la commande au Shell de votre choix.

Par ailleurs, csh -comme les coquilles ont une fonction intégrée repeat . Vous pourriez l'utiliser pour exécuter votre commande dans un sous-Shell bash !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X