ممکن است موقعیتهایی وجود داشته باشد که شما نخواهید کاربران اسکریپتهایتان به طور غیرمنتظره با استفاده ازترکیب کلیدی انصراف خارج شوند، برای مثال به علت آنکه باید ورودی آماده شود یا پاکسازی انجام شود. فرمان trap این رشتههای انصراف را در تله میاندازد و برنامهریزی انجام لیستی از دستورات به نسبت سیگنالهای محبوس شده میتواند انجام شود.
دستور زبان استفاده از فرمان trap سرراست است:
trap [COMMANDS] [SIGNALS]
این ساختار فرمان trap را به گرفتن سیگنالهای (SIGNALS) لیست شده، که میتواند نام سیگنالها با یا بدون پیشوند SIG، یا شماره سیگنالها باشد، هدایت میکند. اگر سیگنال 0 یا EXIT باشد، COMMANDS موقع خروج پوسته اجرا میشوند. اگر یکی از سیگنالها DEBUG باشد، لیست COMMANDS بعد از هر دستور ساده اجرا میشود. یک سیگنال همچنین ممکن است به عنوان ERR مشخص بشود، در آن حالت COMMANDS هر وقت یک فرمان ساده کد وضعیت غیر صفر خارج کند، اجرا میشوند. توجه نمایید که این دستورات وقتیکه کد غیر صفر از قسمتی از یک جمله if یا از یک حلقه while یا until، میآید، اجرا نخواهند شد. هم چنین اگر از یک AND (&&) منطقی یا OR (||) یک کد خروج غیر صفر نتیجه شود، یا کد برگشتی یک دستور بااستفاده از عملگر ! بر عکس شده باشد، اجرا نخواهند شد.
کد برگشتی خود دستور trap صفر است مگر اینکه با یک سیگنال تعیین شده نامعتبر مواجه گردد. فرمان trap گزینههایی میگیرد که درصفحههای info از Bash مستند شدهاند.
در اینجا یک مثال بسیار ساده، گرفتن Ctrl+C از کاربر، که بعد از آن یک پیغام چاپ میگردد. موقعی که شما سعی میکنید بدون تعیین سیگنال KILL، این برنامه را از بین ببرید(kill نمایید) ،هیچ اتفاقی رخ نمیدهد:
#!/bin/bash # traptest.sh trap "echo Booh!" SIGINT SIGTERM echo "pid is $$" while : # This is the same as "while true". do sleep 60 # This script is not really doing anything. done
موقعی که Bash سیگنالی دریافت میکند که برای آن یک trap قرار داده شده است، در حالیکه در انتظار تکمیل فرمان است، trap تا تکمیل آن دستور اجرا نمیشود. وقتی Bash در انتظار یک فرمان غیر همزمان از طریق دستور داخلی wait میباشد، دریافت سیگنالی که برای آن یک trap قرار دادهشده است باعث بازگشت فوری wait داخلی با یک کد خروج بزرگتر از 128 میشود، بلافاصله بعد از trap اجرا شده.
موقع اشکالیابی اسکریپتهای بلندتر، ممکن است بخواهید صفت trace به متغیری بدهید و trap سیگنال DEBUG روی آن متغیر پیغام بدهد. به طور معمول شما متغیر را فقط با استفاده ازدستور بخصیص مانند VARIABLE
=value تعریف میکنید. تعویض تعریف متغیر با سطر زیر میتواند اطلاعات ارزشمندی در باره اینکه اسکریپت شما مشغول انجام چه چیز است فراهم مینماید:
declare -t VARIABLE=value trap "echo VARIABLE is being used here." DEBUG # rest of the script
دستور whatis متکی به بانک اطلاعاتی است که به طور منظم با استفاده از اسکریپت makewhatis.cron
توسط cron ساخته میشود:
#!/bin/bash LOCKFILE=/var/lock/makewhatis.lock # Previous makewhatis should execute successfully: [ -f $LOCKFILE ] && exit 0 # Upon exit, remove lockfile. trap "{ rm -f $LOCKFILE ; exit 255; }" EXIT touch $LOCKFILE makewhatis -u -w exit 0