اسکرپیتنویسی شل چیست و چرا مهم است؟
«شل» (Shell) برنامهای در لینوکس و یونیکس است، که میتوانید در آن دستوراتی را جهت اجرا توسط سیستم وارد کنید. هنگامی که پنجره ترمینال را در لینوکس باز میکنید، در واقع برنامه شل اجرا میشود، که یک رابط کاربری را برای وارد کردن دستورات در اختیار شما قرار میدهد. این رابط کاربری را معمولا با عنوان «خط فرمان» نیز میشناسند. وقتی دستوری را در این خط فرمان وارد میکنید، توسط شل اجرا شده و نتیجه در صفحه نمایش داده میشود.
علاوه بر اینکه میتوانید دستورات را به صورت تعاملی وارد کرده و اجرا کنید، شل این قابلیت را دارد که دستورات از قبل ذخیره شده در فایلها را اجرا کند. این نوع از اجرا را «اسکریپتنویسی شل» مینامند و ما در این نوشته قصد داریم مفاهیم پایه آن را توضیح دهیم.
تاریخچۀ شل
از همان ابتدای شروع پروژه یونیکس در سال 1970، برنامه شل وجود داشت؛ آن را با نام V6 Shell میشناختند و توسط شخصی به نام «کن تامسون» (Ken Thomson) نوشته شده بود. در سال 1977، «بورن شل» (Bourne Shell) توسعه این برنامه را ادامه داد و تا امروز که به شل پیشفرض برای اکانتهای root در لینوکس درآمده، این نسخه همچنان به قوت خود باقی است. گفتنی است نسخهی یاد شده از شل قابلیت اسکریپتنویسی را محقق کرد که در طول سالهای زیاد مفید بودن آن غیرقابل انکار بوده است.
توسعههای بعدی شل در سال 1980 سبب شد که نسخههای جانبی خیلی محبوبی از آن منتشر شود. دو نمونه از محبوبترین این نسخهها C-Shell و Korn Shell بودند. هر یک از این شلها سینتکس مختص خود را داشتند که در برخی موارد با شل اصلی تفاوتهای بنیادی داشت.
امروزه یکی از محبوبترین شلها، Bash Shell است. Bash مخفف شدۀ عبارت Bourne-Again-Shell است و یک نسخه بسیار پیشرفتهتر از شل توسعه داده شده توسط Bourne است. در این مقاله، از این شل برای آموزش استفاده خواهیم کرد.
اجرای یک اسکریپت شل
اجرای اسکریپت شل بسیار ساده است. تنها کافی است مسیر اسکریپت را به عنوان یک آرگومان به شل بفرستید.
یک نمونه شل اسکریپت ساده را در زیر میبینید:
1echo "hello world"
به صورت زیر آن را اجرا کنید:
1$ bash hello.sh
2# prints
3hello world
در شل نیاز است که برای خاتمه دستورات در انتهای خطوط کاراکترهای (LF (Line-Feed قرار گیرد. اگر اسکریپت شل را در ویندوز بنویسید و بخواهید آن را در سیستم لینوکس اجرا کنید، به احتمال زیاد با خطا مواجه میشوید. چون ویندوز از ترکیب کاراکترهای CR-LF برای خاتمه خطوط استفاده میکند. برای این کار تنها نیاز است که آن را به به فرمت LF تبدیل کنید. ویرایشگر ویندوز خود را بررسی کنید تا با نحوۀ انجام این کار آشنا شوید.
روش دیگری نیز برای اجرای اسکریپت شل به طور مستقیم به عنوان یک دستور وجود دارد. کد زیر را در اولین خط اسکریپت شل خود وارد کنید.
1#!/bin/bash
با تغییری که اعمال کردیم، حال اسکریپت شل بسیار سادهی ما به صورت زیر خواهد بود:
1#!/bin/bash
2echo "hello world"
اکنون باید فایل اسکریپت خود را «قابل اجرا» (executable) کنید، برای اینکار به شیوه زیر عمل مینماییم:
1$ chmod +x hello.sh
با این کار شما میتوانید فایل اسکریپت را به صورت مستقیم و بدون هیچ دردسری ارجاع کنید.
مزایای استفاده از اسکریپتهای شل
خودکار کردن کارها
اولین مزیت استفاده از اسکریپتنویسی شل خودکارسازی کارهایی است که مکرراً اجرا میشوند. به عنوان مثال، فرض کنید شما یک کار مشخص را هر روز در سیستم خود انجام میدهید. اگر برای این کار مجبورید هر روز در لینوکس خود دستورات متعددی را اجرا کنید، میتوانید به راحتی این دستورات را در یک فایل ذخیره کنید و به عنوان یک اسکریپت شل اجرا نمایید. مثالهایی را در ادامه میبینید:
- آرشیو و آپلود کردن یک فایل یا پوشه به صورت روزانه در فضای ذخیرهسازی ابری مانند S3.
- فشردهسازی فایلهای log که هر روز در حال گسترش هستند.
- استخراج قیمت سهام، تجزیه و تحلیل دادههای استخراج شده و فرستادن ایمیل یا پیامک در صورت رسیدن به یک وضعیت مشخص.
ترکیب دستورات چندگانه
یکی دیگر از مزایای اسکریپتنویسی شل این است که میتوان مجموعهای به هم پیوسته از دستورات را در یک دستور واحد ترکیب کرد؛ امری که در برخی موارد میتواند بسیار کاربردی باشد. بدون شک به خاطر سپردن یک دستور خیلی راحتتر از چند دستور است. همچنین نیازی نیست ترتیب اجرای آنها را به یاد داشته باشید.
یک مثال خوب برای روشنتر شدن موضوع، میتواند مجموعه دستورات به هم پیوسته بوت شدن خود سیستم عامل لینوکس باشد. یکی از مراحل بوت شدن این است که سیستم عامل تعدادی دستور را برای اینکه سیستم در یک حالت پایدار قرار گیرد اجرا میکند. این دستورات در واقع اسکریپتهای شل هستند که در پوشه etc قرار دارند. اگر به یکی از این اسکریپتها نگاهی بیاندازید، خواهید دید که برای بالا آمدن یا بوت شدن یک سیستم کدهای خیلی پیچیدهای اجرا میشوند و بدون استفاده از اسکریپت شل این کار بسیار سخت است.
کدی که در ادامه میبینید یک نمونه اسکریپت شل است و هنگامی که یک کاربر به سیستم وارد میشود، اجرا میگردد. تجسم کنید، بخواهید هر بار برای ورود به سیستم این کدها را وارد کنید!
1# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
2# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
3
4if [ "$PS1" ]; then
5if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
6# The file bash.bashrc already sets the default PS1.
7# PS1='\h:\w\$ '
8if [ -f /etc/bash.bashrc ]; then
9. /etc/bash.bashrc
10fi
11else
12if [ "`id -u`" -eq 0 ]; then
13PS1='# '
14else
15PS1='$ '
16fi
17fi
18fi
19
20# The default umask is now handled by pam_umask.
21# See pam_umask(8) and /etc/login.defs.
22
23if [ -d /etc/profile.d ]; then
24for i in /etc/profile.d/*.sh; do
25if [ -r $i ]; then
26. $i
27fi
28done
29unset i
30fi
سادگی در توسعه
تمام کارهایی که با اسکریپت شل انجام میشود را با یک برنامهای که با زبان C یا ++C نوشته شده نیز میتوان انجام داد. اما نوشتن و اشکالزدایی یک اسکریپت شل به مراتب سادهتر از برنامههای C و ++C است. مخصوصا برای امور مدیریتی سیستم مانند اجرای دستورات خارجی، ایجاد و حذف فایلها و پوشهها، مسیردهی به خروجی و ...
برنامههای C و ++C برای عملیاتهای سطح پایینتر مانند فراخوانیهای سیستمی، تغییر ساختار دادهها و ... مناسبتر هستند.
خوانایی اسکریپت شل
یک اسکریپت شل چون ماهیت یک فایل متنی را دارد، به راحتی قابل مشاهده است و شما میتوانید با نگاه کردن به کدهای آن بفهمید که دقیقا چه کاری قرار است انجام شود. اما در برنامههای نوشته شده با زبانهایی مانند C و ++C تنها راهی که برای فهمیدن این موضوع وجود دارد این است که در زمان اجرا راهنماهایی برای آنها وجود داشته باشد یا به کد منبعشان دسترسی پیدا کنید. چون معمولا این برنامهها کامپایل شده و به یک فایل اجرایی تبدیل شدهاند بنابراین شما کدهای منبع را نمیبینید. برای مثال با استفاده از اسکریپت شل میتوانید ببینید که آیا اجرای این کد فایلی را حذف میکند یا نه و در صورت لزوم آن فایلها را در مسیر دیگری کپی کنید.
همچنین خطایابی در اسکریپتهای شل بسیار سادهتر است. چون شما کد را میتوانید ببینید. مثلا ممکن است به خاطر وجود نداشتن یک پوشه خاص کد شما با خطا مواجه شود. بنابراین میتوانید به راحتی پوشه مورد نظر را در مسیر خواسته شده ایجاد کنید.
قابلیت انتقال به سیستمهای دیگر
اسکریپتهای شل میتوانند به راحتی به سیستم عاملهای یونیکس و شبه یونیکس منتقل شده (portable) و اجرا شوند. حتی انتقال اسکریپتهای شل از معماریهای دیگر مانند X86، Spark، MIPS و ... بسیار راحتتر از برنامههای نوشته شده به زبانهای C و ++C است.
تنها راهی که برای انتقال و اجرای برنامههای C و ++C وجود دارد، کپی کردن کد منبع، ساخت برنامه (build) و اجرای آن است. حتی ممکن است این برنامهها از معماری خاصی استفاده کنند که باعث اجرا نشدن آنها در سیستمهای دیگر با معماریهای متفاوت میشود.
با وجود مزایای گفته شده برای اسکریپتهای شل شاید شما هم برای استفاده از آن در پیادهسازی ایدهها و نوشتن برنامههای خود ترغیب شده باشید.
اگر به این مقاله علاقه داشتید، ممکن است مقالات زیر هم برای شما جالب باشند:
- آموزش ارسال ایمیل از اکسل با استفاده از اسکریپتهای ویژوال بیسیک
- چگونه با استفاده از اسکریپتهای ویندوز در زمان صرفهجویی کنیم؟
- پنج دلیل قانعکننده برای استفاده از برنامه PowerShell
-- / ^^
salam aghaaa pas linus torvalds
ro nabas moarefi koni khodaiesh esmesho bas ba tala nevesht harja ke sohbati az shell msihe age nabod ki miraft donbale shel