ERR
tuzak kabuk kendisi sıfır olmayan bir hata kodu ile çıktığında kod çalıştırmak, bunlarla değilken herhangi bir komut bir parçası değildir kabuk tarafından çalışma durumuna (olduğu gibi if cmd...
, veya cmd || ...
olmayan bir sıfır ...) çıkışları çıkış durumu ( set -e
kabuktan çıkmaya neden olanla aynı koşullar ).
Sıfır olmayan çıkış durumundaki kabuğun çıkışından sonra kodu çalıştırmak istiyorsanız, EXIT
bunun yerine bir tuzak eklemeli ve $?
orada kontrol etmelisiniz :
trap '[ "$?" -eq 0 ] || echo hi' EXIT
Bununla birlikte, sıkışmış bir sinyalde, hem sinyal tuzağının hem de EXIT tuzağının çalışacağına dikkat edin, böylece bunu yapmak isteyebilirsiniz:
unset killed_by
trap 'killed_by=INT;exit' INT
trap 'killed_by=TERM;exit' TERM
trap '
ret=$?
if [ -n "$killed_by" ]; then
echo >&2 "Ouch! Killed by $killed_by"
exit 1
elif [ "$ret" -ne 0 ]; then
echo >&2 "Died with error code $ret"
fi' EXIT
Veya $((signum + 128))
sinyaller gibi çıkış durumunu kullanmak için :
for sig in INT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig")))" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"' EXIT
Bununla birlikte, ana işleminiz terminal kesintisinin bekleme ve birlikte çıkış işlemlerini bash
uygulayan bir kabuk olduğunda, SIGINT veya SIGQUIT üzerinde normal olarak çıkmanın potansiyel can sıkıcı yan etkilere sahip olduğunu unutmayın . Bu nedenle, ebeveyninize gerçekten kesintiye uğradığınızı ve bir SIGINT / SIGQUIT aldıysa da çıkmayı düşünmesi için kendinizi aynı sinyalle öldürdüğünüzden emin olmak isteyebilirsiniz.
unset killed_by
for sig in INT QUIT TERM HUP; do
trap "exit $((128 + $(kill -l "$sig"))); killed_by=$sig" "$sig"
done
trap '
ret=$?
[ "$ret" -eq 0 ] || echo >&2 "Bye: $ret"
if [ -n "$killed_by" ]; then
trap - "$killed_by" # reset handler
# ulimit -c 0 # possibly disable core dumps
kill -s "$killed_by" "$$"
else
exec "$ret"
fi' EXIT
ERR
Tuzağın ateş etmesini istiyorsanız, false
veya gibi sıfır olmayan çıkış durumuna sahip bir komut çalıştırın test
.