در تعریف کلی Shell یک رابط کاربری(رابط دستوری ،پوسته،لایه) بین کاربر و هسته سیستم عامل(Kernel) می باشد.
و در واقع Shell یک قطعه نرم افزاریست که به کاربر اجازه دسترسی مستقیم به سیستم عامل را میدهد.
Shell در همه سیستم عامل ها لایه ای میان کاربر و هسته سیستم عامل است.
دستورات در کامپیوتر به صورت 0و1 شناخته می شوند، اما اگر ما بخواهیم برای ارتباط با کامپیوتر و اعلام دستورات به آن از کد 0و1 یا زبان اسمبلی استفاده کنیم بسیار دشوار خواهد بود. در نتیجه Shell ها به وجود آمده اند که با دریافت دستوراتی مشخص آن ها را برای کامپیوتر ترجمه نمایند.
Shell ها یا به صورت رابط خط دستور (Command line Interface) CLI و یا به صورت رابط گرافیکی (Graphical User Interface ) GUI می باشند.
در سیستم عامل ویندوز Shell مورد استفاده Command Prompt یا همان CMD می باشد. و در سیستم عامل Linux ، انواع Shell های مختلفی به نام های Bash و CSH و CTSH و K Shell و … وجود دارند همچنین سیستم عامل Unix ، (یونیکس) نیز از سیستم عامل هایی است که بر مبنای دستورات Shell کار می کنند.
تمامی عملیاتی که در سیستم عامل ها تعریف شده و انجام پذیر می باشند را می توان در Shell ها به صورت دستوراتی مشخص به سیستم عامل اعلام کرد. در سیستم عامل ویندوز به علت وجود UI معمولا کاربران از دستورات استفاده نمی کنند. ولی در سیستم عامل های تحت لینوکس در صورت نصب مینیمال رابط گرافیکی ندارد و کاربران آن بیشتر با دستورات در ارتباط هستند، اما باید توجه کنید که Shell هسته انجام دهنده دستورات نیست بلکه رابطی بین کاربر و هسته سیستم می باشد و دستورات را به هسته منتقل می نماید.
Kernel یا هسته در واقع مرکز مدیریت یک سیستم عامل است که تمامی دستورات برای اجرا شدن از طریق این مرکز مدیریت صادر می شوند. تمامی اجزای سیستم عامل وابسته به این هسته است Kernel بصورت لایه بندی شده کار می کند و هر چقدر به درون این لایه بیشتر وارد شویم به منابع و دسترسی های بیشتری دسترسی پیدا خواهیم کرد اما نکته اینجاست که این لایه ها یا پوسته ها را ما به عنوان Shell یا پوسته می شناسیم. Shell ها در واقع رابط کاربری ما برای دستور دادن به کرنل سیستم عامل هستند و شما از طریق این رابط ها می توانید با سیستم عامل ارتباط برقرار کنید.
توجه کنید که نباید مفهوم پوسته و Terminal(ترمینال در VSCode,PHPStorm,...) را با یکدیگر یکسان بدانید. پوسته یک لایه از سیستم عامل است که می توانیم آن را یک مفسر(interpreter) دستورهای ورودی از سوی کاربر است ولی ترمینال (Terminal) یک نرم افزار است که وظیفه آن دریافت دستور و ارائه آن به Shell است ولی کاربرد Shell ، تفسیر و اجرای دستورهایی است که از ترمینال فرستاده شده اند.
در سیستم عامل های یونیکسی مانند لینوکس، مکینتاش، سولاریس و FreeBSD، یک پوسته مانند Bash یا Korn یک مفسر (interpreter) و یک زبان برنامه نویسی است. از دید مفسر، گفتیم که پوسته باید واسطه ای یا لایه میان کاربر با سیستم عامل برای انجام دستورهای کاربر است که می توانیم به ساخت یک فایل یا دایرکتوری و یا تغییر به دایرکتوری دیگر و دیگر نمونه اشاره کنیم.
شل این قابلیت را دارد که دستورات از قبل ذخیره شده در فایلها را اجرا کند. این نوع از اجرا را "اسکریپتنویسی شل" مینامند
آنچه که در نوشته های اسکریپت نویسی پوسته ((Shell Scripting) در لینوکس (یا بهتر است بگوییم در یونیکس) خواهیم گفت، همین جنبه برنامه نویسی پوسته ها است. برنامه نویسی یا اسکریپت نویسی پوسته، ترکیب از ویژگی های زبان های برنامه نویسی و دستورهای درون توزیع لینوکس است. بهتر است بگوییم که اسکریپت نویسی شل یا پوسته، امکان خودکار سازی انجام چندین و چند دستور را فراهم می کند به گونه ای که می توانیم خروجی یک دستور درون یک متغیر دخیره کرده و سپس متغیر را در دستور دیگری به کار ببریم. می توانیم با با دستور if عبارت های شرطی را پیاده سازی کنیم یا اینکه می توانیم از حلقه تکرار کمک بگیریم.
از دید انجام (یا اجرای) دستورها، پوسته ها می توانند به دو گونه پوسته های هم کنشی (یا تعاملی – (Interactively و نا هم کنشی غیر تعاملی – (Non Interactively) باشند. در پوسته های interactively، یک دستور از صفحه کلید به پوسته فرستاده می شود ولی در پوسته های Non Interactively، دستور یا دستورها از یک فایل به پوسته ها فرستاده خواهند شد.
در اسکریپت نویسی پوسته نیز دستورها با ترکیب قابلیت های برنامه نویسی درون یک فایل نوشته شده و سپس این فایل از طریق یک ترمینال یا حتی از درون دیگر زبان های برنامه نویسی انجام (اجرا) می شود. از دید خودکار سازی انجام دستورها، اگر اسکریپت نویسی پوسته نباشد، پس باید تک تک، هر کدام از دستورها را برای کاربرد دلخواه، پشت سر هم انجام دهیم ولی با اسکریپت نویسی پوسته، همگی در کنار قابلیت های برنامه نویسی درون فایل نوشته شده و سپس این فایل را اجرا می کنیم.
از دید دیگری درباره انجام دستورها، دستورها می توانند به گونه همگام (Synchronously) یا ناهمگام (Asynchronously) انجام شوند. در دستورهایی که همگام انجام می شوند، پوسته قفل شده و تا زمانی که دستور کنونی پایان نیابد، پوسته برای انجام دستور دیگر، آزاد نمی شود. ولی در حالت ناهمگام، پوسته منتظر پایان یافتن دستور دیگری نمی شود، بلکه دستور کنونی را در پس زمینه اجرا کرده و سپس دستور دیگری را دریافت می کند. هر زمان که خروجی دستور پس زمینه آماده شد، آنرا نمایش می دهد.
تاریخچۀ شل
از همان ابتدای شروع پروژه یونیکس در سال 1970، برنامه شل وجود داشت؛ آن را با نام V6 Shell میشناختند و توسط شخصی به نام «کن تامسون» (Ken Thomson) نوشته شده بود. در سال 1977، «بورن شل» (Bourne Shell) توسعه این برنامه را ادامه داد و تا امروز که به شل پیشفرض برای اکانتهای root در لینوکس درآمده، این نسخه همچنان به قوت خود باقی است. گفتنی است نسخهی یاد شده از شل قابلیت اسکریپتنویسی را محقق کرد که در طول سالهای زیاد مفید بودن آن غیرقابل انکار بوده است.
توسعههای بعدی شل در سال 1980 سبب شد که نسخههای جانبی خیلی محبوبی از آن منتشر شود. دو نمونه از محبوبترین این نسخهها C-Shell و Korn Shell بودند. هر یک از این شلها سینتکس مختص خود را داشتند که در برخی موارد با شل اصلی تفاوتهای بنیادی داشت.
امروزه یکی از محبوبترین شلها، Bash Shell است. Bash مخفف شدۀ عبارت Bourne-Again-Shell است و یک نسخه بسیار پیشرفتهتر از شل توسعه داده شده توسط Bourne است. در این مقاله، از این شل برای آموزش استفاده خواهیم کرد.
اجرای یک اسکریپت شل
اجرای اسکریپت شل بسیار ساده است. تنها کافی است مسیر اسکریپت را به عنوان یک آرگومان به شل بفرستید.
یک نمونه شل اسکریپت ساده را در زیر میبینید:
echo "hello world"
به صورت زیر آن را اجرا کنید:
$ bash hello.sh
# prints
hello world
.
در شل نیاز است که برای خاتمه دستورات در انتهای خطوط کاراکترهای (LF (Line-Feed قرار گیرد. اگر اسکریپت شل را در ویندوز بنویسید و بخواهید آن را در سیستم لینوکس اجرا کنید، به احتمال زیاد با خطا مواجه میشوید. چون ویندوز از ترکیب کاراکترهای CR-LF برای خاتمه خطوط استفاده میکند. برای این کار تنها نیاز است که آن را به به فرمت LF تبدیل کنید. ویرایشگر ویندوز خود را بررسی کنید تا با نحوۀ انجام این کار آشنا شوید.
روش دیگری نیز برای اجرای اسکریپت شل به طور مستقیم به عنوان یک دستور وجود دارد. کد زیر را در اولین خط اسکریپت شل خود وارد کنید.
#!/bin/bash
با تغییری که اعمال کردیم، حال اسکریپت شل بسیار سادهی ما به صورت زیر خواهد بود:
#!/bin/bash
echo "hello world"
اکنون باید فایل اسکریپت خود را «قابل اجرا» (executable) کنید، برای اینکار به شیوه زیر عمل مینماییم:
$ chmod +x hello.sh
با این کار شما میتوانید فایل اسکریپت را به صورت مستقیم و بدون هیچ دردسری ارجاع کنید.
خودکار کردن کارها
اولین مزیت استفاده از اسکریپتنویسی شل خودکارسازی کارهایی است که مکرراً اجرا میشوند. به عنوان مثال، فرض کنید شما یک کار مشخص را هر روز در سیستم خود انجام میدهید. اگر برای این کار مجبورید هر روز در لینوکس خود دستورات متعددی را اجرا کنید، میتوانید به راحتی این دستورات را در یک فایل ذخیره کنید و به عنوان یک اسکریپت شل اجرا نمایید. مثالهایی را در ادامه میبینید:
- آرشیو و آپلود کردن یک فایل یا پوشه به صورت روزانه در فضای ذخیرهسازی ابری مانند S3.
- فشردهسازی فایلهای log که هر روز در حال گسترش هستند.
- استخراج قیمت سهام، تجزیه و تحلیل دادههای استخراج شده و فرستادن ایمیل یا پیامک در صورت رسیدن به یک وضعیت مشخص.
ترکیب دستورات چندگانه
یکی دیگر از مزایای اسکریپتنویسی شل این است که میتوان مجموعهای به هم پیوسته از دستورات را در یک دستور واحد ترکیب کرد؛ امری که در برخی موارد میتواند بسیار کاربردی باشد. بدون شک به خاطر سپردن یک دستور خیلی راحتتر از چند دستور است. همچنین نیازی نیست ترتیب اجرای آنها را به یاد داشته باشید.
یک مثال خوب برای روشنتر شدن موضوع، میتواند مجموعه دستورات به هم پیوسته بوت شدن خود سیستم عامل لینوکس باشد. یکی از مراحل بوت شدن این است که سیستم عامل تعدادی دستور را برای اینکه سیستم در یک حالت پایدار قرار گیرد اجرا میکند. این دستورات در واقع اسکریپتهای شل هستند که در پوشه etc قرار دارند. اگر به یکی از این اسکریپتها نگاهی بیاندازید، خواهید دید که برای بالا آمدن یا بوت شدن یک سیستم کدهای خیلی پیچیدهای اجرا میشوند و بدون استفاده از اسکریپت شل این کار بسیار سخت است.
دستورات SHELL در ویندوز
دستوری که با کلمه :SHELL شروع میشه و در ادامه اش یک کلمه دیگه نوشته میشه و یه جای نیمه مخفی از ویندوز رو براتون ظاهر میکنه. خیلی از این دستورات در اصل یک میانبر به یه مسیر خیلی طولانی هست و برخی دیگه کاربردهای جذاب دیگری دارند.
در طی سالهای مختلف مایکروسافت تعداد این دستورات رو افزایش داده و توی هر نسخه جدید ویندوز هم احتمال افزایش تعداد اونها وجود داره.
مشاهده مسیر دستورات
برای مشاهده آدرس ها میتونید به مسیر رجیستری زیر مراجعه کنید
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\FOLDERDESCRIPTIONS
لیست برخی دستورات SHELL در ویندوز ۱۰
(WINDOWS 10 V20H2 BUILD 19042.661)
SHELL:3D OBJECTS
SHELL:ACCOUNTPICTURES
SHELL:ADDNEWPROGRAMSFOLDER
SHELL:APPDATAFAVORITES
SHELL:APPDATAPROGRAMDATA
SHELL:APPMODS
SHELL:COMMON ADMINISTRATIVE TOOLS
SHELL:COMMON APPDATA
SHELL:COMMON DESKTOP
SHELL:COMMONRINGTONES
SHELL:COMMONVIDEO
SHELL:CONFLICTFOLDER
SHELL:ROAMED TILE IMAGES
SHELL:ROAMING TILES
SHELL:SAVEDGAMES
SHELL:SYSTEMCERTIFICATES
SHELL:SYSTEMX86
SHELL:TEMPLATES
SHELL:THISDEVICEFOLDER
SHELL:THISPCDESKTOPFOLDER
SHELL:USER PINNED
SHELL:USERPROFILES
SHELL:USERPROGRAMFILES
SHELL:USERPROGRAMFILESCOMMON
SHELL:USERSFILESFOLDER
SHELL:USERSLIBRARIESFOLDER
SHELL:VIDEOSLIBRARY
SHELL:WINDOWS
(Linux Commands)کامندهای پرکاربرد لینوکس
همان طور که میدانید دسترسی به سرور از طریق شل و ssh نیازمند دارا بودن دانش کمی در رابطه با کامند ها و دستوراتی است که درخواست شما را به سرور ارجاء داده و در صورت صحیح بودن اجرا میشوند. در این مقاله به بررسی بعضی از این کامند ها خواهیم پرداخت پس با ما همراه باشید :
اطلاعات سرور و سیستم
ابتدا از طریق نرم افزار پوتی (Putty) به سرور متصل شوید سپس کامند های زیر را وارد نمایید و سعی کنید انها را به خاطر بسپارید :
نمایش ساعات و تاریخ سرور :
date نمایش تقویم ماه cal نمایش اپ تایم سرور uptime نمایش کاربران انلاین w نمایش یوزری که با ان لاگین نموده اید whoami نمایش مشخصات کرنل uname -a نمایش اطلاعات پردازشگر cat /proc/cpuinfo نمایش اطلاعات مموری cat /proc/meminfo نمایش اطلاعات دیسک df -h میانبر های کیبورد برای لینوکس اجرای کامند Enter مشاهده دستور پیشین Up Arrow متوقف نمودن دستور در حال اجرا Ctrl + C پاک کردن صفحه Ctrl + L رجوع به ابتدای خط Ctrl + A رفتن به اخر خط Ctrl + E جست و جوی فایل در سرور لینوکس locate file find / -name filename locate filename دستورات فایل ها در لینوکس لیست کردن دایرکتوری ها ls لیست کردن فایل ها و نمایش نوع انها ls -F بازگشت به home cd ساختن دایرکتوری mkdir name نمایش دایرکتوری کنونی pwd پاک کردن فایل rm name پاک کردن دایرکتوری rm -r name پاک کردن فایل به کامند force rm -f file پاک کردن دایرکتوری . فایل های زیر مجموعه ان rm -rf dir کپی کردن فایل ها cp file1 file2 کپی کردن فایل در ادرس دلخواه cp file /home/dirname انتقال فایل به ادرس دلخواه mv file /home/dirname ایجاد یا اپدیت فایل touch file نمایش 20 خط پایانی فایل
tail -20 file