5 votes

Flux de contrôle Bash utilisant || sur la fonction, avec set -e

Si je mets set -e dans un script de Bash, le script se terminera sur les erreurs futures. Je suis confus quant à la façon dont cela fonctionne avec les fonctions. Considérez ce qui suit, qui n'imprimera que one à la norme :

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun

Il est clair que le non_existing_command est une erreur et donc le script sort avant le second echo . En général, on peut utiliser le o opérateur || pour exécuter une autre commande si et seulement si la première commande échoue. En d'autres termes, je soupçonnerais ce qui suit d'imprimer à la fois one y three mais pas two :

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun || echo three

Ce que j'obtiens cependant est one y two . C'est-à-dire que le || empêche la sortie (comme il se doit) mais il choisit de continuer avec le corps de la fonction et d'ignorer la commande de droite.

Une explication ?

6voto

glenn jackman Points 69748

Elle semble être documentée dans le site set commande intégrée

Si une commande composée ou une fonction shell s'exécute dans un contexte où -e n'est pas prise en compte [comme à gauche de l'écran d'une fenêtre || ], aucune des commandes exécutées à l'intérieur du corps de la commande ou de la fonction composée ne sera affectée par la directive -e paramètre même si -e est activé et une commande renvoie un état d'échec.

L'accentuation et le commentaire sont de moi.

Aussi, si vous essayez de set -e à l'intérieur de la fonction, pas la peine : la phrase suivante :

Si une commande composée ou une fonction shell définit -e tout en s'exécutant dans un contexte où -e est ignoré, ce paramètre n'aura aucun effet tant que la commande composée ou la commande contenant l'appel de fonction ne sera pas terminée.

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