به طور معمول موقعی که اشخاص این پرسش را مطرح میکنند، به دلیل آنست که میخواهند خطاهای کاربر را تشخیص داده و پیغام مناسبی برای آن تهیه کنند. یک نظریهای هست که میگوید نباید کاربر یونیکس را به این طریق نازپرورده نمود، و اگر کاربری حقیقتاً بخواهد در عوض منبع کردن اسکریپت شما، آن را اجرا کند،شما نباید برای این کار او را نکوهش کنید. حال از این که بگذریم، ما میتوانیم پرسش را به نحو دیگری که در واقع باید پرسیده شود، بیان کنیم:
من میخواهم اگر کاربر به جای منبع کردن اسکریپت آنرا از پوسته محاورهای اجرا نماید، یک پیغام خطا نمایش داده و از اجرای اسکریپت صرف نظر گردد.
کلید در اینجا، و دلیل آنکه من پرسش را به این طریق جملهبندی مجدد نمودهام، آنست که شما عملاً نمیتوانید آنچه را کاربر تایپ نموده است تعیین کنید، اما میتوانید تعیین کنید آیا کُد در حال تفسیر شدن با یک پوسته محاورهای است. این کار را باکنترل یک 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
البته، این مورد در حالتهای ترفندآمیزی مانند «من میخواهم فایل من از یک اسکریپت غیرمحاورهای نقطهای بشود...» کار نمیکند. برای آن حالتها، پاراگراف اول این صفحه را ببینید.
پرسش و پاسخ 109 (آخرین ویرایش 2012-09-11 07:43:44 توسط dslb-088-072-055-065)