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>
بدون دادن شانس اتمام پردازش، کشته میشود(از بین میرود ).
این هم جدولی از برخی رایجترین سیگنالهای وقفه:
شماره | سیگنال | معنی |
---|---|---|
0 | 0 | در خروج از پوسته |
1 | SIGHUP | Clean tidyup |
2 | SIGINT | وقفه |
3 | SIGQUIT | خروج |
6 | SIGABRT | لغو |
9 | SIGKILL | مرگ فوری( نمیتواند محبوس- trap- شود) |
14 | SIGALRM | زنگ هشدار |
15 | SIGTERM | خاتمه دادن |
توجه کنید که اگر اسکریپت شما در محیطی اجرا شده باشد، که خودش از سیگنالها صرفنظر کند( به عنوان مثال، تحت کنترل
nohup
)، اسکریپت نیز از سیگنالها چشمپوشی میکند.
Steve Parker نوشته Bourne و Bash راهنمای آموزشی اسکریپت نویسی
ترجمه محمود پهلوانی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید