Trap

Trap یک برنامه ساده اما خیلی سودمند می‌باشد. اگر اسکریپت شما فایل‌های موقتی ایجاد نماید،مانند این اسکریپت ساده، که در تمام فایل‌های دایرکتوری جاری کلمه FOO را با BAR تعویض می‌نماید، موقعی که اسکریپت خارج می‌شود، دایرکتوری ‎ /tmp ‎ پاکیزه است. اگر اسکریپت در میانه راه خاتمه داده شود، یک فایل می‌تواند در دایرکتوری ‎ /tmp ‎  وجود داشته باشد:
#!/bin/sh

trap cleanup 1 2 3 6

cleanup()
{
  echo "Caught Signal ... cleaning up."
  rm -rf /tmp/temp_*.$$
  echo "Done cleanup ... quitting."
  exit 1
}

### main script
for i in *
do
  sed s/FOO/BAR/g $i > /tmp/temp_${i}.$$ && mv /tmp/temp_${i}.$$ $i
done
دستور trap به اسکریپت می‌گوید، که در صورت دریافت سیگنال‌های ۱، ۲، ۳، یا۶ تابع ‎cleanup()‎ را اجرانماید. یکی از رایج‌ترین آنها ‎ (CTRL-C) ‎ سیگنال شماره ۲ به نام (SIGINT) است. این برنامه همچنین می‌تواند برای مقاصد کاملاً جالب به کار رود:
#!/bin/sh

trap 'increment' 2

increment()
{
  echo "Caught SIGINT ..."
  X=`expr ${X} + 500`
  if [ "${X}" -gt "2000" ]
  then
    echo "Okay, I'll quit ..."
    exit 1
  fi
}

### main script
X=0
while :
do
  echo "X=$X"
  X=`expr ${X} + 1`
  sleep 1
done
اسکریپت فوق کاملاً با مزه است - اسکریپت ‎ CTRL-C ‎  را می‌گیرد، خارج نمی‌شود، بلکه فقط چگونگی اجرا را تغییر می‌دهد. این‌که این مورد برای نتایج مثبت و منفی چگونه می‌توانست مفید باشد را به عنوان تمرین به خوانندگان واگذار می‌کنیم:) این مثال به خصوص بعد از چهار بار سیگنال وقفه( یا ۲۰۰۰ ثانیه ) خارج می‌شود. توجه داشته باشید که هر چیزی توسط ‎ kill -9 <PID>‎ بدون دادن شانس اتمام پردازش، کشته می‌شود(از بین می‌رود ).

این هم جدولی از برخی رایج‌ترین سیگنال‌های وقفه:

شمارهسیگنالمعنی
00در خروج از پوسته
1SIGHUPClean tidyup
2SIGINTوقفه
3SIGQUITخروج
6SIGABRTلغو
9SIGKILLمرگ فوری( نمی‌تواند محبوس- trap- شود)
14SIGALRMزنگ هشدار
15SIGTERMخاتمه دادن

توجه کنید که اگر اسکریپت شما در محیطی اجرا شده باشد، که خودش از سیگنال‌ها صرف‌نظر کند( به عنوان مثال، تحت کنترل nohup )، اسکریپت نیز از سیگنال‌ها چشم‌پوشی می‌کند.

Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید