Shell یا پوسته یک رابط دستوری بین کاربر و هسته سیستم عامل است. لینوکس دارای چندین shell مختلف می باشد. اگرچه توزیعات لینوکسی از یک شِل به صورت پیشفرض استفاده می کنند اما کاربران میتوانند آن را تغییر داده و از shell دیگری استفاده نمایند. اگر قصد تغییر پوسته پیشفرض را دارید، آشنایی با انواع شل ها به شما کمک میکند تا دید کلی بهتری نسبت به گزینههای موجود داشته باشید. در این مقاله به بررسی ویژگیهای هشت Shell پرکاربرد لینوکس پرداخته می شود.
Shell لینوکس چیست و چرا مهم است؟
shell یک برنامه مفسر خط فرمان یا command-line است که دستورات را تجزیه و تحلیل کرده و برای سیستم عامل ارسال می نماید. اساسا این برنامه به عنوان یک رابط تعاملی بین سیستم عامل و کاربر عمل می کند و به عنوان بیرونی ترین لایه هسته سیستم عامل شناخته میشود. شل به کاربران و برنامهها اجازه میدهد تا اقدام به ارسال سیگنال نموده و از ابزارهای سطح پایین سیستم عامل استفاده نمایند.
تصویر(1)
برنامه ترمینال، تعامل با ابزارهای سیستمی را میسر می کند. زمانی که دستوری در ترمینال وارد می شود، مانند دستورات ls یا cat، شل آن را تجزیه، ارزیابی و جستجو کرده و برنامه مربوطه را در صورت یافتن، اجرا می کند.
معرفی 8 نوع Shell پرکاربرد لینوکس
در لینوکس، انواع متعددی از شل ها وجود دارد که با ویژگی های منحصر به فرد، جهت حل مسائل مختلف استفاده می شوند. شل هایی که به همراه Unix توسعه یافته، اغلب از ویژگی های یکدیگر در طول فرایند توسعه بهره گرفته اند. در ادامه به بررسی مختصر 8 نوع Shell پرکاربرد لینوکس و ویژگی های آنها پرداخته میشود.
1. Bourne Shell یا sh
Bourne Shell اولین شل پیش فرض در سیستم های یونیکس بود که در سال 1979 عرضه شد. نام برنامه این شل sh است که از مسیر bin/sh/ اجرا می گردد. خط فرمان در این شل با علامت $ برای کاربر عادی و با علامت # برای کاربر روت نمایش داده میشود.
تصویر(2)
Bourne shell یک Shell پرکاربرد لینوکس است که به سرعت محبوب شد زیرا کم حجم و سریع بود اما این شل فاقد برخی از ویژگی های استاندارد است که از جمله این موارد عبارتند از:
- این شل به صورت پیش فرض قابلیت ارزیابی عبارات منطقی و انجام محاسبات ریاضی را ندارد.
- عدم وجود قابلیت تاریخچه دستورات
- عدم وجود سایر ویژگیهای جامع همانند تکمیل خودکار
فایل اجرایی bin/sh/ در سیستمهای مدرنی که مشابه یونیکس هستند، وجود دارد. این برنامه، Bourne shell را راه اندازی نمیکند بلکه یک فایل اجرایی است که به شل پیشفرض سیستم اشاره مینماید.
تصویر(3)
در اکثر سیستم ها، هارد یا سمبولیک لینک به bash اشاره دارد اما در Ubuntu و Debian به dash ارجاع می شود. در هر دو مورد، لینک مربوطه شباهتهایی با Bourne shell را القا میکند.
2- C Shell یا csh
C Shell یا csh، یک Shell پرکاربرد لینوکس است که در اواخر دهه 1970 میلادی ارائه شد و هدف اصلی آن بهبود تعامل و الگوبرداری از زبان C بود. از آنجایی که هسته لینوکس اساسا با استفاده از زبان C نوشته شده است، این شل سعی میکند تا از نظر استایل یک هماهنگی در سراسر سیستم ایجاد نماید. منظور از هماهنگی استایل، هماهنگی با زبان C و ساختارهای موجود در سیستم های لینوکسی است تا یکپارچگی بیشتری فراهم کند.
مسیر اجرایی این شل bin/csh/ است. خط فرمان کاربران عادی با علامت % و برای کاربر روت با # مشخص می شود.
تصویر(4)
ویژگیهای تعاملی جدید C Shell شامل موارد زیر میشود:
- تاریخچه دستورات قبلی
- امکان تعریف نامهای مستعار (alias) توسط کاربر برای برنامهها
- دسترسی به دایرکتوری home (~): به کاربر امکان میدهد به دایرکتوری home خود با علامت ~ دسترسی پیدا نماید.
- Built-in expression grammar: این ویژگی به قواعد و دستورالعملهای از پیشتعیین شده درون csh برای تفسیر و ارزیابی عبارات اشاره دارد.
نقاط ضعف اصلی csh عبارتند از:
- عدم انسجام در ساختار نحوی: به دلیل عدم یکپارچگی در قواعد نحوی، این موضوع می تواند منجر به ابهام و مشکلاتی در نوشتن و درک shell script ها شود.
- عدم پشتیبانی از اشارهگرها یا توابع استاندارد ورودی یا خروجی (stdio).
- csh به طور کامل بازگشتی نمی باشد: به این معنا است که در هنگام برخورد با دستورات یا عملیاتهای تو در تو و پیچیده، محدودیتهایی دارد. رفتار بازگشتی به یک دستور یا اسکریپت اجازه میدهد تا خود را فراخوانی کند یا چند سطح از دستورات تو در تو را اجرا نماید.
csh نسبت به Bourne shell بهبود قابل توجهی در قابلیت خوانایی و عملکرد داشت. ویژگیهای تعاملی و نوآوریهای موجود در csh، روی تمامی شلهای یونیکس پس از آن تأثیر گذار بود.
3. TENEX C Shell یا tcsh
شل TENEX C یا tcsh یک نسخه توسعهیافته از csh است که در اوایل دهه 1980 با آن ادغام شد. این Shell پرکاربرد لینوکس به شکلی طراحی شده است که با csh "سازگاری عقب رو" (backward compatibility - به معنی سازگاری با سخت افزار یا نرم افزار قدیمی) دارد. همچنین این شل، ویژگیهایی را از سیستم عامل TENEX به ارث برده است.
مسیر اجرایی این شل در bin/tcsh/ قرار دارد. خط فرمان کاربر عادی به صورت hostname:directory> و خط فرمان یوزر روت به صورت #hostname:directory نمایش داده می شود. tsch شل پیش فرض یوزر روت در سیستم عامل FreeBSD است و همچنین در نسخه های اولیه Mac OS استفاده میشد.
تصویر(5)
ویژگیهای اضافی این شل شامل موارد زیر است:
- تاریخچه پیشرفته از دستورات وارد شده
- ویژگی تکمیل خودکار با قابلیت برنامهریزی
- تطبیق با الگوها (Wildcard matching): امکان تطبیق و جستجوی فایلها و دایرکتوریها بر اساس الگوهای پیچیده
- کنترل کارها (Job control): مدیریت و کنترل پروسهها در زمان اجرا
- دستور داخلی where: جهت جستجوی محل فایل یا دستورات (commands) در مسیرهای مختلف سیستم
با وجود اینکه tsch نسخه توسعه یافته csh است اما همچنان یک سری نقاط ضعف را از آن به ارث برده و در این شل نیز مشاهده می شود.
4. KornShell یا ksh
KornShell یا به اختصار ksh یک شل یونیکسی و بر پایه Bourne shell است که در اوایل دهه ۱۹۸۰ توسعه یافت. محل قرارگیری فایل اجرایی آن در مسیر bin/ksh/ یا bin/ksh93/ بوده و خط فرمان آن همانند Bourne shell است. برای کاربر عادی از علامت $ و برای روت از # استفاده میشود. این Shell پرکاربرد لینوکس ویژگیهای csh و Bourne shell را پیادهسازی میکند و هدف آن تمرکز روی هر دو ویژگی دستورات تعاملی و برنامهنویسی است. شل KornShell دارای ویژگیهای جدیدی است که عبارتند از:
- دارای توابع ریاضی داخلی و انجام محاسبات ممیز شناور
- برنامهنویسی شیءگرا
- امکان توسعه دستورات داخلی
- سازگار با Bourne shell
این شل سریعتر از C shell و Bourne shell است.
5. Debian Almquist Shell یا dash
Debian Almquist Shell یا به اختصار dash، یک Shell پرکاربرد لینوکس است که در اواخر دهه 90 میلادی بر پایه Almquist shell یا ash توسعه یافت و برای استفاده در سیستم عامل Debian بهینه شد. DASH به علت اینکه شل پیشفرض اوبونتو و دبیان می باشد، شهرت یافته است. این شل به صورت مینیمال و سازگار با استاندارد POSIX می باشد که آن را برای اسکریپت های راه اندازی OS مناسب می کند.
مسیر اجرایی آن bin/dash/ است. همچنین در اوبونتو و دبیان آدرس bin/sh/ به مسیر bin/dash/ اشاره می کند. خط فرمان این شل مشابه Bourne shell است.
تصویر(6)
ویژگیهای پوسته Dash شامل موارد زیر است:
- اجرای تا 4 برابر سریعتر از پوسته bash و سایر پوستهها
- نسبت به سایر شل ها نیازمند فضای دیسک، پردازنده و حافظه کمتری می باشد.
عیب اصلی آن عدم سازگاری با bash است. ویژگیهایی که در Dash وجود ندارند، به عنوان "bashisms" شناخته میشوند. بنابراین، اجرای اسکریپتهای bash نیازمند تغییرات و تنظیمات بیشتری برای حذف bashisms میباشد تا به درستی اجرا گردند.
6. Bourne Again Shell یا bash
Bourne Again shell یا به اختصار bash یک Shell پرکاربرد لینوکس است که به عنوان نسخه توسعه یافته Bourne shell یا sh در سال 1989 عرضه شد. bash، شل پیشفرض بسیاری از توزیعات لینوکسی و همچنین نسخه های اولیه macOS است. مسیر اجرایی آن bin/bash/ بوده و همانند Bourne shell خط فرمان آن برای یوزر های عادی با علامت $ و برای روت با # نمایش داده میشود.
تصویر(7)
پوسته Bash ویژگیهایی را معرفی میکند که در Bourne shell وجود ندارند. برخی از این ویژگیها عبارتند از:
- گسترش دستورات با استفاده از آکولاد: این قابلیت به شما اجازه میدهد تا با استفاده از آکولاد، یک مجموعه از دستورات را به صورت خودکار گسترش دهید. به عنوان مثال، با استفاده از آکولاد میتوانید مجموعهای از فایلها را به طور همزمان مشخص کنید.
- تکمیل خودکار دستورات.
- امکان عیب یابی و کنترل سیگنالها.
- تاریخچه دستورات ورودی: به شما امکان مشاهده و استفاده از تاریخچه دستورات ورودی را میدهد. با استفاده از کلیدهای دستوری مانند فلش بالا و فلش پایین، میتوانید به سابقه دستورات دسترسی پیدا نموده و آنها را به سادگی بازیابی کنید.
- دستورات شرطی: با استفاده از عبارات if و case در Bash، میتوانید دستورات شرطی را پیادهسازی کنید.
- پشتیبانی از heredoc: با استفاده از heredoc در Bash، میتوانید بخشهای بزرگی از متن را به عنوان ورودی یک دستور در نظر بگیرید.
با توجه به اینکه bash تمامی ویژگی های Bourne shell و بیشتر از آن را در خود دارد، اکثر اسکریپت های sh در bash نیز بدون نیاز به ویرایش، قابل اجرا هستند.
7. Z Shell یا zsh
Z shell یا به اختصار zsh، نسخه توسعه یافته ای از Bourne shell می باشد که در اوایل دهه 90 ارائه شد. این شل از ksh و tcsh الهام گرفته است تا یک جایگزین خوش ساخت و قدرتمند باشد. مسیر اجرایی آن bin/zsh/ می باشد. خط فرمان برای کاربر عادی به صورت % user@hostname location است و برای کاربر روت #hostname می باشد. Zsh شل پیش فرض Kali Linux و Mac OS است.
تصویر(8)
برخی از ویژگیهای جدید اضافه شده به Z shell عبارتند از:
- اشتراک گذاری سابقه دستورات بین تمام سشن های شل در حال اجرا.
- بهبود در کنترل آرایهها و متغیرها.
- اصلاح اشتباهات املایی و تکمیل خودکار دستورات.
- انواع حالتهای سازگاری.
- امکان توسعه قابلیت ها از طریق افزونه ها.
این شل به دلیل پشتیبانی انجمن کاربران توسط فریم ورک Oh My Zsh، از قابلیت پیکربندی و سفارشی سازی بالایی برخوردار است.
8. Friendly Interactive Shell یا fish
Friendly Interactive Shell یا به اختصار fish یک شل یونیکسی است که در اواسط دهه 2000 با تمرکز بر کاربردپذیری (شاخصهای که میزان سهولت کار با یک ابزار را نشان میدهد) عرضه شد. این شل که از قابلیت های زیادی برخوردار است نیاز به هیچگونه تنظیمات اضافی ندارد که باعث می شود از همان ابتدا کاربر پسند باشد. مسیر اجرایی پیش فرض آن usr/bin/fish/ بوده و خط فرمان کاربر عادی <user@hostname location و کاربر روت # root@hostname location می باشد.
تصویر(9)
ویژگیهای موجود در شل عبارتند از:
- پیشنهادات پیشرفته و تکمیل خودکار بر اساس تاریخچه دایرکتوری فعلی
- متمایز سازی دستورات و پیغامهای خطای توصیفی.
- پیکربندی مبتنی بر وب.
- تاریخچه دستورات به همراه قابلیت جستجو.
عیب اصلی fish عدم سازگاری با POSIX است. با این حال، هدف توسعهدهندگان آن بهبود طرحهای ناکارآمد POSIX می باشد.
نتیجه گیری
در این مقاله، به بررسی 8 نوع Shell پرکاربرد لینوکس پرداخته شد. شلهای لینوکس، ابزارهای قدرتمندی هستند که به کاربران امکان میدهند با سیستم عامل تعامل داشته و دستورات را اجرا کنند. شلهای لینوکس با تواناییها و ویژگیهای منحصربهفرد خود، به کاربران امکان میدهند با سیستم عامل لینوکس به بهترین شکل ممکن تعامل داشته و دستورات را اجرا کنند. علاوه بر موارد فوق، شل های دیگری نیز برای کاربردهای خاص وجود دارند.