24 votes

Comment enchaîner les commandes sur la console ?

En bash Je veux parfois exécuter plusieurs commandes en série et je ne veux pas attendre qu'elles se terminent avant de taper les nouvelles. Je fais donc quelque chose comme ceci :

cmd1; cmd2; cmd3

Malheureusement, l'une des commandes peut échouer. Dans ce cas, j'aimerais m'arrêter. Existe-t-il un moyen simple de le faire, mais en veillant à ce que je ne continue à exécuter les commandes que si le code de sortie de la commande précédente était égal à 0 ?

41voto

ulidtko Points 2796

Utilisez && opérateur,

cmd1 && cmd2 && cmd3

Dans le shellscripting, && y || sont modelés d'après l'implémentation optimisée des opérateurs logiques en C. && signifie opérateur AND, et || signifie OR. Unix est étroitement lié au C, et en C, le second opérande des opérateurs logiques n'est pas évalué si le résultat est déjà connu à partir du premier opérande. Par exemple "false && x" es false pour tout x Il n'est donc pas nécessaire d'évaluer x (surtout si x est un appel de fonction) ; de même pour "true || x" . On l'appelle aussi court-circuitage sémantique .

Et dans Unix, il est traditionnel d'interpréter les valeurs de retour des commandes comme des valeurs de vérité "d'achèvement réussi" : le code de sortie 0 signifie true (succès), une valeur non nulle signifie false (échec). Ainsi, lorsque la première commande de cmd1 && cmd2 収益 "false" (état de sortie non nul, qui indique un échec), l'état de la commande composée est connu : échec. Ainsi, l'interprétation globale de cmd1 && cmd2 peut être : "exécuter cmd1 ET ALORS, si ça n'a pas échoué, cmd2 ". Ce qui est en fait ce que vous voulez dans votre question.

De même avec OR : cmd1 || cmd2 peut être interprété comme "exécuter cmd1 OU SI elle échoue, cmd2 ".


Protip : pour les chaînes plus longues de && envisagez de mettre set -e dans votre script. En gros, ça change le point-virgule ; en && avec quelques cas particuliers.

13voto

andi Points 131

"Chaîner les commandes et les grouper"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

pings, seulement si elle ne réussit pas, exécute le groupe de commandes enchaînées entre parenthèses.

Attention :

La liste doit être terminée par un " ;".

Il doit y avoir des espaces vides entre les parenthèses et les commandes groupées !

6voto

Wuffers Points 18372

Tout simplement avec le && opérateur. Par exemple :

cmd1 && cmd2 && cmd3

Si l'une des commandes échoue (renvoie une valeur de sortie différente de 0), les autres commandes ne s'exécuteront pas.

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