پوسته Bash امکان انجام کارهای بسیاری برای شما فراهم میکند، ارائه قابلیت انعطافپذیری قابل ملاحظه به شما. متأسفانه، خیلی کم شما را از سوءمصرف و دیگر رفتارهای نامطلوب، بر حذر میدارد. امید میرود، اشخاص خودشان دریابند که از برخی مسائل معین باید به هر قیمتی پرهیز نمایند.
متأسفانه بسیاری اشخاص به اندازه کافی دقیق و مراقب نیستند که بخواهند خودشان موشکافی کنند. آنها بدون اندیشیدن در مورد مسائل، مینویسند و بسیاری از اسکریپتهای خطرناک و مهیب به محیطهای تولید و یا توزیعهای لینوکس ختم میشود. نتیجه اینها، و حتی اسکریپتهای خیلی شخصی شما در یک شرایط اهمال اغلب میتواند مصیبتآمیز بشود.
برای پاکیزگی اسکریپتهایتان، و به خاطر تمام افراد بشر، هرگز هیچ موردی از سطور زیر را انجام ندهید:
ls
هرگز تجزیه خروجی فرمان ls را انجام ندهید! خروجی فرمان ls به چند دلیل نمیتواند قابل اعتماد باشد.
اول، اگر نام فایلها شامل کاراکترهای پشتیبانی نشده زبان محلی شما باشد، ls نامها را خُرد خواهد نمود. در نتیجه، خروجی حاصل از تجزیه نام فایلها توسط ls، هرگز تضمین نمیشود که واقعاً همان نامهایی که شما قادر به یافتن آنها میباشید را به شما بدهد. ls ممکن است بعضی کاراکترها در نام فایل را با کاراکتر علامت سؤال تعویض نماید.
دوم، ls سطرهای دادهها را بر اساس کاراکتر سطر جدید تفکیک میکند. به این طریق، هر تکه از اطلاعات یک فایل در یک سطر است. متأسفانه، نام فایلها نیز خودشان میتوانند شامل سطر جدید باشند. این به معنی آنست که اگر شما فایلی در دایرکتوری جاری با نام شامل کاراکتر سطر جدید داشته باشید، کاملاً نتیجه تجزیه شما را درهم میریزد و اسکریپت شکست میخورد!
آخر از همه، اما نه کم اهمیتتر، قالب خروجی فرمان ls
در موقعیتهای بسیاری جایگزینهایی برای ls وجود دارد. اگر لازم است که شما با زمان ویرایش فایل کار کنید، به طور نمونه میتوانید از بررسیهای Bash استفاده کنید. اگر هیچ یک از آنها میسر نباشد، پیشنهاد میکنم زبان متفاوتی، همچون پرل یا python انتخاب کنید.
ls
هرگز نام فایل ها را با grep بررسی یا فیلتر نکنید! غیر از آنکه الگوی grep شما واقعاً هوشمند باشد، این کار احتمالاً قابل اطمینان نخواهد بود.
در نمونه اول مثال فوق، بررسی با هر دو مورد
جایگزین آن globbing نامیده میشود(
cat
برنامه cat را برای خوراندن محتویات یک فایل منفرد به یک فیلتر به کار نبرید. cat یک ابزار مورد استفاده برای الحاق محتویات چند فایل با یکدیگر است.
برای تغذیه محتویات فایلی به یک پردازش، احتمالاً میتوانید نام فایل را به عنوان شناسه تحویل برنامه مورد نظر(مانند grep '
اگر مستندات برنامه هیچ راهی برای انجام این کار تعیین نکرده است، باید از تغییر مسیر استفاده کنید (read
از حلقه for برای خواندن سطرهای یک فایل استفاده نکنیم. به جای آن حلقه while read را به کار ببریم.
به خاطر خدا و به خاطر تمام مقدسات، از برنامه seq برای شمارش استفاده نکنید.
Bash به اندازه کافی در انجام شمارش توانمند است. نیازی به یک برنامه خارجی(مخصوصاً یک برنامه تک سکویی) برای انجام محاسبه و ارسال آن به خروجی Bash جهت تفکیک کلمه، ندارید. ترکیب دستوری
باید در Bash نگارش 3 به بعد، از این:
اگر شما عملاً یک جریانی از اعداد که با کاراکتر سطر جدید از هم جدا شدهاند، هنگام بررسی ورودی میخواهید، این مورد را در نظر بگیرید: printf
expr یک عتیقه رُم باستان است. آن را به کار نبرید.
این برنامه در اسکریپتهای نوشته شده برای پوستههایی با امکانات بسیار محدود، به کار میرفت. اساساً با استفاده از آن در حال ایجاد یک پردازش جدید هستید که برنامه C دیگری برای انجام برخی محاسبات را برایتان فراخوانی نماید و نتایج را به صورت رشته به bashتحویل بدهد. Bash تمام اینها را خودش میتواند خیلی سریعتر، و به طور قابل اعتمادتر (بدون تبدیل عدد به ->رشته -> به عدد) و در همه حال بهتر، انجام بدهد.
شما در Bash باید از این استفاده کنید: let
حتی پوسته POSIX بورن میتواند محاسبات را انجام بدهد:
فرمان test که به عنوان [ نیز شناخته شده، یک برنامه کاربردی است که به طور معمول جایی در /usr/bin یا /bin استقرار مییابد و خیلی زیاد توسط برنامهنویس پوسته برای اجرای آزمایشهای معینی با متغیرها و فایلها، به کار میرود. در تعدادی از پوستهها، از جمله Bash, دستور test به صورت دستور داخلی پوسته نیز پیادهسازی گردیده است.
این مورد میتواند نتایج شگفانگیزی فراهم نماید، به ویژه برای آنان که شروع به اسکریپتنویسی پوسته مینمایند و تصور میکنند
اگر از پوسته sh استفاده میکنید، انتخاب کمی دارید و استفاده از test تنها راه انجام اکثر بررسیهایتان میباشد.
گرچه اگر از Bash در اسکریپتنویسی استفاده میکنید(و من فرض میکنم چنین است، چون در حال خواندن این راهنما هستید)، پس میتوانید از کلید واژه
اجازه بدهید تشریح کنم که چگونه
$var = '' $[ $ var = '' ]&& echo True -bash: [: =: unary operator expected $[ "$ var "= '' ]&& echo TrueTrue $[[ $ var = '' ]] && echo TrueTrue
قسمت
بله، test متغیر تهی
حال آنکه،
$var = $[ "$ var "< a ]&& echo True-bash: a: No such file or directory $[ "$ var "\< a ]&& echo TrueTrue $[[ $ var < a ]] && echo TrueTrue
در این مثال سعی نمودهایم یک مقایسه رشتهای بین یک متغیر تهی و '
ما توسط تغییر مسیر فایل گَزیده شدهایم. چون test دقیقاً یک برنامه کاربردی است، کاراکتر
با استفاده از
حتی خطرناکتر، استفاده از عملگر
$var = a $[ "$ var "> b ]&& echo True|| echo FalseTrue $[[ "$ var "> b ]] && echo True|| echo FalseFalse
دو نتیجه متفاوت، شگرف. به من اعتماد کنید، وقتی میگویم، همیشه میتوانید به
با کاربرد
بنابراین به من باور داشته باشید، وقتی میگویم،
گذشته ازاین،
تنها برتری test قابلیت حمل آن است.