La commande set -e fait échouer un script bash immédiatement lorsqu'une commande renvoie un code de sortie différent de zéro.
Existe-t-il un moyen simple et élégant de désactiver ce comportement pour une commande individuelle dans un script?
À quels endroits cette fonctionnalité est-elle documentée dans le manuel de référence de Bash ( http://www.gnu.org/software/bash/manual/bashref.html )?
Une alternative à la suppression de la caution en cas d'erreur serait de forcer le succès quoi qu'il arrive. Vous pouvez faire quelque chose comme ça:
Cela retournera 0 (vrai), donc l'ensemble -e ne devrait pas être déclenché
la source
faulty_cmd || :
est un autre idiome populaire pour cela. (Il:
s'agit également d'une commandetrue
).Si vous essayez d'attraper le code retour / erreur (fonction ou fork), cela fonctionne:
la source
Si l'option "Quitter immédiatement le shell" s'applique ou est ignorée, cela dépend du contexte de la commande exécutée (voir la section Bash Reference Manual sur le Set Builtin - grâce à Arkadiusz Drabczyk).
En particulier, l'option est ignorée si une commande fait partie du test dans une instruction if. Par conséquent, il est possible d'exécuter une commande et de vérifier son succès ou son échec dans un "contexte de sortie immédiate" à l'aide d'une instruction if comme celle-ci:
Il est possible d'omettre l'instruction "then" et d'utiliser moins de lignes:
la source
Une autre approche, que je trouve assez simple (et qui s'applique à d'autres
set
options en plus de-e
):Utilisez
$-
pour restaurer les paramètres.Par exemple:
Bien que
-e
spécifiquement, les options que d'autres ont évoquées (|| true
ou «mises à l'intérieur d'unif
») peuvent être plus idiomatiques.la source
J'ai en fait posé une question similaire récemment (même si je n'ai pas posté, j'y suis allé), et, d'après ce que je peux voir, il semble que simplement utiliser set + e avant la commande et set -e par la suite fonctionne le plus élégamment. Voici un exemple, saisissant la réponse de la commande et ne laissant pas l'erreur la jeter.
Cela saisit la sortie de «fortune», vérifie son statut de sortie, fait écho et le dit. Je pense que c'est ce que vous demandiez, ou du moins quelque chose de similaire? Quoi qu'il en soit, j'espère que cela vous aidera.
la source
J'aime démarrer le sous-shell si je veux changer quelque chose temporairement. La commande ci-dessous montre que la première bad_command est ignorée et la seconde abandonne l'exécution.
la source