Comment intercepter le code de sortie en script Bash
Il ya beaucoup de points de sortie dans mon code bash. J'ai besoin de faire un peu de ménage en place le travail à la sortie, j'ai donc utilisé un piège à ajouter un rappel pour la sortie comme ceci:
trap "mycleanup" EXIT
Le problème est que il y a différents codes de sortie, j'ai besoin de faire correspondant de nettoyage fonctionne. Puis-je obtenir le code de sortie dans mycleanup?
- piège 'foo' ou de QUITTER piège 'foo' CHLD ?
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez utiliser
$?
pour obtenir le code de sortie.$BASH_COMMAND
et$BASH_LINENO
pratique parfois, trop.Accepté la réponse est fondamentalement correct, je veux juste clarifier les choses.
L'exemple suivant fonctionne bien:
Mais vous devez être plus prudent, si vous faites du nettoyage de la ligne d'entrée, sans fonction. Par exemple, cela ne fonctionne pas:
Au lieu de cela, vous avez pour échapper à la
$rv
et$?
variables:Vous pouvez également échapper
$tmpdir
, comme il est évalué lors de l'interruption de la ligne est exécuté et si letmpdir
les changements de la valeur plus tard, qui ne vous donnera pas le comportement attendu.Edit: Utiliser shellcheck pour vérifier vos scripts bash et être conscient des problèmes de ce type.
J'ai trouvé, il est préférable de séparer le QUITTER piège au piège pour d'autres signaux
Exemple de piège script de test...
Le fichier temporaire est nettoyé.
Le fichier de sortie valeur de 10 est préservé!
Les interruptions suite à une sortie de la valeur de 2
Fondamentalement, tant que vous n'utilisez pas "quitter" dans une QUITTER piège, elle va sortir avec l'original de la valeur de sortie préservé.
De CÔTÉ: Note la citation à la SORTIE du piège. Cela me permet de changer ce fichier doit être nettoyé pendant les scripts durée de vie. J'ai souvent aussi inclure un test de l'existence de l' $tmpfile avant d'essayer de l'enlever, donc je n'ai même pas besoin de le mettre au début du script, seulement avant de la créer.