پوسته Bash
بَش (به انگلیسی: Bash) یک پوسته یونیکس است که به صورت آزاد توسط برایان فاکس (به انگلیسی: Brian Fox) برای پروژهٔ گنو و برای جایگزینی پوسته بورن نوشته شدهاست.این پوسته اولین بار در سال ۱۹۸۹ ارائه شده و تا الان در بسیاری از نسخههای لینوکس و مکاواس، سولاریس و بیاسدی به عنوان پوسته ورود توزیع شدهاست. یک نسخه از بَش در ویندوز ۱۰ هم موجود است.
نویسنده(های) اصلی | Brian Fox |
---|---|
توسعهدهنده(ها) | Chet Ramey |
انتشار پایدار | ۴٫۱٫۷
۱۴ مه ۲۰۱۰ |
مخزن | |
نوشتهشده با | سی |
سیستمعامل | چندسکویی |
در دسترس به | چندزبانه |
گونه | پوسته یونیکس |
پروانه | جیپیال نسخهٔ ۳ |
وبگاه |
بَش یک پردازشگر دستور است که معمولاً در یک پنجرهٔ ترمینال اجرا میشود. این پوسته مانند همه پوستههای یونیکس، میتواند دستوراتش را از یک فایل بگیرد. همچنین این پوسته کلمات اساسی، قواعد دستوری، و بقیهٔ ویژگیهای اساسی را از پوستهی بورن کپی کردهاست. ویژگیهای دیگری مثل تاریخ از پوستهٔ سی و پوستهٔ کورن کپی شدهاست. بَش منطبق با استاندارد پازیکس است.
نام بَش سرنام Bourne-again shell در انگلیسی است که یک بازی با کلمات و ایهام است به این ترتیب که هم اشاره به پوستهٔ بورن میکند و هم به کلمهٔ born again اشاره دارد که به معنی «دوباره متولد شده» است.
یک حفرهٔ امنیتی موجود در پوستهٔ بَش از زمان ورژن ۱/۰۳ (اوت ۱۹۸۹)، معروف به «شوک پوسته» در سپتامبر سال ۲۰۱۴ کشف شد و به سرعت باعث یک سری حمله در پهنهٔ اینترنت شد. هنگامی که محل اشکال پیدا شد، به سرعت تغییرات بهروزرسانی انجام شد و مسئله رفع شد.
تاریخ
برایان فاکس دهم ژانویهٔ ۱۹۸۸ از طرف ریچارد استالمن به کار گرفته شد. استالمن و بنیاد نرمافزار آزاد به قدری پروژهی بَش را مهم و راهبردی میدیدند که خودشان این پروژه را سرمایهگذاری و تأمین اعتبار کردند.
فاکس ماه ژوئن ۱۹۸۹ ورژن ۰/۹۹ را به عنوان نسخه آزمایشی عرضه کرد و تا زمانی که توسط بنیاد نرمفزار آزاد تعدیل نیرو شد نگهدارندهی اصلی این پوسته بود. بعد از او این مسئولیت به یکی دیگر از توسعهدهندههای اولیهی بَش یعنی چت رامی سپرده شد.
از آن زمان، بَش با اختلاف زیاد از بقیهی پوستهها، به عنوان محبوبترین پوسته میان کاربران یونیکس تبدیل شد. هماکنون در بسیاری از نسخههای لینوکس و در مک او اس به عنوان پوسته پیشفرض موجود میباشد.
ویژگیها
قواعد دستوری فرمانهای بَش ابر مجموعهی قواعد دستوری فرمانهای پوسته بورن هستند. بَش از افزونه آکولادی، تکمیل خط فرمان، اشکالزدایی کردن ابتدایی، رفع و رجوع استثناها و بقیهی موارد پشتیبانی میکند. بَش میتواند اکثریت بسیار بالایی از اسکریپتهای پوستهی بورن را بدون نیاز به تغییر اجرا کند. بش بعضی از ایدهها را از پوسته کورن (KSH) و بعضی را از پوستهی سی (CSH) گرفتهاست.
سابقهی فرمانهای اجرا شده ویژگی بسیار خوب و پررنگ بش است که به کاربر اجازه میدهد، دستوراتی که قبلا اجرا شده را با فشار دادن دکمه بالا یا arrow up به ترتیب ببیند یا اجرا کند. پشتهی پوشه، متغیرهای $RANDOM و $PPID جایگزینیِ فرمانِ پازیکس $(...) هستند.
وقتی کاربر دستوری را وارد میکند و دکمهٔ tab را در پوستهٔ بَش فشار میدهد، تمامی دستورهای مشابه نشان داده میشوند.
بَش به نسبت پوستهی بورن قابلیتهای بیشتری دارد. بَش توانایی انجام محاسبات اعداد کامل را بدون شاخه کردن فرایند جدید را دارد. بَش از فرمان ((..)) و قاعدهٔ $((...)) برای این منظور استفاده میکند. قواعد دستوری بَش تغییر مسیر ورودی و خروجی را سادهتر کرده. مثلاً بَش میتواند خروجی استاندارد و خطای استاندارد را با هم با عملگر >& انجام دهد. معادل این عمل در پوستهٔ بورن است که کمی پیچیدهتر از معادل بَش آن است. بش از عمل «جایگزینی فرایند» پشتیبانی میکند که با دستور (command)< انجام میشود. دستور جایگزینی فرایند در جایی به کار میرود که ورودی یا خروجی فرایندی جایگزین یک فایل در یک دستور دیگری که فایل را به عنوان ورودی یا خروجی بگیرد شود. مانند:
sort filename
دستور sort فایل داده شده را مرتبسازی میکند، میتواند به جای اسم فایل خروجی یک فرایند دیگر را به همراه دستور جایگزین فرایند به عنوان یکی از پارامترهای ورودی بگیرد مثلاً به شکل زیر:
sort <(ls -l)
کلیدواژهی تابع برای پوستهی بش قابل تعریف اما برای پوستههای بورن، کورن و استاندارد پازیکس نامفهوم است. در صورتی که بَش تعریف تابع به آن صورت که در پوستههای بش و کورن انجام میشود را میپذیرد. به این خاطر و به دلایل دیگری، اسکریپتهای بَش به جز در مواردی که عمداً و با احتیاط برای اجرا شدن در پوستههای بورن و کورن نوشته شده باشند، قابلیت اجرا در این پوستهها را ندارند.
در فوریه ۲۰۰۹، بَش ویژگی آرایههای شرکتپذیر را معرفی و پشتیبانی کرد. آرایههای شرکتپذیر امکان پشتیبانی مصنوعی از آرایههای چند بعدی را فراهم میکنند به همان صورت که ابزار AWK اینکار را میکند. ورژنهای چهار بَش به دلایل محدودیتهای مربوط به پروانه در مکاواس به کار گرفته نشدهاند.
بش میتواند بر خلاف پوستهی بورن، بدون اجرا کردن پروسهای بیرونی بر روی اعداد صحیح محاسباتی را انجام دهد. بش از شکل دستوری ((…))
و متغیر ((…))$
برای اینکار استفاده میکند. شکل دستورهای بش بگونهای است که امکان تغییر مسیر ورودی/خروجی را به شکل سادهای به کاربر میدهد. به عنوان نمونه بش میتواند خروجی استاندارد (stdout) و خطای استاندارد (stderr) را توسط اپراتور <& در یک زمان تغییرمسیر دهد. همین کار را در پوسته بورن باید توسط 'command> file 2>&1'
انجام داد که نسبت به بش سختتر است. به دلیل این تفاوتها اسکریپتهای نوشته شده برای بش، به ندرت در پوستهی بورن یا ksh (کورن شل) قابل اجرا هستند مگر اینکه در نوشتن آنها به سازگاری فرمانهای مورد استفاده توجه شود. البته در حالت پازیکس خیلی بیشتر از پازیکس تبعیت میکند.
افزونه آکولادی
ایدهٔ افزونه آکولادی خاصیتی است که از csh (پوستهی سی) گرفته شده. این خاصیت برای تولید ترکیبها استفاده میشود. متنهای تولید شده الزاماً اسامی فایلها نیستند. این خاصیت در پوستهٔ بورن وجود ندارد.
فرمانهای زیر کاربرد افزونه آکولادی را نشان میدهند.
$ echo a{p,c,d,b}e
ape ace ade abe
$ echo {a,b,c}{d,e,f}
ad ae af bd be bf cd ce cf
$ ls
file1 file2 file3 file4
$ rm file{1..3}
$ ls
file4
همینطور توجه داشته باشید که افزونه آکولادی قبل از بسط اسم فایل صورت میگیرد:
$ ls
xxx1 yyy2 zzz2 file4 a
$ ls ???{1..4}
xxx1 yyy2 zzz2
فرمان آخر فرمان لیست فایلهایی است که اسمشان شامل سه حرف دلخواه در ابتدا و یکی از شمارههای یک، دو، سه و چهار برای حرف چهارم و آخر هست. فرمان بالا (فرمان آخر) دقیقاً مساوی فرمان زیر میباشد.
ls ???1 ???2 ???3 ???4
همانطور که در بالا میبینید افزونه آکولادی ابتدا فرمان را بسط داده و سپس افزونه اسم فایل اجرا شده و نتیجهٔ آن به فرمان (ls) به عنوان ورودی داده میشود.
افزونه آکولادی هم لیستی از گزینهها برای بسط را پشتیبانی میکند و هم یک بازه را میپذیرد:
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
در فرمان بالا افزونه آکولادی سه عدد را گرفته که اولی از سمت چپ (۲) عدد یا حرف شروعکنندهٔ سری بوده، عدد دوم (۶) عدد انتهایی سری، و عدد سوم (۲) فاصلهٔ بین عناصر سری هستند.
اسکریپتهای راهاندازی
وقتی بَش شروع به اجرا میشود، فرمانهایی را در فایلهای مختلف مخفی (آنهایی که اسمشان با نقطه شروع میشود) اجرا میکند. با اینکه این فایلهای راهاندازی شبیه به اسکریپتهای عادی بَش هستند، مثل بقیهٔ اسکریپتهای عادی نیازی به اجازهٔ دسترسی برای اجرا (پرچم x) ندارند.
ترتیب اجرای فایلهای راهاندازی
وقتی بَش به عنوان پوستهٔ تعاملیِ ورودی (ورود به سیستم) اجرا میشود
بَش فایل /etc/profile
را اگر وجود داشته باشد خوانده و اجرا میکند. این فایل در بسیاری از موارد فایل /etc/bash.bashrc
را صدا میزند.
بعد از خواندن و اجرا کردن این فایل، بش به ترتیب دنبال فایلهای ~/.bash_profile
و ~/.bash_login
و ~/.profile
میگردد و هرکدام را که اول از همه پیدا کرد و قابل خواندن بود اجرا میکند.
وقتی بَشِ ورودی خارج میشود
بَش فایل ~/.bash_logout
را اگر وجود داشته باشد خوانده و اجرا میکند.
وقتی بش به عنوان پوستهٔ تعاملی ولی نه پوستهٔ ورودی به سیستم اجرا میشود
بش فایل /etc/bash.bashrc
را خوانده و اجرا میکند. این مرحلهٔ آغازین را میتواند با گزینهٔ --norc
جا انداخت و اجرا نکرد. گزینهٔ
--rcfile file
اما بَش را مجبور میکند به جای خواندن و اجرا کردن ~/.bashrc
، فرمانهای راهاندازی را از فایل file
خوانده و اجرا شوند.
مقایسه بین ترتیب مراحل راهاندازی بَش با پوستههای بورن و سی
راهاندازی پوستهٔ ورودی
پوستهٔ بورن از ~/.profile
برای راهاندازی و تنظیم محیط (و انتقال و به ارث گذاشتن برای فرایندهای فرزند) استفاده میکند. بَش هم میتواند فایل ~/.profile
را در مرحلهٔ راهاندازی اجرا کند به شرط اینکه در فایلهای ~/.bash_profile
و ~/.bash_login
که مختص بَش هستند دستور زیر اجرا شود:
. ~/.prifle
برای ایجاد و حفظ همسازی بین پوستههای بَش و بورن، میتوان فرمانهای ناهمساز با بَش را از فایل ~/.profile
به بیرون از این فایل منتقل کرد.
همنامها و توابع
زیرپوستههای (پوستههایی که از پوستهٔ والد منشعب میشوند) پوستهٔ ورودی بورن نمیتوانند همنامها و توابعی را که در پوستهٔ ورودی تعریف شدهاند را به ارث ببرند. اما با اینکه بَش امکان مستقیم این کار را نمیدهد، بَش خاصیتی دارد که با آن میتوان به این هدف دست یافت.
زیرپوستههای بَش برای راهاندازی فایل ~/.bashrc
را اجرا میکنند. به این ترتیب برای اینکه همهٔ زیرپوستهها همنامها و توابع را به ظاهر به ارث ببرند و بشناسند، باید در فایل ~/.bashrc
تعریف شوند.
فرمانهای منحصر به ورود و خروج
پوستهٔ سی، هم فایل مخصوص برای اجرا به هنگام ورود (~/.login
) و هم فایل مخصوص برای اجرا به هنگام خروج (~/.logout
) هستند. اما برای پوستههای بَش و بورن قضیه به این سرراستی نیست.
پوستهٔ بورن از هیچکدام از فایلهای بالا (یا مشابه آنها) پشتیبانی نمیکند. برای شبیهسازی فایل مخصوص خروج باید از فرمان داخلی trap
و گرفتن سیگنالهای وقفه استفاده کرد.
بَش برای خروج، راهکاری مشابه پوستهٔ سی دارد و فایل ~/.bash_logout
برای اجرای فرامین هنگام خروج استفاده میشود. اما برای ورود، چون بَش ابتدا فایل ~/.profile
را پیدا کرده و اجرا میکند فایل ~/.bash_login
را اجرا نمیکند مگر فایل ~/.profile
وجود نداشته باشد، غیرقابل خواندن باشد، یا وجود داشته باشد و فایل ~/.bash_login
را از داخل فایل به صورت زیر فرابخواند.
. ~/.bash_login
مدیریت فرایندها
بَش دو حالت اجرا دارد: اجرای دستهای، و اجرای همروند.
برای اجرای فرامین در حالت دستهای، فرامین باید با حرف ;
جدا شوند یا در خطهای جدا از هم نوشته شوند. مثال:
farman1; farman2
در مثال بالا هر موقع فرمان اول farman1
اجرا شد، کامل شد و خارج شد فرمان دوم farman2
اجرا خواهد شد.
برای اجرای همروند دو فرایند، باید پوسته قابلیت اجرا کردن فرمان در پسزمینه را داشته باشد. بَش این قابلیت را داراست. برای اجرا کردن فرمانی در پسزمینه باید از علامت &
به طریق زیر استفاده شود.
farman &
در فرمان بالا، بَش فرمانِ farman
را در پشت زمینه اجرا میکند. البته چون خروجی استاندارد و خطای استاندارد این فرایند تغییر مسیر داده نشده و هنوز به ورودی ترمینال اشاره میکنند، اگر فرایند مذکور چیزی به خروجی استاندارد یا خطای استاندارد خود را برای چاپ بفرستند ترمینال آن را دریافت و چاپ خواهد کرد.
برای اینکه مسیر استاندارد خروجی را از ورودی ترمینال منحرف کنیم و تغییر بدهیم از فرمان زیر استفاده میکنیم.
farman > file &
فرمان بالا خروجی استاندارد فرمان را به یک فایل تغییر مسیر میدهد. چنانچه فرایند نشأت گرفته از فرمان farman
به خروجی استاندارد خود چاپ کند، به جای ترمینال، حروف چاپ شده در فایل ذخیره خواهند شد. توجه کنید که در فرمان بالا ابتدا فایل پاک خواهد شد. برای الصاق کردن و چسباندن ورودیهای جدید به انتهای فایل به جای پاک کردن محتوای قبلی فایل باید از فرمان زیر استفاده کرد.
farman >> file &
فرمان بالا استاندارد خروجی فرایند ناشی از فرنان بالا را به انتهای فایل وصل میکند. اما اگر فرایند پیغام خطایی را به استاندارد خروجی خود برای چاپ بفرستد، هنوز این پیغام به ترمینال فرستاده خواهد شد. برای تغییر مسیر خطای استانداردِ یک فرایند از عملگرهای ویژه مانند فرمان زیر استفاده خواهد شد.
farman > file 2>1&
در فرمان بالا، عملگر ویژهای به اضافهٔ اعداد یک و دو استفاده شده که دقیقاً همین عملگر و همین اعداد ابتدائاً در پوستهٔ بورن معرفی و استفاده شدند و میشوند. عدد ۲ نماد خطای استاندارد و عدد یک نماد خروجی استاندارد میباشد و زیر فرمانِ 2>1
به این معناست که بَش خطای استاندارد را به همانجا تغییر مسیر بدهد که خروجی استاندارد تغییر مسیر داده شده.
بَش عملگر جدیدی را معرفی کرد که فرمان بالا را کمی سادهتر میکند.
farman >& file &
برای تعامل مستقیم با فرایندها، آنها باید در پیشزمینه باشند و فقط یک فرایند میتواند در پیشزمینه باشد.
بَش قابلیت مدیریت و تعامل با فرایندها را دارد. برای به پیش آوردن یک فرایند پسزمینه باید از این قابلیت بَش استفاده کرد. فرمان fg
شمارهٔ یک فرایند را گرفته و آن را به پیش زمینه میآورد و این امکان را میدهد که به طرق مختلف از جمله فرستادن سیگنال به فرایند با آن تعامل کرد.
$ farman &
$ jobs
[1]+ Running farman &
$ fg %1
farman
بَش با قابلیت مدیریت فرایندها این امکان را میدهد که کاربر به وسیلهٔ بعضی از فرامین سیگنالهای کنترلی را به فرایند دلخواه بفرستد.
مثلاً برای به اصطلاح «کُشتن» یا تمام کردن یک فرایند باید به وسیلهٔ فرمان kill
به فرایند مورد نظر سیگنالها مرتبط را فرستاد. مثلاً سیگنال SIGTERM
زمینهٔ «اتمام نرمِ» یک فرایند را فراهم میآورد.
اگر دو فرایند به عنوان زیر فرایند در بَش مشغول محاسبه بودند:
$ jobs
[1]- Running farman1
[2]- Running farman2
برای اتمام نرم فرایند شمارهٔ ۱، سیگنال شماره ۱۵ فرستاده میشود:
$ kill -15 %1
$ jobs
[1]- Terminated farman1
[2]- Running farman2
همفرایندها
همفرایندها (به انگلیسی: coprocesses) در بَش و پوستههای مشابه به فرایندهایی گفته میشوند که با هم اجرا شوند و با هم از طریق «پایپ»ها ارتباط دارند.
یکی از راههای سادهٔ درست کردن دو همفرایند در بَش به این ترتیب است:
$ mkfifo ney
$ cat farman1
cat ney
$ cat farman2
echo salam > ney
$ ./farman1 & ./farman2
[3] 13794
salam
[3]+ Done ./farman1
میانبرهای صفحهکلید
میانبرهای گفته شده در زیر برای حالت پیشفرض (ایمکس) است، میانبرهای ویم را میتوان توسط دستور set -o vi
فعال کرد.
- Tab ↹: تکمیل خودکار از جایی که مکاننما وجود دارد.
- Ctrl+a : انتقال مکاننما به ابتدای خط (معادل کلید Home)
- Ctrl+e : انتقال مکاننما به انتهای خط (معادل کلید End)
- Ctrl+p: فراخوانی فرمان قبلی (معادل کلید ↑)
- Ctrl+n: فراخوانی فرمان بعدی (معادل کلید ↓)
- Ctrl+r: جستجوی آخرین فرمانی که دارای کارکتر (های) مشخصی باشد. زدن دوبارهٔ این کلید در هنگام جستجو، به فرمان قبلیتر رجوع میکند.
- Ctrl+o: اجرای فرمانی که در جستجو یافته شد.
- Ctrl+l: پاک کردن محتویات صفحهنمایش (معادل فرمان
clear
). - Ctrl+u: پاک کردن محتویاتی از خط که قبل از مکاننما وجود دارند و کپی کردن آنها درون بریدهدان.
- Ctrl+k: پاک کردن محتویاتی از خط که بعد از مکاننما وجود دارند و کپی کردن آنها درون بریدهدان.
- Ctrl+w: پاک کردن کلمهٔ قبل از مکاننما و کپی کردن آن درون بریدهدان.
- Ctrl+y: چسباندن محتویات بریدهدان از جایی که مکاننما وجود دارد.
- Ctrl+d: ارسال یک نشانگر EOF که باعث بسته شدن خط فرمان فعلی میشود (معادل دستور
exit
). (تنها در زمانی این اتفاق میافتد که متنی در خط فعلی موجود نباشد) - Ctrl+c: ارسال یک سیگنال از نوع SIGINT به پروسهٔ فعلی، که باعث پایان اجرا و بسته شدن آن میشود.
- Ctrl+z: ارسال یک سیگنال از نوع SIGTSTP به پروسهٔ فعلی، به باعث به تعلیق درآمدن آن میشود؛ که برای برگشت دادن آن میتوان از دستور
fg process-name-or-job-id
استفاده کرد. - Ctrl+x Ctrl+e: ویرایش خط فعلی در ادیتوری که توسط متغیر EDITOR$ تعریف شدهاست.
- Alt+f: حرکت به جلو به اندازهٔ یک واژه.
- Alt+b: حرکت به عقب به اندازهٔ یک واژه.
- Alt+Del: برش کلمهٔ واقع در قبل از مکاننما
- Alt+d: برش کلمهٔ واقع در بعد از مکاننما
- Alt+u: تبدیل تمام حروف کوچک به بزرگ، واقع در بعد از مکاننما تا انتهای کلمهٔ فعلی
- Alt+l: تبدیل تمام حروف بزرگ به کوچک، واقع در بعد از مکاننما تا انتهای کلمهٔ فعلی
- Alt+c: تبدیل حرف واقع در زیر مکاننما از کوچک به بزرگ و رفتن به انتهای کلمهٔ فعلی
- Alt+r: انصراف تغییرات و برگرداندن محتویات خط فعلی به همان شکلی که در تاریخچهٔ خط فرمان موجود بود.
منابع
مشارکتکنندگان ویکیپدیا. «Bash (Unix shell)». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۳ ژوئن ۲۰۱۰.