ERR
যখন শেল নিজেই একটি নন-জিরো ত্রুটি কোডের মাধ্যমে প্রস্থান করে ফাঁদ কোড চালানোর জন্য করা হয় না, কিন্তু যখন যে শেল দ্বারা কোনো কমান্ড রান করে একটি অংশ নয় শর্ত (মত if cmd...
, অথবা cmd || ...
একটি অ-শূন্য দিয়ে ...) প্রস্থানের প্রস্থান স্থিতি ( set -e
শেল থেকে বেরিয়ে আসার কারণ হিসাবে একই পরিস্থিতি )।
যদি আপনি শূন্য-বহির্গমন স্থিতি সহ শেল থেকে প্রস্থান করার সময় কোডটি চালাতে চান তবে আপনার EXIT
পরিবর্তে একটি ফাঁদ যুক্ত করে $?
সেখানে চেক করতে হবে:
trap '[ "$?" -eq 0 ] || echo hi' EXIT
তবে নোট করুন যে কোনও আটকে থাকা সংকেতের উপরে, সিগন্যাল ট্র্যাপ এবং এক্সিট ট্র্যাপ উভয়ই চালিত হবে, সুতরাং আপনি এটি এর মতো করতে চাইতে পারেন:
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
অথবা $((signum + 128))
সিগন্যালের মতো প্রস্থান স্থিতি ব্যবহার করতে :
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
তবে নোট করুন যে সাধারণত সাইন্ট বা সিগুয়েট থেকে প্রস্থান করার সম্ভাব্য বিরক্তিকর পার্শ্ব প্রতিক্রিয়া থাকে যখন আপনার প্যারেন্ট প্রসেসটি এমন শেল হয়ে থাকে bash
যা টার্মিনাল বাধাগুলির জন্য অপেক্ষা এবং সমবায় প্রস্থান হ্যান্ডলিংকে কার্যকর করে । সুতরাং, আপনি তার পরিবর্তে একই সিগন্যাল দিয়ে নিজেকে হত্যা করতে নিশ্চিত করতে পারেন যাতে আপনার পিতামাতার কাছে জানাতে পারেন যে আপনি সত্যই বাধা পেয়েছিলেন এবং এটি যদি স্বাক্ষর / সাইনপুট পেয়ে থাকে তবে এটি নিজেই বাহির হওয়াও বিবেচনা করা উচিত।
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
ফাঁদে আগুন জ্বালাতে চান তবে একটি শূন্য-বহির্গমন প্রস্থান হিসাবে false
বা এর মতো একটি কমান্ড চালান test
।