Dans bash
, je souhaite parfois exécuter plusieurs commandes en série et ne pas attendre qu'elles se terminent avant de taper les nouvelles. Je fais donc quelque chose comme ça:
cmd1; cmd2; cmd3
Malheureusement, l'une des commandes peut échouer. Dans ce cas, j'aimerais m'arrêter. Y a-t-il un moyen facile de le faire, mais faites en sorte que je ne continue à exécuter les commandes que si la commande précédente avait un code de sortie 0?
command-line
bash
métaphore pythonique
la source
la source
Réponses:
Utiliser l'
&&
opérateur,En shellscripting,
&&
et les||
opérateurs sont modélisés après la mise en œuvre optimisée des opérateurs logiques C.&&
moyens et opérateur, et des||
moyens OU. Unix est étroitement lié à C, et en C, le deuxième opérande d'opérateurs logiques n'est pas évalué si le résultat est déjà connu du premier opérande. Par exemple,"false && x"
c'estfalse
pour toutx
, il n'y a donc pas besoin d'évaluerx
(surtout s'ilx
s'agit d'un appel de fonction); de même pour"true || x"
. Ceci est également appelé sémantique de court-circuit .Et sous Unix, il est traditionnel d'interpréter les valeurs de retour des commandes comme des valeurs de vérité "réussite terminée": le code de sortie 0 signifie
true
(succès), différent de zérofalse
(échec). Ainsi, lorsque la première commandecmd1 && cmd2
retourne"false"
(état de sortie différent de zéro, qui indique l'échec), l'état de la commande composée est connu: échec. L'interprétation globale decmd1 && cmd2
peut donc être: "exécutercmd1
, ET ALORS, si cela n'a pas échouécmd2
". C'est ce que vous voulez essentiellement dans votre question.De même avec OR:
cmd1 || cmd2
peut être interprété comme "exécutercmd1
, OU en cas d'écheccmd2
".Protip: pour des chaînes plus longues
&&
, pensez à mettreset -e
votre script. Il change fondamentalement le point-virgule;
en&&
, avec quelques cas spéciaux.la source
||
A || B
est exactement le même que le [court-circuitage] A OU B logique .A || B
est le succès quand aA
été le succès , ou quand aA
été l' échec mais aB
été le succès ; etA || B
c'est l' échec quandA
était l' échec et l'B
étaitfailure
. De même pour&&
, il suit un ET logique.;
(ou newline) par défaut.set -e
va se transformer;
en&&
gros.set +e
[la valeur par défaut] se transformeA; B
en ce que vous dites: exécuterA
, puis exécuter n'importe quoiB
."Enchaîner les commandes et les regrouper"
pings, uniquement en cas d'échec, exécute le groupe chaîné de commandes entre crochets.
Attention:
La liste doit se terminer par un ";".
Il doit y avoir des espaces vides entre les crochets et les commandes groupées!
la source
Simplement avec l'
&&
opérateur. Par exemple:Si l'une des commandes échoue (renvoie une valeur de sortie autre que 0), les autres commandes ne s'exécuteront pas.
la source