Considérons le code suivant
outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
introspection.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
J'essaie de outer-scope.sh
sortir quand un appel à inner()
échouer. Depuis $()
invoque un sous-shell, cela ne se produit pas.
Sinon, comment puis-je obtenir le résultat d'une fonction tout en préservant le fait que la fonction peut se fermer avec un code de sortie non nul?
echo $()
, cela peut être dû au fait que les codes de sortie des sous-coquilles sont ignorés lorsque la ligne - laecho
commande - a son propre code de sortie (généralement 0).if ! $(exit 1) ; then echo $?; fi
, je comprends0
. Vous ne savez pas tropif
si vous devez conserver cette valeur de sortie.if ! output=$(inner); then exit $?; fi
quittera avec un code retour de 0 car$?
donnera le code retour de!
au lieu du code retour deinner
. Vous pouvez obtenir le comportement souhaité avecif output=$(inner); then : ; else exit $?; fi
mais c'est évidemment plus verbeuxVoir BashFAQ / 002 :
Un cas particulier
Remarque sur un cas délicat avec des variables locales de fonction, comparez le code suivant:
Nous aurons:
Pourquoi?
Lorsque la sortie d'un sous-shell est utilisée pour initialiser une
local
variable, l'état de sortie n'est plus celui du sous-shell, mais celui de la commande , ce qui est le plus susceptible de l'être .local
0
Voir aussi https://stackoverflow.com/a/4421282/537554
la source
En ajoutant
echo
, le sous-shell n'est pas autonome (n'est pas vérifié séparément) et n'abandonne pas. L'affectation contourne ce problème.Vous pouvez également le faire et rediriger la sortie vers un fichier pour le traiter ultérieurement.
la source