امروز میخواهیم بفهمیم که shell چیست و اصلا چرا اهمیت دارد؟ درواقع، shell یا شل به شما کمک میکند تا مهندسی دادهها را به صورت کارآمدتر و بهتر انجام دهید. اگر با سیستمعاملهای لینوکس، اپل یا مایکروسافت کار میکنید، احتمالا بدون اینکه خودتان هم بدانید حداقلچند بار از اسکریپتهای شل استفاده کردهاید. در عمل، هر بار که سیستمعامل لینوکستان را راهاندازی میکنید، با Shell در تعامل هستید.
اسکریپهای شل به شما کمک میکنند تا کارهای تکراری را به صورت خودکار انجام داده و در زمان خود صرفه جویی کنید. به عنوان مثال، میتوانید پشتیبانگیری روزانه، نصب پچها، نظارت سیستمعامل و بسیاری از کارهای دیگر را با shell انجام دهید.
کار shellها این است که دستورات را بخوانند و آنها را به چیزی که سیستم میفهمد تبدیل کنند. بیایید کمی بیشتر به این بپردازیم که shell چیست و چه کاری برای ما انجام میدهد.
shell چیست؟
در این قسمت، به بررسی این موضوع میپردازیم که shell چیست و چه کاری انجام میدهد؟ شل، نوعی مفسر خط فرمان است که به کاربران سیستمعاملهای یونیکس و توزیع های لینوکس اجازه میدهد که با استفاده از اجرای دستورات در رابط خط فرمان، سیستم عامل خود را کنترل کنند. درنتیجه، شل را میتوانیم نوعی مترجم یا رابط بین کاربر و سیستم عامل معرفی کنیم.
اسکریپت نویسی شل به یک زبان واحد (مثل پایتون یا C++) انجام نمیشود. با این حال، به دلیل اینکه در اسکریپت آن از برخی از دستورات زبان طبیعی استفاده میشود، حتی اگر هیچ پیش زمینهای در برنامه نویسی نداشته باشید، میتوانید به سادگی آن را یاد بگیرید؛ اما اگر میخواهید کارهای پیچیدهای را با آن برنامهریزی کنید، به تمرین و تکرار زیادی برای یادگیری نیاز دارید.
استفاده از اسکریپت نویسی shell از راحتترین کارها برای خودکارسازی فعالیتهای سیستمعامل بهشمار میرود. دانشمندان و پژوهشگران علم داده، توسعهدهندگان و برنامهنویسان میتوانند با استفاده از ساختارهای کنترل شرطی و حلقهها، دستورات تکراری را به صورت خودکار انجام دهند. همچنین، شرکتهای مختلف میتوانند با خرید سرور مجازی لینوکس و بکارگیری shellها، سرعت انجام کارها را افزایش داده و قابلیتهای سیستم خود را بهبود بخشند.
برخی از متداولترین نامهای اسکریپتهای شل عبارتنداز bash، sh، csh و tesh. در سیستمعاملهای ماشین مجازی IBM این اسکریپتها EXEC نامیده میشوند. همچنین، در سیستمعامل داس (DOS) به این شلها، فایلهای دستهای میگویند.
هر شل دارای 2 دسته است: شل خط فرمان و شل گرافیکی. شما میتوانید با استفاده از رابطهای خط فرمان به شلهای خط فرمان دسترسی داشته باشید. سیستمها، ورودی را با دستوراتی که برای انسان قابل فهم است دریافت کرده و برای نمایش خروجی از رابطهای خط فرمان استفاده میکنند.
شلهای گرافیکی از رابط گرافیکی که GUI نام دارد برای انجام کارهای تعاملی و عملیاتی نظیر ذخیره، باز و بسته کردن فایلها استفاده میکنند.
شاید بخواهید بدانید که مهمترین دستورات shell در لینوکس چیست و هر کدام از این دستورات چه کاری را انجام میدهند. در این قسمت، چند نمونه از دستورات شل را بررسی میکنیم:
- دستور pwd: برای اینکه بفهمید در چه فهرستی قرار دارید
- دستور man command: پیداکردن یک دستور در دفترچهی راهنما
- Less file 1 یا more file 1: ایجاد یک فایل متنی قابل نمایش
انواع shell
شل Bourne
شل Bourne دومین شل پرکاربرد یونیکس است که در سال 1979 توسط Stephen Bourne ساخته شد. نام فایل اجرایی این شل sh است. شل Bourne بهعنوان شل پیشفرض سیستمعامل Solaris نیز شناخته میشود. با وجودی که این شل دارای قدمت زیادی است، اما همچنان به عنوان یکی از پرسرعتترین و محبوبترین شلها به شمار میرود. با این حال، نمیتوان از معایب آن مثل تعاملی نبودن، فراموشی تاریخچهی فرمان و یا نداشتن بیان منطقی و حسابی چشمپوشی کرد.
دستورات شل Bourne شامل موارد زیر میشود:
- دستور مسیر: /bin/sh و /sbin/sh
- پیشفرض کاربر غیر ریشه: $
- پیشفرض کاربر ریشه: #
خط فرمان
شل خط فرمان که به آن شل C نیز میگویند، یکی دیگر از شلهای یونیکس است که در اواخر دههی 70 توسط بیل جوی، دانشجوی کارشناسی ارشد دانشگاه کالیفرنیا معرفی شد. نام فایل قبلی این شل tcsh و نام فایل جدید آن csh است.
شل خط فرمان برخلاف شل Bourne یک شل تعاملی است و میتواند تاریخچهی دستورات و نامهای مستعار را تشخیص دهد. همچنین، شلهای C شامل نحو عبارات خط فرمان و محاسبات داخلی هستند.
دستورات شل خط فرمان شامل موارد زیر میشوند:
- دستور مسیر: /bin/csh
- نام هاست پیشفرض کاربر غیر ریشه: %
- نام هاست پیشفرض کاربر ریشه: #
KornShell
نام فایل این شل با ksh معرفی میشود. KornShell توسط دیوید کورن در اوایل دههی 1980 توسعه یافت. این شل بسیاری از ویژگیهای شل خط فرمان را دارد و همچنین، مجموعهای از شل Bourne را شامل میشود. از مزایای Bourne میتوان به سرعت بالاتر نسبت به شل خط فرمان، دارای محاسبات داخلی، اجرای اسکریپتهای شل Bourne در آرایههای C-مانند، توابع و امکان دستکاری رشتهای اشاره کرد.
KornShell شامل دستورات زیر میشود:
- دستور مسیر: /bin/ksh
- پیشفرض کاربر غیر ریشه: $
- پیشفرض کاربر ریشه: #
شل GNU
شل GNU Bourne-Again یا همان Basg، در سال 1989 توسط برایان فاکس به عنوان جایگزینی برای شل Bourne معرفی شد. GNU نه تنها با شل Bourne سازگاری کامل دارد، بلکه بسیاری از ویژگیهای خوب شلهای C و KornShells را دربر میگیرد. این شل به صورت خودکار کلیدهای جهتنما را برای ویرایش و فراخوانی فرمان جایگذاری میکند.
دستورات شل GNU عبارتنداز:
- دستور مسیر: /bin/bash
- پیشفرض کاربر غیر ریشه: bash-x.xx$
- پیشفرض کاربر ریشه: bash-x.xx#
اسکریپت Shell چه کاری را انجام میدهد؟
سوالی که شاید تا اینجا برایتان پیش آمده باشد این است که کار اصلی shell چیست؟ میتوانید اسکریپت شل را به عنوان تکمیلکنندهی خودکار برنامهها درنظر بگیرید. شلها به جای اینکه دستورات را در یک صفحه کلید تایپ کنند، دنبالهای از دستورات را در اسکریپتهای جداگانه استفاده کرده و کابر میتواند با نوشتن یک نام ساده در خط فرمان، آن دستورات را اجرا کند. اجرای برنامهها، بستهبندی متن، پیونددادن برنامهها به یکدیگر، نظارت بر انجام کارها، پشتیبانگیری، تکمیل وصلهها، ایجاد ابزارهای دستوری و دستکاری فایلها از جمله کارهایی هستند که شلها انجام میدهند.
جایگزینهای اصلی برای شل
در سیستمعامل ماشین مجازی IBM، شلها با نام EXEC شناخته میشوند. در سیستمعامل DOC، فایلهای شل را با نام فایلهای دستهای (batch files) میشناسند. با اینکه نام این فایلها کمی متفاوت است، اما همچنان شل محسوب میشوند. سایر زبانهای برنامهنویسی مانند جاوا اسکریپت، پرل، پایتون و TCL نیز زبانهای اسکریپت هستند که در آنها، شلها در کسری از ثانیه اجرا میشوند.
دلیل محبوبیت Shell چیست؟
محبوبیت Shell به دلیل مزایای متعددی است که در مقایسه با رابط کاربری گرافیکی (GUI) ارائه میدهد. در ادامه به برخی از این مزایا اشاره میکنیم:
قدرت و انعطافپذیری: Shell به کاربران امکان میدهد تا دستورات پیچیده را با یکدیگر ترکیب کنند و به نتایج دلخواه خود دست یابند. همچنین، امکان استفاده از علائم و توابع مختلف برای کنترل جریان اجرای دستورات وجود دارد. این قدرت و انعطافپذیری، Shell را به ابزاری ایدهآل برای کاربران حرفهای و مدیران سیستم تبدیل کرده است.
کارآمدی: برای بسیاری از وظایف خاص، استفاده از Shell میتواند به مراتب کارآمدتر از GUI باشد. به عنوان مثال، برای جابهجایی تعداد زیادی از فایلها یا ویرایش دستهای فایلهای متنی، استفاده از Shell میتواند بسیار سریعتر و کارآمدتر باشد.
اتوماسیون: با استفاده از اسکریپتنویسی، کاربران میتوانند وظایف تکراری را به صورت خودکار انجام دهند. این قابلیت، در صرفهجویی زمان و افزایش بهرهوری نقش بسزایی دارد.
دسترسی عمیقتر به سیستم: Shell، دسترسی عمیقتری به سیستمعامل در اختیار کاربران قرار میدهد و امکان مدیریت و پیکربندی دقیقتر سیستم را فراهم میکند. این امر، برای کاربران حرفهای و مدیران سیستم که نیاز به کنترل دقیق سیستم دارند، بسیار حائز اهمیت است.
عدم وابستگی به رابط کاربری گرافیکی: Shell از رابط کاربری گرافیکی مستقل است و میتوان از آن در محیطهای متنی مانند سرورها یا ترمینالها استفاده کرد. این استقلال، Shell را به ابزاری کاربردی برای مدیریت سیستم از راه دور و در شرایطی که دسترسی به رابط کاربری گرافیکی امکانپذیر نیست، تبدیل کرده است.
یادگیری آسان: با وجود اینکه Shell در نگاه اول ممکن است پیچیده به نظر برسد، اما یادگیری دستورات اولیه آن کار دشواری نیست. منابع آموزشی متعددی برای آموزش Shell به صورت آنلاین و آفلاین وجود دارد و با کمی تمرین، میتوان به تسلط نسبی در استفاده از آن دست یافت.
در کنار مزایای ذکر شده، Shell معایبی نیز دارد. پیچیدگی برای کاربران تازهکار، خطاپذیری بالا و عدم وجود رابط کاربری بصری از جمله این معایب هستند. با این حال، مزایای Shell به مراتب بیشتر از معایب آن است و به همین دلیل، این ابزار در بین کاربران حرفهای و مدیران سیستم از محبوبیت بالایی برخوردار است.
تاریخچهی پیدایش shell چیست؟
در سال 1960 اولین اسکریپت شل توسط لوئیس پوزین که از کارکنان MIT بود، ساخته شد. از آنجاییکه این برنامه جزو بیرونیترین لایهی سیستمعامل است، پوزین نام آن را shell یا پوسته گذاشت. RUNCOM اولین خط فرمان پوزین بود که به دانشمندان کمک کرد تا کارهای تکراری مانند بروزرسانی، کامپایل، جابجایی و تغییر نام را در سیستمعامل Multics به صورت خودکار انجام دهند. از آنجایی که لوئیس پوزین متخصص زبان کامپیوتری نبود، معتقد بود که خطوط فرمان را نمیتوان یک زبان برنامهنویسی دانست.
پوزین در اواسط دههی 1960 با کریستوفر استراچی که یک دانشمند بریتانیایی بود، شروع به همکاری کرد و استراچی توانست یک ماکرو ژنراتور را طراحی کند تا به عنوان پایگاهی برای زبان دستوری پوزین بکار گرفته شود.
ویژگیهای shell چیست؟
پوسته (Shell) به دلیل اختصاری بودن، در میان برنامه نویسان محبوبیت زیادی دارد. با این حال، این به معنای ابتدایی بودن آنها نیست. پوسته ها دارای ویژگی های متعددی از جمله موارد زیر هستند:
- اجرای پسزمینه (Background Processing):
یکی از بزرگترین مزایای اسکریپتهای پوسته این است که میتوانند در پسزمینه اجرا شوند. پوسته ها بسته به دستور، میتوانند در پیشزمینه (foreground) یا پسزمینه عمل کنند. فرآیندهای پیشزمینه روی صفحه نمایش قابل مشاهده هستند و تنها به صورت متوالی قابل اجرا میباشند. فرآیندهای پسزمینه روی صفحه نمایش ظاهر نمیشوند و میتوانند به صورت غیرمتوالی اجرا شوند. برای اجرای یک اسکریپت پوسته در پسزمینه، کاربران به سادگی نیاز دارند تا علامت تجاری (&) را در انتهای اسکریپت اضافه کنند.
- جایگزینهای وایلدکارت (Wildcard Substitutions):
جایگزینیهای وحشکار به سیستمها این امکان را میدهند که بیش از یک دستور را به طور همزمان پردازش کنند یا قطعاتی از عبارات را از فایلهای متنی پیدا کنند. به عنوان مثال، * به سیستم دستور میدهد تا هر رشتهای، حتی رشتههای خالی را مطابقت دهد. ? یک کاراکتر واحد را مطابقت میدهد، [مثال] هر کاراکتری را مطابقت میدهد (مثال فقط برای نمایش است) و [1-9] (مثال دیگر) به پوسته دستور میدهد تا کاراکترها را در محدوده مشخص شده مطابقت دهد.
- نامهای مستعار دستورات (Command Aliases):
نامهای مستعار دستورات میانبرهایی برای دستورات هستند. برخی از نامهای مستعار یک کلمه واحد و برخی دیگر یک حرف واحد هستند. برای دیدن لیست نامهای مستعار، کاربران فقط نیاز دارند تا دستور alias
را وارد کنند.
- تاریخچه دستورات (Command History):
Shellها به روشهای زیادی در صرفهجویی در زمان و تلاش کمک میکنند، اما یکی از ویژگیهای بسیار کاربردی آن، تاریخچه دستورات است. به جای تایپ مجدد دستورات، دستور history
تمام دستوراتی را که در طول آن جلسه استفاده شدهاند نمایش میدهد.
- جایگزینی نام فایل (Filename Substitution):
جایگزینی نام فایل همچنین به عنوان «glob کردن (globbing)» شناخته میشود. هنگامی که یک کلمه حاوی کاراکترهایی مانند ?، * یا [ باشد، یا با ~ شروع شود، پوسته آن کلمه را به عنوان یک الگو در نظر میگیرد و با یک لیست الفبایی از نامهای فایل برای مطابقت با الگو جایگزین میکند.
- هدایت ورودی/خروجی (Input/Output Redirection):
هدایت ورودی/خروجی (i/o) به کاربران این امکان را میدهد تا ورودی استاندارد (stdin) و خروجی استاندارد (stdout) را که به صفحه نمایش، صفحه کلید یا یک فایل مرتبط هستند، جابجا کنند.
- پایپینگ (Piping):
پایپینگ پوسته نوع دیگری از هدایت است که خروجی یک دستور/فرآیند/برنامه را به دستور/فرآیند/برنامه دیگری ارسال میکند. این کار به دستورات/فرآیندها/برنامهها اجازه میدهد تا به طور همزمان عمل کنند و انتقال مداوم داده را بدون نیاز به عبور از صفحه نمایش یا فایلهای متن موقت امکانپذیر میکند.
- جایگزینی متغیر شل (Shell Variable Substitution):
هنگامی که پوسته با عبارتی حاوی کاراکترهای خاص مواجه میشود، کد را به چیزی که برای کاربران قابل تشخیصتر باشد ترجمه میکند. این فرآیند جایگزینی متغیر یا به سادگی متغیر نامیده میشود.
متغیرها همچنین توسط برنامهنویسان باتجربهتر استفاده میشوند. به عنوان مثال، اگر یک برنامهنویس قبل از اجرای یک برنامه مقادیر واقعی را نمیداند، میتواند از متغیر به عنوان یک نگهدارنده قبل از آماده شدن کد برای اجرا استفاده کند.
نحوهی تکامل shell در گذر زمان
با پیشرفت تکنولوژی و بیشترشدن انتظارات ما، شلها نیز همواره در حال تکامل بودهاند. به عنوان مثال، شل Bourne یک قدم جلوتر از شل اصلی تامپسون بود. با این حال، هنوز جای کار داشت.
با اینکه میتوان برای هر کاربری یک شل جداگانه تعریف کرد، اما به طور کلی فقط 2 نوع شل وجود دارد: شل فرمان و شل Bourne. شلهای دیگر فقط یک گویش جداگانه به حساب میآیند و نمیتوان آنها را زبان متفاوتی نامید.
Unix shells
Unix shells شلهای اصلی نامیده میشوند و روی سیستم عاملهای یونیکس یا سیستم عاملهای مرتبط با یونیکس (مثل لینوکس ابونتو) کار میکنند.
command-lines
خطور فرمان (csh) یکی از رایجترین شلهای یونیکس به شمار میروند. از خطوط فرمان در کارهای تعاملی مانند نام مستعار، cdpath، job control، path hashing، directory stacks و… به وفور استفاده میشود. همچنین، این شلها ویژگیهای ویرایش و تاریخچه را ارائه میدهند.
Tenex command-line
Tenex command-line توسط کن گریر توسعه داده شده است و نسبت به نسخهی اصلی خط فرمان، پیشرفت قابل توجهی داشت. این شل برخلاف C اصلی، کارهایی نظیر ویرایش و تکمیل خط فرمان را انجام میداد. Tsch در سال 1981 با csh ادغام شد.
Korn shells
شل Korn که با ksh مشخص میشود، در اوایل دههی 1980 توسط دیوید کورن توسعه یافته است. این نوع شلها، درنتیجهی سازش بین شلهای C و Bourne بوجود آمدهاند که البته با Bourne سازگارتر هستند.
Bourne again shells
این شل که با نام bash معرفی شده است، یک برنامهی منبع باز است که توسط برایان فاکس در اواخر دههی 1900 برای ارتقای پروژهی GNU ساخته شد.
Exotic shells
با اینکه همهی شلها بر روی شلهای C یا Bourne ساخته شدهاند، اما برنامه نویسان، گویشهای مختلفی را از این دو نوع شل طراحی کردهاند که کارآمد و جالب هستند.
نمونههایی از استفاده از shell
Shellها بسته به کاری که انجام میدهند، میتوانند ساده یا پیچیده باشند. به عنوان مثال، یک پیام تبریک سادهی bash با خواندن دستور “hello $USER” انجام میشود. در قسمت زیر، چند نمونه از مثالهای ابتدایی استفاده از shellها را با یکدیگر میخوانیم:
مثال 1: استفاده از حلقهی while در shell
در قدم اول، با کمک یک ویرایشگر متن مناسب، یک فایل را در bash ایجاد میکنیم. در این مثال، از ویرایشگر vi استفاده میکنیم:
$ vi example.sh
با اجرای دستور بالا، یک ویرایشگر با فایلی با نام example.sh باز میشود. برای اینکه شروع به واردکردن کد زیر کنید، باید کلید “i” را فشار دهید. سپس، میتوانید کد زیر را وارد کرده و آن را اجرا کنید:
#!/bin/bash valid=true count=1 while [ $valid ] do echo $count if [ $count -eq 10 ]; then break fi ((count++)) done
برای اینکه دستور بالا را ذخیره کرده و به ترمینال برگردید، دستور “: wq” را اجرا کنید. سپس، با استفاده از دستور bash example.sh، برنامه را اجرا کنید.
مثال 2. پذیرش ورودی از ترمینال توسط کاربر
با اجرای دستور زیر، یک فایل دیگر را در ویرایشگر vi ایجاد میکنید:
$vi example2.sh
سپس، کد زیر را در ویرایشگر وارد کنید. کد زیر، 2 عدد را به ترتیب از کاربر گرفته و آنها را با یکدیگر جمع میکند. در انتها، حاصل جمع همراه با یک پیام به کاربر نمایش داده میشود:
#!/bin/bash echo "Enter first number" read x echo "Enter second number" read y ((sum=x+y)) echo "The result of addition = $sum"
با اجرای دستور bash example2.sh فایل shell را اجرا کنید.
افراد و مشاغلی که با shellها سروکار دارند
Shellها ابزارهای مفیدی برای مشاغل مختلف هستند. به عنوان مثال، متخصصان داده که باید از هر نوع زبانی، اطلاعات کافی داشته باشند، میتوانند از مزایای shellها برای انجام راحتتر کارهایشان استفاده کنند. همچنین، برخی از شرکتها با توجه به نقشهایی که دارند، باید از shell ها استفاده کنند.
مثالی دیگر از مشاغلی که با shellها سروکار دارند، مدیران سیستم است که معمولا دستمزدهای بالایی دریافت میکنند و عملا بدون کمک shellها، روند کاریشان کندتر و سختتر خواهد بود.
سخن پایانی
Shellها ابزاری برای برنامه نویسی هستند و اکثر افراد کمابیش به صورت مستقیم یا غیرمستقیم از این ابزار استفاده میکنند. با کمک shellها، دستورات پیچیده به دستورات سادهتر و شهودیتر تبدیل میشوند. درک عملکرد و نحوهی استفادهی درست از shellها از جمله کارهایی است که دانشمندان داده و مهندسان کامپیوتر باید آن را جدی بگیرند.
سوالات متداول
مزایای shell چیست؟
به طور خلاصه، shell کارهای تکراری و خسته کننده را به صورت خودکار انجام میدهند و کاربران میتوانند انواع شلها را باتوجه به نیازهای خود، سفارشیسازی کنند.
معایب shell چیست؟
شناسایی خطاهای shell و رفع این خطاها میتواند کار پرهزینه و دشواری باشد. همچنین، شلها در بین سیستمعاملهای مختلف چندان هم قابلحمل نیستند.
نوشته shell چیست؟ آشنایی با انواع Shell در لینوکس و کاربردهای آنها! اولین بار در مجله آقای وب. پدیدار شد.