499 votes

Abandon d’un script shell si n’importe quelle commande retourne une valeur différente de zéro ?

J’ai un script shell Bash qui appelle un certain nombre de commandes. Je voudrais avoir le script shell sortir automatiquement avec une valeur de retour de 1 si toutes les commandes de retournent une valeur différente de zéro.

Est-ce possible sans explicitement vérifier le résultat de chaque commande ?

par exemple

834voto

Ville Laurikari Points 10484

Ajoutez à cela le début du script:

set -e

Ce sera la cause de la coque pour quitter immédiatement si une simple commande retourne une valeur non nulle en valeur de sortie. Une simple commande est une commande ne fait pas partie d'un if, while, ou jusqu'à ce que test, ou une partie d'un && ou || liste.

Voir le bash(1) page de manuel sur le "set" commande interne pour plus de détails.

Personnellement, j'ai commencer à presque tous les scripts shell avec des "e". C'est vraiment ennuyeux d'avoir un script obstinément continuer quand quelque chose tombe en panne au milieu et les pauses des hypothèses pour le reste du script.

229voto

leonbloy Points 27119

Pour ajouter à la accepté de répondre:

Gardez à l'esprit qu' set -e n'est parfois pas assez, spécialement si vous avez des tuyaux.

Par exemple, supposons que vous avez ce script

  #!/bin/bash
  set -e 
  ./configure  > configure.log
  make

... qui fonctionne comme prévu: une erreur en configure abandonne l'exécution.

Demain vous faire un anodin changement:

  #!/bin/bash
  set -e 
  ./configure  | tee configure.log
  make

... et maintenant, il ne fonctionne pas. C'est expliqué ici, et une solution de contournement (Bash uniquement):

  #!/bin/bash
  set -e 
  set -o pipefail
  ./configure  | tee configure.log
  make

92voto

Zan Lynx Points 23100

Le si des déclarations dans votre exemple ne sont pas nécessaires. Faites juste comme ceci :

Si vous prenez les conseils de Ville Laurikari et utiliser `` puis pour certaines commandes, vous devrez peut-être utiliser ceci :

Le fera le pipeline de commande ont une valeur de retour, même si la commande échoue si le la `` option ne tuera pas le script.

28voto

fholo Points 327

Si vous avez le nettoyage que vous devez faire à la sortie, vous pouvez également utiliser « piège » le signal Pseudo-aléatoire Err. Cela fonctionne de la même manière que le piégeage INT ou tout autre signal ; bash lève ERR si n’importe quelle commande se termine avec une valeur différente de zéro :

Ou, surtout si vous utilisez « set -e », que vous pouvez piéger sortie ; votre piège sera ensuite exécuté lorsque le script s’arrête pour une raison quelconque, y compris une fin normale, interruptions, une sortie causées par l’option -e, etc..

12voto

lumpynose Points 644

Exécutez-le avec ou en haut.

Regardez aussi `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X