راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

فصل ۱۲ - گرفتن سیگنال‌ها »
« خلاصه

Traps

کلیات

ممکن است موقعیت‌هایی وجود داشته باشد که شما نخواهید کاربران اسکریپت‌هایتان به طور غیرمنتظره با استفاده ازترکیب کلیدی انصراف خارج شوند، برای مثال به علت آنکه باید ورودی آماده شود یا پاکسازی انجام شود. فرمان 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ها را تفسیر می‌کند

موقعی که 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
فصل ۱۲ - گرفتن سیگنال‌ها »
« خلاصه
ترجمه محمود پهلوانی