cmd && echo "$?"
non funzionerebbe poiché avrebbe necessariamente solo la stampa degli zeri (l' echo
esecuzione sarebbe eseguita solo al completamento con successo del comando precedente).
Ecco una funzione di shell corta per te:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Questo stampa il codice di uscita del comando dato in un modo simile a quello del time
comando.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Reindirizzando il printf
to /dev/tty
nella funzione, possiamo ancora utilizzare i tellexit
reindirizzamenti senza ottenere spazzatura nei nostri output standard o flussi di errori:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
Salvando il codice di uscita in una variabile siamo in grado di restituirlo al chiamante:
$ tellexit false || echo 'failed'
exit code 1
failed
Una versione più elaborata della stessa funzione stampa anche il segnale che ha interrotto il comando se il codice di uscita è maggiore di 128 (il che significa che è terminato a causa di un segnale):
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"
}
test:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
(La local
cosa richiede ash
/ pdksh
/ bash
/ zsh
, oppure puoi cambiarla in modo typeset
che anche alcune altre shell capiscano.)
sleep 1 && echo $?
stampa il codice della cella dormiente solo quando è zero ...