cmd && echo "$?"non funzionerebbe poiché avrebbe necessariamente solo la stampa degli zeri (l' echoesecuzione 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 timecomando.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Reindirizzando il printfto /dev/ttynella funzione, possiamo ancora utilizzare i tellexitreindirizzamenti 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 localcosa richiede ash/ pdksh/ bash/ zsh, oppure puoi cambiarla in modo typesetche anche alcune altre shell capiscano.)
sleep 1 && echo $?stampa il codice della cella dormiente solo quando è zero ...