موضوع مقاله: پوسته بش | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # پوسته بش | مقدمه: بَش یک پوسته یونیکس است که به صورت آزاد توسط برایان فاکس برای پروژهٔ گنو و برای جایگزینی پوسته بورن نوشته شده‌است.این پوسته اولین بار در سال ۱۹۸۹ ارائه شده و تا الان در بسیاری از نسخه‌های لینوکس و مک‌اواس، سولاریس و بی‌اس‌دی به عنوان پوسته ورود توزیع شده‌است. | ## بخش 1: پوسته بش | همچنین این پوسته کلمات اساسی، قواعد دستوری، و بقیهٔ ویژگی‌های اساسی را از پوسته‌ی بورن کپی کرده‌است. یک حفرهٔ امنیتی موجود در پوستهٔ بَش از زمان ورژن ۱/۰۳ (اوت ۱۹۸۹)، معروف به «شوک پوسته» در سپتامبر سال ۲۰۱۴ کشف شد و به سرعت باعث یک سری حمله در پهنهٔ اینترنت شد. هنگامی که محل اشکال پیدا شد، به سرعت تغییرات به‌روزرسانی انجام شد و مسئله رفع شد. استالمن و بنیاد نرم‌افزار آزاد به قدری پروژه‌ی بَش را مهم و راهبردی می‌دیدند که خودشان این پروژه را سرمایه‌گذاری و تأمین اعتبار کردند. فاکس ماه ژوئن ۱۹۸۹ ورژن ۰/۹۹ را به عنوان نسخه آزمایشی عرضه کرد و تا زمانی که توسط بنیاد نرم‌فزار آزاد تعدیل نیرو شد نگهدارنده‌ی اصلی این پوسته بود. بعد از او این مسئولیت به یکی دیگر از توسعه‌دهنده‌های اولیه‌ی بَش یعنی چت رامی سپرده شد. از آن زمان، بَش با اختلاف زیاد از بقیه‌ی پوسته‌ها، به عنوان محبوب‌ترین پوسته میان کاربران یونیکس تبدیل شد. هم‌اکنون در بسیاری از نسخه‌های لینوکس و در مک او اس به عنوان پوسته پیش‌فرض موجود می‌باشد. ویژگی‌ها قواعد دستوری فرمان‌های بَش ابر مجموعه‌ی قواعد دستوری فرمان‌های پوسته بورن هستند. بَش از افزونه آکولادی، تکمیل خط فرمان، اشکال‌زدایی کردن ابتدایی، رفع و رجوع استثناها و بقیه‌ی موارد پشتیبانی می‌کند. بَش می‌تواند اکثریت بسیار بالایی از اسکریپت‌های پوسته‌ی بورن را بدون نیاز به تغییر اجرا کند. بش بعضی از ایده‌ها را از پوسته کورن (KSH) و بعضی را از پوسته‌ی سی (CSH) گرفته‌است. سابقه‌ی فرمان‌های اجرا شده ویژگی بسیار خوب و پررنگ بش است که به کاربر اجازه می‌دهد، دستوراتی که قبلا اجرا شده را با فشار دادن دکمه بالا یا arrow up به ترتیب ببیند یا اجرا کند. وقتی کاربر دستوری را وارد میکند و دکمهٔ تَب را در پوستهٔ بَش فشار می‌دهد، تمامی دستور‌های مشابه نشان داده می‌شوند. مثلاً بَش می‌تواند خروجی استاندارد و خطای استاندارد را با هم با عمل‌گر انجام دهد. دستور جایگزینی فرایند در جایی به کار می‌رود که ورودی یا خروجی فرایندی جایگزین یک فایل در یک دستور دیگری که فایل را به عنوان ورودی یا خروجی بگیرد شود. مانند: sort filename دستور sort فایل داده شده را مرتب‌سازی می‌کند، می‌تواند به جای اسم فایل خروجی یک فرایند دیگر را به همراه دستور جایگزین فرایند به عنوان یکی از پارامترهای ورودی بگیرد مثلاً به شکل زیر: sort <(ls -l) کلیدواژه‌ی تابع برای پوسته‌ی بش قابل تعریف اما برای پوسته‌های بورن، کورن و استاندارد پازیکس نامفهوم است. در صورتی که بَش تعریف تابع به آن صورت که در پوسته‌های بش و کورن انجام می‌شود را می‌پذیرد. به این خاطر و به دلایل دیگری، اسکریپت‌های بَش به جز در مواردی که عمداً و با احتیاط برای اجرا شدن در پوسته‌های بورن و کورن نوشته شده باشند، قابلیت اجرا در این پوسته‌ها را ندارند. آرایه‌های شرکت‌پذیر امکان پشتیبانی مصنوعی از آرایه‌های چند بعدی را فراهم می‌کنند به همان صورت که ابزار این‌کار را می‌کند. ورژن‌های چهار بَش به دلایل محدودیت‌های مربوط به پروانه در مک‌اواس به کار گرفته نشده‌اند. | ## بخش 2: پوسته بش | بش می‌تواند بر خلاف پوسته‌ی بورن، بدون اجرا کردن پروسه‌ای بیرونی بر روی اعداد صحیح محاسباتی را انجام دهد. شکل دستورهای بش بگونه‌ای است که امکان تغییر مسیر ورودی/خروجی را به شکل ساده‌ای به کاربر می‌دهد. به دلیل این تفاوت‌ها اسکریپت‌های نوشته شده برای بش، به ندرت در پوسته‌ی بورن یا ksh (کورن شل) قابل اجرا هستند مگر اینکه در نوشتن آن‌ها به سازگاری فرمانهای مورد استفاده توجه شود. ls ???1 ???2 ???3 ???4 همان‌طور که در بالا می‌بینید افزونه آکولادی ابتدا فرمان را بسط داده و سپس افزونه اسم فایل اجرا شده و نتیجهٔ آن به فرمان به عنوان ورودی داده می‌شود. افزونه آکولادی هم لیستی از گزینه‌ها برای بسط را پشتیبانی می‌کند و هم یک بازه را می‌پذیرد: ls x{1,4,z,f} ls x{2..5} در فرمان‌های بالا، فرمان اول یک لیست را گرفته و افزونه می‌دهد و فرمان دوم یک بازه را گرفته و افزونه می‌دهد. در ورژن‌های جدید بَش، افزونه آکولادی بازه به همراه فاصله بین عناصر سری را پشتیبانی می‌کند. $ ls x1 x2 x3 x4 x5 x6 $ ls x{2..6..2} x2 x4 x6 در فرمان بالا افزونه آکولادی سه عدد را گرفته که اولی از سمت چپ (۲) عدد یا حرف شروع‌کنندهٔ سری بوده، عدد دوم (۶) عدد انتهایی سری، و عدد سوم (۲) فاصلهٔ بین عناصر سری هستند. اسکریپت‌های راه‌اندازی وقتی بَش شروع به اجرا می‌شود، فرمان‌هایی را در فایل‌های مختلف مخفی (آنهایی که اسمشان با نقطه شروع می‌شود) اجرا می‌کند. با این‌که این فایل‌های راه‌اندازی شبیه به اسکریپت‌های عادی بَش هستند، مثل بقیهٔ اسکریپت‌های عادی نیازی به اجازهٔ دسترسی برای اجرا (پرچم ) ندارند. ترتیب اجرای فایل‌های راه‌اندازی وقتی بَش به عنوان پوستهٔ تعاملیِ ورودی (ورود به سیستم) اجرا می‌شود بَش فایل را اگر وجود داشته باشد خوانده و اجرا می‌کند. بعد از خواندن و اجرا کردن این فایل، بش به ترتیب دنبال فایل‌های و و می‌گردد و هرکدام را که اول از همه پیدا کرد و قابل خواندن بود اجرا می‌کند. وقتی بَشِ ورودی خارج می‌شود بَش فایل را اگر وجود داشته باشد خوانده و اجرا می‌کند. وقتی بش به عنوان پوستهٔ تعاملی ولی نه پوستهٔ ورودی به سیستم اجرا می‌شود بش فایل را خوانده و اجرا می‌کند. گزینهٔ اما بَش را مجبور می‌کند به جای خواندن و اجرا کردن ، فرمان‌های راه‌اندازی را از فایل خوانده و اجرا شوند. مقایسه بین ترتیب مراحل راه‌اندازی بَش با پوسته‌های بورن و سی راه‌اندازی پوستهٔ ورودی پوستهٔ بورن از برای راه‌اندازی و تنظیم محیط (و انتقال و به ارث گذاشتن برای فرایندهای فرزند) استفاده می‌کند. بَش هم می‌تواند فایل را در مرحلهٔ راه‌اندازی اجرا کند به شرط این‌که در فایل‌های و که مختص بَش هستند دستور زیر اجرا شود: . ~/.prifle برای ایجاد و حفظ هم‌سازی بین پوسته‌های بَش و بورن، می‌توان فرمان‌های ناهمساز با بَش را از فایل به بیرون از این فایل منتقل کرد. هم‌نام‌ها و توابع زیرپوسته‌های (پوسته‌هایی که از پوستهٔ والد منشعب می‌شوند) پوستهٔ ورودی بورن نمی‌توانند هم‌نام‌ها و توابعی را که در پوستهٔ ورودی تعریف شده‌اند را به ارث ببرند. اما با این‌که بَش امکان مستقیم این کار را نمی‌دهد، بَش خاصیتی دارد که با آن می‌توان به این هدف دست یافت. به این ترتیب برای این‌که همهٔ زیرپوسته‌ها هم‌نام‌ها و توابع را به ظاهر به ارث ببرند و بشناسند، باید در فایل تعریف شوند. فرمان‌های منحصر به ورود و خروج پوستهٔ سی، هم فایل مخصوص برای اجرا به هنگام ورود و هم فایل مخصوص برای اجرا به هنگام خروج هستند. | ## بخش 3: پوسته بش | برای شبیه‌سازی فایل مخصوص خروج باید از فرمان داخلی و گرفتن سیگنال‌های وقفه استفاده کرد. بَش برای خروج، راه‌کاری مشابه پوستهٔ سی دارد و فایل برای اجرای فرامین هنگام خروج استفاده می‌شود. اما برای ورود، چون بَش ابتدا فایل را پیدا کرده و اجرا می‌کند فایل را اجرا نمی‌کند مگر فایل وجود نداشته باشد، غیرقابل خواندن باشد، یا وجود داشته باشد و فایل را از داخل فایل به صورت زیر فرابخواند. برای اجرای فرامین در حالت دسته‌ای، فرامین باید با حرف جدا شوند یا در خط‌های جدا از هم نوشته شوند. برای اجرای هم‌روند دو فرایند، باید پوسته قابلیت اجرا کردن فرمان در پس‌زمینه را داشته باشد. البته چون خروجی استاندارد و خطای استاندارد این فرایند تغییر مسیر داده نشده و هنوز به ورودی ترمینال اشاره می‌کنند، اگر فرایند مذکور چیزی به خروجی استاندارد یا خطای استاندارد خود را برای چاپ بفرستند ترمینال آن را دریافت و چاپ خواهد کرد. برای این‌که مسیر استاندارد خروجی را از ورودی ترمینال منحرف کنیم و تغییر بدهیم از فرمان زیر استفاده می‌کنیم. چنان‌چه فرایند نشأت گرفته از فرمان به خروجی استاندارد خود چاپ کند، به جای ترمینال، حروف چاپ شده در فایل ذخیره خواهند شد. برای الصاق کردن و چسباندن ورودی‌های جدید به انتهای فایل به جای پاک کردن محتوای قبلی فایل باید از فرمان زیر استفاده کرد. اما اگر فرایند پیغام خطایی را به استاندارد خروجی خود برای چاپ بفرستد، هنوز این پیغام به ترمینال فرستاده خواهد شد. برای تغییر مسیر خطای استانداردِ یک فرایند از عملگرهای ویژه مانند فرمان زیر استفاده خواهد شد. farman > file 2>1& در فرمان بالا، عملگر ویژه‌ای به اضافهٔ اعداد یک و دو استفاده شده که دقیقاً همین عمل‌گر و همین اعداد ابتدائاً در پوستهٔ بورن معرفی و استفاده شدند و می‌شوند. عدد ۲ نماد خطای استاندارد و عدد یک نماد خروجی استاندارد می‌باشد و زیر فرمانِ به این معناست که بَش خطای استاندارد را به همان‌جا تغییر مسیر بدهد که خروجی استاندارد تغییر مسیر داده شده. فرمان شمارهٔ یک فرایند را گرفته و آن را به پیش زمینه می‌آورد و این امکان را می‌دهد که به طرق مختلف از جمله فرستادن سیگنال به فرایند با آن تعامل کرد. مثلاً برای به اصطلاح «کُشتن» یا تمام کردن یک فرایند باید به وسیلهٔ فرمان به فرایند مورد نظر سیگنال‌ها مرتبط را فرستاد. : انتقال مکان‌نما به ابتدای خط (معادل کلید ) : انتقال مکان‌نما به انتهای خط (معادل کلید ) : فراخوانی فرمان قبلی (معادل کلید ) : فراخوانی فرمان بعدی (معادل کلید ) : جستجوی آخرین فرمانی که دارای کارکتر (های) مشخصی باشد. : پاک کردن محتویاتی از خط که قبل از مکان‌نما وجود دارند و کپی کردن آن‌ها درون بریده‌دان. : پاک کردن محتویاتی از خط که بعد از مکان‌نما وجود دارند و کپی کردن آن‌ها درون بریده‌دان. (تنها در زمانی این اتفاق می‌افتد که متنی در خط فعلی موجود نباشد) : ارسال یک سیگنال از نوع SIGINT به پروسهٔ فعلی، که باعث پایان اجرا و بسته شدن آن می‌شود. | ## جمع‌بندی | : برش کلمهٔ واقع در قبل از مکان‌نما : برش کلمهٔ واقع در بعد از مکان‌نما : تبدیل تمام حروف کوچک به بزرگ، واقع در بعد از مکان‌نما تا انتهای کلمهٔ فعلی : تبدیل تمام حروف بزرگ به کوچک، واقع در بعد از مکان‌نما تا انتهای کلمهٔ فعلی : تبدیل حرف واقع در زیر مکان‌نما از کوچک به بزرگ و رفتن به انتهای کلمهٔ فعلی : انصراف تغییرات و برگرداندن محتویات خط فعلی به همان شکلی که در تاریخچهٔ خط فرمان موجود بود.