پوسته 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 بورن میتواند محاسبات را انجام بدهد: