آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۱۰۹

پرسش و پاسخ شماره ۱۰۹

چگونه می‌توانم بگویم که آیا اسکریپت من منبع شده(به طور نقطه‌ای) یا اجرا گردیده است؟

به طور معمول موقعی که اشخاص این پرسش را مطرح می‌کنند، به دلیل آنست که می‌خواهند خطاهای کاربر را تشخیص داده و پیغام مناسبی برای آن تهیه کنند. یک نظریه‌ای هست که می‌گوید نباید کاربر یونیکس را به این طریق نازپرورده نمود، و اگر کاربری حقیقتاً بخواهد در عوض منبع کردن اسکریپت شما، آن را اجرا کند،شما نباید برای این کار او را نکوهش کنید. حال از این که بگذریم، ما می‌توانیم پرسش را به نحو دیگری که در واقع باید پرسیده شود، بیان کنیم:

من می‌خواهم اگر کاربر به جای منبع کردن اسکریپت آنرا از پوسته محاوره‌ای اجرا نماید، یک پیغام خطا نمایش داده و از اجرای اسکریپت صرف نظر گردد.

کلید در اینجا، و دلیل آنکه من پرسش را به این طریق جمله‌بندی مجدد نموده‌ام، آنست که شما عملاً نمی‌توانید آنچه را کاربر تایپ نموده است تعیین کنید، اما می‌توانید تعیین کنید آیا کُد در حال تفسیر شدن با یک پوسته محاوره‌ای است. این کار را باکنترل یک i در محتوای متغیر ‎$-‎ انجام بدهید:

# POSIX(?)
case $- in
  *i*) : ;; 
    *) echo "You should dot me in" >&2; exit 1;;
esac

یا با استفاده از ترکیب دستوری غیر-POSIX:

# Bash/Ksh
if [[ $- != *i* ]]; then
  echo "You should dot me in" >&2; exit 1
fi

البته، این مورد در حالت‌های ترفندآمیزی مانند «من می‌خواهم فایل من از یک اسکریپت غیرمحاوره‌ای نقطه‌ای بشود...» کار نمی‌کند. برای آن حالت‌ها، پاراگراف اول این صفحه را ببینید.


CategoryShell

پرسش و پاسخ 109 (آخرین ویرایش ‎2012-09-11 07:43:44‎ توسط dslb-088-072-055-065)