cmd && echo "$?"
sadece sıfır basması gerektiği için işe yaramaz ( echo
yalnızca önceki komutun başarılı bir şekilde tamamlanmasıyla çalışır).
İşte size kısa bir kabuk işlevi:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Bu, verilen komutun çıkış kodunu time
komutun yaptığı gibi yazdırır .
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Yönlendirerek printf
için /dev/tty
işlevinde, hala kullanabilir tellexit
standart çıkış veya hata akışlarında önemsiz almadan yönlendirmeler ile:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
Çıkış kodunu bir değişkene kaydederek arayana geri döndürebiliriz:
$ tellexit false || echo 'failed'
exit code 1
failed
Aynı işlevin daha ince bir sürümü de, çıkış kodu 128'den büyükse komutu öldüren sinyali yazdırır (yani bir sinyal nedeniyle sonlandırılır):
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 yapmak:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
( local
Şey ash
/ pdksh
/ bash
/ gerektirir zsh
veya typeset
birkaç merminin de anladığı şekilde değiştirebilirsiniz.)
sleep 1 && echo $?
uyuyan hücrenin kodunu yalnızca sıfır olduğunda yazdırır ...