La propagation code de sortie de l'appelant dans le cas d'une coquille d'erreur de script ayant une sortie piège

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

Question

Est-il possible de propager un code de sortie à l'appelant dans le cas d'une erreur de syntaxe dans un script Bash avec une SORTIE piège?Par exemple, si j'ai:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo

Ensuite, il donne un code de sortie 0 même si le script n'a pas vraiment de fin avec succès:

$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!

$ echo $?
0

Mais si je commente la sortie du piège, le script renvoie 1.Sinon, si je remplace la ligne avec le unbound variable avec une commande qui retourne une valeur non nulle (par ex. /bin/false), que la valeur de sortie est propagée comme j'aimerais qu'elle.

Était-ce utile?

La solution 2

Ce comportement est lié à différentes versions de Bash.Le script d'origine fonctionne comme prévu sur le coup 4.2, mais pas sur 3.2.Avoir le risque d'erreur de code dans un autre fichier de script et l'exécuter dans un shell interne est exécuté travaux autour de problèmes dans les précédentes versions de Bash:

#!/bin/bash

$BASH sub.sh
RETVAL=$?

if [[ "$RETVAL" != "0" ]]; then
  echo "Dying!! Exit code: $RETVAL"
fi

sub.sh:

set -eu

echo yeah
echo $UNBOUND_VARIABLE
echo boo

Autres conseils

Le shell se termine avec le résultat de la dernière commande exécutée.Dans votre piège cas, c'est echo, qui renvoie généralement avec succès.

Pour propager votre valeur, il suffit de exit avec elle.

#!/bin/bash

set -eu

die() {
  echo "Dying!!"
  exit "$1"
}

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo

Notez également que set -e est considéré comme dangereux -- il vous fait penser le script de sortie si une commande échoue, ce ne sera pas toujours le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top