cmd && echo "$?"
ne fonctionnerait pas car il n'imprimerait par nécessité que des zéros (le echo
ne s'exécuterait qu'en cas de réussite de la commande précédente).
Voici une fonction shell courte pour vous:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Cela imprime le code de sortie de la commande donnée de la même manière que la time
commande.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
En redirigeant le printf
vers /dev/tty
dans la fonction, nous pouvons toujours utiliser tellexit
des redirections sans obtenir de courrier indésirable dans nos flux de sortie ou d'erreur standard:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
En enregistrant le code de sortie dans une variable, nous pouvons le renvoyer à l'appelant:
$ tellexit false || echo 'failed'
exit code 1
failed
Une version plus sophistiquée de la même fonction imprime également le signal qui a tué la commande si le code de sortie est supérieur à 128 (ce qui signifie qu'il s'est terminé en raison d'un signal):
tellexit () {
"$@"
local err="$?"
if [ "$err" -gt 128 ]; then
printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
else
printf 'exit code\t%d\n' "$err" >/dev/tty
fi
return "$err"
}
Essai:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
(La local
chose nécessite ash
/ pdksh
/ bash
/ zsh
, ou vous pouvez la changer, typeset
ce que quelques autres shells comprennent également.)
sleep 1 && echo $?
imprimerait le code de la cellule dormante seulement quand il est nul ...