nullglob یک گزینه پوسته Bash است که بسط glob را به گونهای اصلاح میکند تا الگوهایی که بر هیچ نام فایلی منطبق نمیگردند به جای بسط یافتن به خود آن الگوها، به صفر شناسه بسط داده شوند.
به طور عادی، وقتی یک glob که بر هیچ نام فایلی منطبق نمیشود، بسط داده میشود، بدون تغییر باقی میماند. بدین معنی که نتایجی مانند این به دست میآورید:
$ rm *.bak rm: cannot remove `*.bak': No such file or directory
جانشین غیر منطبق *.bak با هیچ چیزی تعویض نمیشود، به طور مستقیم به فرمان rm تحویل میگردد، همانطور که اگر نام یک فایل بود. پس فرمان rm سعی میکند آن را حذف کند، و شکست میخورد، با یک پیغام خطای معقول.
به هرحال، این موضوع در برنامهنویسی باعث برخی نتایج نامطلوب میگردد. یک آرایه مانند این را ملاحظه کنید:
# Bash در پوسته files=(*) echo "There are ${#files[*]} files here."
اگر هیچ فایلی با glob انطباق نیابد، این ناموفق است درحالیکه یک فایل گزارش خواهد نمود، به علت آنکه آرایه با یک عنصر منفرد * بارگیری میشود.
گزینه nullglob امکان اجتناب از این مشکل را برای ما فراهم میکند. اگر این گزینه تنظیم شود، جانشینِ منطبق نشده به جای اینکه به عنوان یک کلمه منفرد آنجا بماند، کاملاً کنار گذاشته میشود. -- با صفر کلمه جایگزین میشود-- .
# Bash در پوسته shopt -s nullglob files=(*) echo "There are ${#files[*]} files here."
گزینه nullglob به طور پیشفرض فعال نیست زیرا موقعیتهای دیگری موجود است، که در آنها این رفتارش میتواند بینهایت مبهوت کننده باشد. برای نمونه، اگر یک جانشین انطباق نیافته، از لیست شناسههای ls حذف گردد، به طور کاملاً غیر منتظرهای رفتار میکند:
shopt -s nullglob ls *.xyzqj # .در این حالت تمام فایلهای این دایرکتوری لیست خواهند شد # .بدون شناسه به کار برود ls درست مانند موقعی که دستور
ممکن است گزینه nullglob خودش برای تمام حالات کفایت نکند. به طور پیشفرض glob بر نام فایلهایی که نامشان با نقطه شروع میشود، منطبق نمیشود، مگر اینکه خود جانشین نیز با نقطه شروع شود. اگر این فایلها که فایلهای پنهان نیز شناخته میشوند، باید با جانشین مطابقت داده شوند، آنوقت ممکن است شخص مایل باشد از گزینه dotglob استفاده کند.
# Bash در پوسته shopt -s dotglob shopt -s nullglob files=(*) echo "There are ${#files[*]} files here."
فقط به خاطر داشته باشید که این گزینهها تا موقعی که غیر فعال نشدهاند، برای پردازش پوسته جاری مؤثر باقی میمانند.
ادامه مطلبیک توصیفگر فایل(FD) یک عدد است که به یک فایل باز اشاره میکند. هر پردازش مجموعه توصیفگرهای فایل اختصاصی خود را دارد، اما FDها از پردازش پدر به پردازشهای فرزند به ارث میرسند.
هر پردازشی سه FD را از پدرش به ارث خواهد برد: 0 (ورودی استاندارد)، باز برای خواندن، و 1 (خروجی استاندارد)، و 2 (خطای استاندارد) باز برای نوشتن. پردازشی که بدون یکی از اینها یا بیشر، شروع بشود ممکن است به طور غیر قابل پیشبینی رفتار کند. (بنابراین هرگز stderr را نبندید. به جای آن همیشه به /dev/null هدایت نمایید.)
امکان دارد پردازشها چنانکه لازم باشد (تا هر اندازهای که محدودیت آن را سیستم عامل تحمیل کند) توصیفگر فایل اضافه باز کنند. در اکثر زبانها، وقتی شما فایل جدیدی باز میکنید، شماره FD که سیستم عامل انتحاب میکند به شما مسترد میشود (یا یک کتابخانه شماره FD را مدیریت میکند و جزئیات را پنهان میسازد). اگر چه، در اسکریپتهای پوسته، الگو متفاوت است: شما اول شماره FD را انتخاب میکنید، و سپس فایل را برای استفاده از آن توصیفگر، باز میکنید. این یعنی شما به عنوان نویسنده اسکریپت، باید از آن FDهایی که در حال استفاده برای هر وظیفهای هستید، پیوسته آگاهی داشته باشید.
پوستهها برای کار با توصیفگرهایفایل از تغییر مسیر استفاده میکنند. برای FDهای از قبل موجود، با استفاده از ترکیب دوتایی کردن توصیفگرفایل، خروجی میتواند، به آنها ارسال گردد, یا ورودی میتواند از آنها خوانده شود:
echo "unexpected error: $foo" 1>&2 while read -r line 0<&3; do ...ادامه مطلب
در بسیاری از زبانها، نقلقولها اساساً برای مشخص نمودن آنکه متن محصور بین آنها به عنوان یک نوع دادهِ رشتهای تفسیر گردد، به کار میروند، اما در برنامهنویسی پوسته، تقریباً همه چیز یک رشته است، بنابراین نقلقول در پوسته اثرات و مقاصد بسیار متفاوتی دارد. چند نوع نقلقول وجود دارد که اصولاً روشهای متفاوتی از تفسیر محتویاتشان را فعال میکنند. متأسفانه، غالباً یادگیری قواعد آن برای نوآموزان دشوار است و در اِزای چند حالت ویژه و استثناهایی برای به خاطر سپردن، رفتارشان با متن تغییر میکند. همچنین متأسفانه، نقلقول در برنامهنویسی پوسته بینهایت اهمیت دارد. از مواردی است که شخص نمیتواند از یادگیری آن اجتناب کند. نقلقول نادرست در پوسته یکی از رایجترین منابع باگهای اسکریپتنویسی و مسائل امنیتی میباشد. خوشبختانه، اکثر اوقات انجام درست آن با پیروی از چند راهبرد امکان پذیر است، اما در مورد نقلقول حدسی عمل نکنید. وقتی مردد هستید، تست کنید، و صفحه man در مورد چگونه تفسیر شدن نقلقولها در یک زمینه مفروض را بخوانید.
ادامه مطلب"glob"زیرنویس1 نام رایج برای یک مجموعه از ویژگیهای Bash است که انواع معینی از الگوها را انطباق یا بسط میدهد. برخی مترادفها برای globbing (نسبت به مضمونی که در آن ظاهر میشود) انطباق الگو، بسط الگو، بسط نام فایل، و مانند آن میباشند. یک glob ممکن است مانند *.txt به نظر آید و موقعی که برای انطباق نام فایلها به کار میرود، گاهی اوقات یک کاراکتر عام نامیده میشود.
globهای سنتی پوسته ترکیب دستوری بسیار سادهای را به کار میبرند، که نسبت به عبارت منظم کمتر گویا میباشند. در یک glob با اکثر کاراکترها به طور لفظی رفتار میشود، اما یک کاراکتر * با هیچ یا چند کاراکتر مطابقت میکند یک کاراکتر ? صریحاً با یک کاراکتر مطابقت میکند، و [...] بر هر کاراکتر منفرد در یک مجموعه مشخص شده منطبق میگردد ( محدودهها در پایین را ببینید). به طور ضمنی شروع و انتهای تمام globها مهار میگردد. برای مثال:
ادامه مطلبعبارتهای منظم (RE) یک ساختار دانش کامپیوتر میباشند، و برای تعیین اینکه آیا یک رشته با برخی انواع الگو مطابقت دارد به کار میروند. گونههای بیشماری شامل هر دو تنوع دستوری و معنایی وجود دارد. اجازه بدهید با تئوری آغاز کنیم.
Aیک عبارت منظم متشکل از سه ویژگی است:
الحاق. دو عبارت منظم میتوانند یکی پس از دیگری نوشته شوند. عبارت بزرگتر حاصل با یک رشته ورودی منطبق خواهد گردید «اگر و فقط اگر» آن قسمت از رشته ورودی که با عبارت کوچکتر اول مطابقت دارد بلافاصله با قسمتی که با عبارت کوچک دوم مطابقت مینماید، دنبال شود.
اتحاد. این به طور اساسی یک عملگر «یا» میباشد. اگر یکی از عبارتهای کوچکتر با ورودی منطبق گردد، عبارت بزرگتر با ورودی منطبق خواهد شد.
Closure. که "Kleene closure" (کلی-نی تلفظ شده)نیز نامیده میشود. عبارت کوچک میتواند صفر یا چند بار به منظور انظباق با ورودی تکرار گردد.
(من در اینجا مشغول استفاده از زبان ریاضی نیستم. اگر شما تعاریف رسمی را نیاز دارید، لطفاً به جای این یک کتاب درسی دانش کامپیوتر را ملاحظه نمایید.)
ادامه مطلب