cmd && echo "$?"
tidak akan bekerja karena hanya akan mencetak angka nol ( echo
hanya akan mengeksekusi setelah berhasil menyelesaikan perintah sebelumnya).
Inilah fungsi shell pendek untuk Anda:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Ini mencetak kode keluar dari perintah yang diberikan dengan cara yang sama seperti time
perintah.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Dengan mengarahkan ulang printf
ke /dev/tty
dalam fungsi, kita masih dapat menggunakan tellexit
pengalihan tanpa mendapatkan sampah di output standar atau aliran kesalahan:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
Dengan menyimpan kode keluar dalam suatu variabel, kami dapat mengembalikannya ke pemanggil:
$ tellexit false || echo 'failed'
exit code 1
failed
Versi yang lebih bagus dari fungsi yang sama juga mencetak sinyal yang mematikan perintah jika kode keluar lebih besar dari 128 (yang berarti diakhiri karena suatu sinyal):
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"
}
Pengujian:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
( local
Masalahnya memerlukan ash
/ pdksh
/ bash
/ zsh
, atau Anda dapat mengubahnya typeset
yang beberapa shell lainnya juga mengerti.)
sleep 1 && echo $?
akan mencetak kode sel tidur hanya ketika itu nol ...