پوسته Bash
بَش یک پوسته یونیکس است که به صورت آزاد توسط برایان فاکس برای پروژهٔ گنو و برای جایگزینی پوسته بورن نوشته شده‌است.این پوسته اولین بار در سال ۱۹۸۹ ارائه شده و تا الان در بسیاری از نسخه‌های لینوکس و مک‌اواس، سولاریس و بی‌اس‌دی به عنوان پوسته ورود توزیع شده‌است. یک نسخه از بَش در ویندوز ۱۰ هم موجود است.
بَش یک پردازشگر دستور است که معمولاً در یک پنجرهٔ ترمینال اجرا می‌شود. این پوسته مانند همه پوسته‌های یونیکس، می‌تواند دستوراتش را از یک فایل بگیرد. همچنین این پوسته کلمات اساسی، قواعد دستوری، و بقیهٔ ویژگی‌های اساسی را از پوسته‌ی بورن کپی کرده‌است. ویژگی‌های دیگری مثل تاریخ از پوستهٔ سی و پوستهٔ کورن کپی شده‌است. بَش منطبق با استاندارد پازیکس است.
نام بَش سرنام Bourne-again shell در انگلیسی است که یک بازی با کلمات و ایهام است به این ترتیب که هم اشاره به پوستهٔ بورن می‌کند و هم به کلمهٔ اشاره دارد که به معنی «دوباره متولد شده» است.
یک حفرهٔ امنیتی موجود در پوستهٔ بَش از زمان ورژن ۱/۰۳ (اوت ۱۹۸۹)، معروف به «شوک پوسته» در سپتامبر سال ۲۰۱۴ کشف شد و به سرعت باعث یک سری حمله در پهنهٔ اینترنت شد. هنگامی که محل اشکال پیدا شد، به سرعت تغییرات به‌روزرسانی انجام شد و مسئله رفع شد.
برایان فاکس دهم ژانویهٔ ۱۹۸۸ از طرف ریچارد استالمن به کار گرفته شد. استالمن و بنیاد نرم‌افزار آزاد به قدری پروژه‌ی بَش را مهم و راهبردی می‌دیدند که خودشان این پروژه را سرمایه‌گذاری و تأمین اعتبار کردند.
فاکس ماه ژوئن ۱۹۸۹ ورژن ۰/۹۹ را به عنوان نسخه آزمایشی عرضه کرد و تا زمانی که توسط بنیاد نرم‌فزار آزاد تعدیل نیرو شد نگهدارنده‌ی اصلی این پوسته بود. بعد از او این مسئولیت به یکی دیگر از توسعه‌دهنده‌های اولیه‌ی بَش یعنی چت رامی سپرده شد.
از آن زمان، بَش با اختلاف زیاد از بقیه‌ی پوسته‌ها، به عنوان محبوب‌ترین پوسته میان کاربران یونیکس تبدیل شد. هم‌اکنون در بسیاری از نسخه‌های لینوکس و در مک او اس به عنوان پوسته پیش‌فرض موجود می‌باشد.
قواعد دستوری فرمان‌های بَش ابر مجموعه‌ی قواعد دستوری فرمان‌های پوسته بورن هستند. بَش از افزونه آکولادی، تکمیل خط فرمان، اشکال‌زدایی کردن ابتدایی، رفع و رجوع استثناها و بقیه‌ی موارد پشتیبانی می‌کند. بَش می‌تواند اکثریت بسیار بالایی از اسکریپت‌های پوسته‌ی بورن را بدون نیاز به تغییر اجرا کند. بش بعضی از ایده‌ها را از پوسته کورن (KSH) و بعضی را از پوسته‌ی سی (CSH) گرفته‌است.
سابقه‌ی فرمان‌های اجرا شده ویژگی بسیار خوب و پررنگ بش است که به کاربر اجازه می‌دهد، دستوراتی که قبلا اجرا شده را با فشار دادن دکمه بالا یا arrow up به ترتیب ببیند یا اجرا کند. پشته‌ی پوشه، متغیرهای و جایگزینیِ فرمانِ پازیکس هستند.
وقتی کاربر دستوری را وارد میکند و دکمهٔ را در پوستهٔ بَش فشار می‌دهد، تمامی دستور‌های مشابه نشان داده می‌شوند.
بَش به نسبت پوسته‌ی بورن قابلیت‌های بیشتری دارد. بَش توانایی انجام محاسبات اعداد کامل را بدون شاخه کردن فرایند جدید را دارد. بَش از فرمان و قاعدهٔ برای این منظور استفاده می‌کند. قواعد دستوری بَش تغییر مسیر ورودی و خروجی را ساده‌تر کرده. مثلاً بَش می‌تواند خروجی استاندارد و خطای استاندارد را با هم با عمل‌گر انجام دهد. معادل این عمل در پوستهٔ بورن است که کمی پیچیده‌تر از معادل بَش آن است. بش از عمل «جایگزینی فرایند» پشتیبانی می‌کند که با دستور انجام می‌شود. دستور جایگزینی فرایند در جایی به کار می‌رود که ورودی یا خروجی فرایندی جایگزین یک فایل در یک دستور دیگری که فایل را به عنوان ورودی یا خروجی بگیرد شود. مانند: sort filename
دستور sort فایل داده شده را مرتب‌سازی می‌کند، می‌تواند به جای اسم فایل خروجی یک فرایند دیگر را به همراه دستور جایگزین فرایند به عنوان یکی از پارامترهای ورودی بگیرد مثلاً به شکل زیر: کلیدواژه‌ی تابع برای پوسته‌ی بش قابل تعریف اما برای پوسته‌های بورن، کورن و استاندارد پازیکس نامفهوم است. در صورتی که بَش تعریف تابع به آن صورت که در پوسته‌های بش و کورن انجام می‌شود را می‌پذیرد. به این خاطر و به دلایل دیگری، اسکریپت‌های بَش به جز در مواردی که عمداً و با احتیاط برای اجرا شدن در پوسته‌های بورن و کورن نوشته شده باشند، قابلیت اجرا در این پوسته‌ها را ندارند.
در فوریه ۲۰۰۹، بَش ویژگی آرایه‌های شرکت‌پذیر را معرفی و پشتیبانی کرد. آرایه‌های شرکت‌پذیر امکان پشتیبانی مصنوعی از آرایه‌های چند بعدی را فراهم می‌کنند به همان صورت که ابزار این‌کار را می‌کند. ورژن‌های چهار بَش به دلایل محدودیت‌های مربوط به پروانه در مک‌اواس به کار گرفته نشده‌اند.
بش می‌تواند بر خلاف پوسته‌ی بورن، بدون اجرا کردن پروسه‌ای بیرونی بر روی اعداد صحیح محاسباتی را انجام دهد. بش از شکل دستوری codice_1 و متغیر codice_2 برای اینکار استفاده می‌کند. شکل دستورهای بش بگونه‌ای است که امکان تغییر مسیر ورودی/خروجی را به شکل ساده‌ای به کاربر می‌دهد. به عنوان نمونه بش می‌تواند خروجی استاندارد (stdout) و خطای استاندارد (stderr) را توسط اپراتور پازیکس تبعیت می‌کند.
ایدهٔ افزونه آکولادی خاصیتی است که از csh (پوسته‌ی سی) گرفته شده. این خاصیت برای تولید ترکیب‌ها استفاده می‌شود. متن‌های تولید شده الزاماً اسامی فایل‌ها نیستند. این خاصیت در پوستهٔ بورن وجود ندارد.
فرمان‌های زیر کاربرد افزونه آکولادی را نشان می‌دهند. $ echo a{p,c,d,b}e ape ace ade abe ad ae af bd be bf cd ce cf
$ ls file1 file2 file3 file4 $ ls file4 همین‌طور توجه داشته باشید که افزونه آکولادی قبل از بسط اسم فایل صورت می‌گیرد: $ ls xxx1 yyy2 zzz2 file4 a xxx1 yyy2 zzz2 فرمان آخر فرمان لیست فایل‌هایی است که اسمشان شامل سه حرف دلخواه در ابتدا و یکی از شماره‌های یک، دو، سه و چهار برای حرف چهارم و آخر هست. فرمان بالا (فرمان آخر) دقیقاً مساوی فرمان زیر می‌باشد. ls ???1 ???2 ???3 ???4 همان‌طور که در بالا می‌بینید افزونه آکولادی ابتدا فرمان را بسط داده و سپس افزونه اسم فایل اجرا شده و نتیجهٔ آن به فرمان () به عنوان ورودی داده می‌شود.
افزونه آکولادی هم لیستی از گزینه‌ها برای بسط را پشتیبانی می‌کند و هم یک بازه را می‌پذیرد: در فرمان‌های بالا، فرمان اول یک لیست را گرفته و افزونه می‌دهد و فرمان دوم یک بازه را گرفته و افزونه می‌دهد. بازه می‌تواند شامل دو عدد یا دو حرف به عنوان ابتدا و انتها باشد.
در ورژن‌های جدید بَش، افزونه آکولادی بازه به همراه فاصله بین عناصر سری را پشتیبانی می‌کند. $ ls x1 x2 x3 x4 x5 x6 x2 x4 x6 در فرمان بالا افزونه آکولادی سه عدد را گرفته که اولی از سمت چپ (۲) عدد یا حرف شروع‌کنندهٔ سری بوده، عدد دوم (۶) عدد انتهایی سری، و عدد سوم (۲) فاصلهٔ بین عناصر سری هستند.
وقتی بَش شروع به اجرا می‌شود، فرمان‌هایی را در فایل‌های مختلف مخفی (آنهایی که اسمشان با نقطه شروع می‌شود) اجرا می‌کند. با این‌که این فایل‌های راه‌اندازی شبیه به اسکریپت‌های عادی بَش هستند، مثل بقیهٔ اسکریپت‌های عادی نیازی به اجازهٔ دسترسی برای اجرا (پرچم ) ندارند.
بَش دو حالت اجرا دارد: اجرای دسته‌ای، و اجرای هم‌روند.
برای اجرای فرامین در حالت دسته‌ای، فرامین باید با حرف codice_4 جدا شوند یا در خط‌های جدا از هم نوشته شوند. مثال: codice_5
در مثال بالا هر موقع فرمان اول codice_4 اجرا شد، کامل شد و خارج شد فرمان دوم codice_4 اجرا خواهد شد.
برای اجرای هم‌روند دو فرایند، باید پوسته قابلیت اجرا کردن فرمان در پس‌زمینه را داشته باشد. بَش این قابلیت را داراست. برای اجرا کردن فرمانی در پس‌زمینه باید از علامت codice_4 به طریق زیر استفاده شود. farman & در فرمان بالا، بَش فرمانِ codice_4 را در پشت زمینه اجرا می‌کند. البته چون خروجی استاندارد و خطای استاندارد این فرایند تغییر مسیر داده نشده و هنوز به ورودی ترمینال اشاره می‌کنند، اگر فرایند مذکور چیزی به خروجی استاندارد یا خطای استاندارد خود را برای چاپ بفرستند ترمینال آن را دریافت و چاپ خواهد کرد.
برای این‌که مسیر استاندارد خروجی را از ورودی ترمینال منحرف کنیم و تغییر بدهیم از فرمان زیر استفاده می‌کنیم.
farman > file & فرمان بالا خروجی استاندارد فرمان را به یک فایل تغییر مسیر می‌دهد. چنان‌چه فرایند نشأت گرفته از فرمان codice_4 به خروجی استاندارد خود چاپ کند، به جای ترمینال، حروف چاپ شده در فایل ذخیره خواهند شد. توجه کنید که در فرمان بالا ابتدا فایل پاک خواهد شد. برای الصاق کردن و چسباندن ورودی‌های جدید به انتهای فایل به جای پاک کردن محتوای قبلی فایل باید از فرمان زیر استفاده کرد. farman » file & فرمان بالا استاندارد خروجی فرایند ناشی از فرنان بالا را به انتهای فایل وصل می‌کند. اما اگر فرایند پیغام خطایی را به استاندارد خروجی خود برای چاپ بفرستد، هنوز این پیغام به ترمینال فرستاده خواهد شد. برای تغییر مسیر خطای استانداردِ یک فرایند از عملگرهای ویژه مانند فرمان زیر استفاده خواهد شد. farman > file 2>1& در فرمان بالا، عملگر ویژه‌ای به اضافهٔ اعداد یک و دو استفاده شده که دقیقاً همین عمل‌گر و همین اعداد ابتدائاً در پوستهٔ بورن معرفی و استفاده شدند و می‌شوند. عدد ۲ نماد خطای استاندارد و عدد یک نماد خروجی استاندارد می‌باشد و زیر فرمانِ codice_4 به این معناست که بَش خطای استاندارد را به همان‌جا تغییر مسیر بدهد که خروجی استاندارد تغییر مسیر داده شده.
بَش عمل‌گر جدیدی را معرفی کرد که فرمان بالا را کمی ساده‌تر می‌کند. farman >& file & برای تعامل مستقیم با فرایندها، آن‌ها باید در پیش‌زمینه باشند و فقط یک فرایند می‌تواند در پیش‌زمینه باشد.
بَش قابلیت مدیریت و تعامل با فرایندها را دارد. برای به پیش آوردن یک فرایند پس‌زمینه باید از این قابلیت بَش استفاده کرد. فرمان codice_4 شمارهٔ یک فرایند را گرفته و آن را به پیش زمینه می‌آورد و این امکان را می‌دهد که به طرق مختلف از جمله فرستادن سیگنال به فرایند با آن تعامل کرد. $ farman & $ jobs [1]+ Running farman & $ fg %1 farman بَش با قابلیت مدیریت فرایندها این امکان را می‌دهد که کاربر به وسیلهٔ بعضی از فرامین سیگنال‌های کنترلی را به فرایند دلخواه بفرستد.
مثلاً برای به اصطلاح «کُشتن» یا تمام کردن یک فرایند باید به وسیلهٔ فرمان codice_4 به فرایند مورد نظر سیگنال‌ها مرتبط را فرستاد. مثلاً سیگنال codice_4 زمینهٔ «اتمام نرمِ» یک فرایند را فراهم می‌آورد.
اگر دو فرایند به عنوان زیر فرایند در بَش مشغول محاسبه بودند: $ jobs [1]- Running farman1 [2]- Running farman2 برای اتمام نرم فرایند شمارهٔ ۱، سیگنال شماره ۱۵ فرستاده می‌شود: $ kill -15 %1 $ jobs [1]- Terminated farman1 [2]- Running farman2 هم‌فرایندها در بَش و پوسته‌های مشابه به فرایندهایی گفته می‌شوند که با هم اجرا شوند و با هم از طریق «پایپ»‌ها ارتباط دارند.
یکی از راه‌های سادهٔ درست کردن دو هم‌فرایند در بَش به این ترتیب است: $ mkfifo ney $ cat farman1 cat ney $ cat farman2 echo salam > ney $ ./farman1 & ./farman2 [3] 13794 salam [3]+ Done ./farman1 میانبرهای گفته شده در زیر برای حالت پیش‌فرض (ایمکس) است، میانبرهای ویم را می‌توان توسط دستور codice_15 فعال کرد.