نوشتن اولین اسکریپت در خط فرمان لینوکس
در آموزشهای قبلی فرمانهای خط فرمان لینوکس را یاد گرفتیم در حالیکه این ابزارها قادر به حل مشکلات زیادی هستند ولی هنوز بایستی آنها را یکی یکی و به صورت دستی در خط فرمان اجرا کنیم. اگر شل (Shell) خودش خود به خود این کار را انجام میداد عالی نمیشد؟ با پیوستن ابزارهای خود به یکدیگر و ایجاد برنامههای خود و طراحی اختصاصی این کار ممکن میشود.
در این آموزش اولین گام را برای نوشتن اسکریپتها برمیداریم.
اسکریپهای شل (Shell Scripts) چه هستند؟
به سادهترین عبارت یک اسکریپت شل (Shell Script) مجموعهای از دستورات خط فرمان است که در داخل یک فایل ذخیره شدهاند. شل فرمانهای موجود در فایل را میخواند و به همان صورت که فرمانها را مستقیما در خط فرمان وارد میکردیم شل آنها را اجرا میکند. شل از نظری خط فرمانی متمایز به شمار میآید. از چه نظر؟ از این نظر که هم یک خط فرمان قدرتمند برای سیستم است و هم مفسری قدرتمند برای زبانهای اسکریپتنویسی است. همانگونه که خواهیم دید اکثر کارهایی را که میتوان به صورت مستقیم در خط فرمان انجام داد در داخل فایلهای اسکریپت نیز قابل انجام هستند.
ما تا اینجا نکات زیادی از شل (Shell) را پوشش دادهایم ولی تاکنون بر روی ویژگیهایی تمرکز کرده بودیم که بیشتر به صورت دستوراتی مستقیم در خط فرمان به کار میروند. علاوه بر فرامین مستقیم، شل (Shell) مجموعهای از ویژگیها را دارد که به منظور نوشتن برنامهها به کار میرود.
چگونه یک اسکریپت شل بنویسیم؟
به منظور ایجاد موفقیتآمیز یک اسکریپت شل و اجرای آن در خط فرمان سه مرحله وجود دارد:
مرحله اول) یک اسکریپت بنویسید. اسکریپتهای شل (Shell Scripts) فایلهای متنی عادی هستند. در نتیجه به منظور نوشتن یکی از آنها ما نیاز به یک ویرایشگر ساده متن داریم بهترین ویرایشگرهای متن ویژگیهای مثل هایلایت کردن سینتکسها اجازه به دیدن کدها با رنگهای مختلف و… را فراهم میکنند هایلایت کردن سینتکسهای که به شما کمک خواهد کرد که برخی مناطق کد که دارای خطا هستند را برجسته و مشخص کنید ویرایشگرهای kate ، gedit ، vim و بسیاری دیگر از ویرایشگرهای موجود گزینههایی مناسب برای نوشتن فایلهای اسکریپت دارند.
مرحله دوم) فایل اسکریپت را اجرایی کنید. سیستم بر این قضیه که اجازه دهد هر فایل متنی قدیمی به عنوان یک برنامه رفتار کند کمی سخت گیر است و برای اینکار هم دلیل خوبی دارد ما برای اینکه به فایل اسکریپت اجازه اجرایی شدن را بدهیم بایستی مجوزهای قابل را ارتقا دهیم.
مرحله سوم) اسکریپت را در مکانی قرار دهیم تا شل (Shell) قادر به پیدا کردن آن باشد. شل در شرایطی که هیچ نام مسیر مشخصی تعیین نشده است به صورت خودکار برخی پوشهها را برای فایلهای اجرایی جستجو میکند. برای نهایت راحتی کار ما هم باید فایل اسکریپت خود را در یکی از این مسیرها قرار دهیم.
فرمت دهی فایل اسکریپت
نحوه ایجاد یک فایل اسکریپت را با ساختن یک اسکریپت بسیار ساده آغاز میکنیم خوب به همین منظور ویرایشگر متن خود را باز کرده و اسکریپت زیر را در آن وارد میکنیم:
#!/bin/bash # This is our first script. echo 'Hello World!'
همانگونه که مشاهده میکنید خط دوم اسکریپت یک کامنت هست زیرا که با علامت # شروع شده است و صرفا یک توضیح درباره دستور میباشد و تاثیری بر اجرای فرمان نخواهد گذاشت. خط سوم یک فرمان echo ساده است که یک متن را برای ما در خط فرمان چاپ خواهد کرد.
ولی خط اول چطور؟ آیا آن هم یک کامنت است؟ خیر. کاراکتر را یک توالی Shebang مینامند. توالی شیبنگ استفاده میشود تا به سیستم بگوید که نام مفسری که باید برای اجرای فایل اسکریپت استفاده کند چیست. هر اسکریپت شل (Shell) بایستی حاوی این خط در ابتدای آن باشد. پس از پایان فایل را با نام دلخواه ذخیره کنید و از ویرایشگر خارج شوید.
مجوزهای اجرایی
دومین کاری که بایستی برای ایجاد یک اسکریپت ساده انجام دهیم این است که قابل اسکریپت خود را اجرایی کنیم. به این منظور بایستی مجوزهای فایل اسکریپت را تغییر دهیم. حدس بزنید. کمی فکر کنید. با چه دستوری مجوزها را تغییر میدادیم. این را با فرمان chmod به صورت زیر انجام دهید:
[me@linuxbox ~]$ ls -l hello_world -rw-r--r-- 1 me me 63 2012-03-07 10:10 hello_world [me@linuxbox ~]$ chmod 755 hello_world [me@linuxbox ~]$ ls -l hello_world -rwxr-xr-x 1 me me 63 2012-03-07 10:10 hello_world
در ابتدا با استفاده از فرمان ls -l ما مجوزهای دسترسی قابل اسکریپت hello_world که قبلتر آن را ایجاد کردیم را مشاهده می کنیم. سپس با استفاده از فرمان chmal مجوزهای فایل را به ۷۵5 تغییر میدهیم. چرا ۷۵۵؟ دو نوع مجوز رایج برای اسکریپت ها وجود دارد. چون ۷۵۵ برای اسکریپتهایی است که همه قادر به اجرای آنها باشند و مجوز ۷۰۰ برای اسکریپتهایی که فقط مالک و صاحب فایل قادر به اجرای آنها باشد. همچنین به یاد داشته باشید که اسکریپتها به منظور اجرا شدن بایستی خواندنی نیز باشند. در نهایت باز هم با فرمان ls -l ما مجوزهای فایل را مشاهده میکنیم که تغییر کرده و علاوه بر آن به رنگ فایل دقت کنید که به صورتی متمایز نمایش داده میشود.
موقعیت و مکان فایل اسکریپت
الان با تعیین موقعیت قادر به اجرای قابل اسکریپت هستیم. برای اینکه اسکریپت اجرا شود بایستی قبل از نام فایل اسکریپت نام مسیر آن را نیز تعیین کنیم.
[me@linuxbox ~]$ ./hello_world Hello World!
اگر به این شیوه عمل نکنیم با خطای زیر مواجه میشویم:
[me@linuxbox ~]$ hello_world bash: hello_world: command not found
چرا اینگونه است؟ در اجرای اول به دلیل قرار دادن نام مسیر فرمان اجرا شد ولی در اجرای دوم بدون نام مسیر اجرایی صورت نگرفت و با خطا مواجه شدیم که دستور مورد نظر یافت نشد!
چه چیز اسکریپت ما را از دیگر برنامه ها متفاوت کرده است که هیچ خروجی نمیدهد؟ اسکریپت ما خوب است و مشکلی ندارد. مشکل اصلی بر سر مکان قرار گرفتن آن است. به دروس گذشته بروید و به یاد بیاورید که گفتیم متغیرهای مسیر محیطی چه هستند و چه تاثیری بر نحوه جستجو سیستم بر برنامههای اجرایی میگذارد.
به صورت خلاصه سیستم هر بار که نیاز به پیدا کردن یک برنامه اجرایی پیدا میکند در صورتی که هیچ مسیر مشخصی تعیین نشده باشد یک لیست از دایرکتوریها را جستجو میکند. این شیوهای است که سیستم میداند چگونه به هنگام نوشتن فرمان ls آن را از مسیر /bin/ls اجرا کند. دایرکتوری bin یکی از دایرکتوریهایی است که سیستم به صورت خودکار آن را جستجو میکند.
لیست دایرکتوریها درون یک متغیر محیطی با نام PATH نگهداری میشود. متغیر PATH حاوی یک لیست از دایرکتوریها برای جستجو است که با علامت نقل قول (:) از هم جدا شدهاند. میتوانیم محتویات متغیر PATH را با فرمان echo مشاهده کنیم:
[me@linuxbox ~]$ echo $PATH /home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
در اینجا لیستی از دایرکتوریها را میبینیم. اگر که اسکریپت ایجاد شده توسط ما هم در این مکان قرار داشت مشکل ما نیز برطرف میشد. اکثر توزیعهای گنو/لینوکس متغیر PATH را به گونهای پیکربندی میکنند که حاوی دایرکتوری bin برای کاربر خانگی باشد که از این طریق به هر کاربر اجازه دهند تا فرامین خود را در پوشه خانگی اجرا کنند.
[me@linuxbox ~]$ mkdir bin [me@linuxbox ~]$ mv hello_world bin [me@linuxbox ~]$ hello_world Hello World!
اگر اینگونه نیست و چنین مسیری را در تصویر بالا نمیبینید! چه کنیم؟ مشکلی نیست میتوانید به سادگی آن را اضافه کنید. ابتدا فرمان زیر را در خط فرمان اجرا کنید تا فایل .bashrc را ویرایش کنید. به آخر قابل رفته و خط کد زیر را به فایل اضافه کرده و آن را ذخیره کنید:
export PATH=~/bin:"$PATH"
پس از اینکه این تغییر را در فایل ایجاد کردید برای اینکه در ترمینال اعمال شود بایستی کاری کنیم که شل دوباره فایل .bashrc را بخواند. این کار را به صورت زیر انجام میدهیم:
[me@linuxbox ~]$ . .bashrc
مکان مناسب برای فایلهای اسکریپت کجاست؟
دایرکتوری bin در داخل دایرکتوری خانگی مکانی مناسب به منظور استفادههای شخصی میباشد. اگر که ما اسکریپتی را نوشتهایم که میخواهیم به همه بر روی سیستم اجازه استفاده از آن را بدهیم بایستی قابل اسکریپت خود را در داخل دایرکتوری اصلی usr/local/bin/ قرار دهیم. اکثرا اسکریپتهایی که برای استفادههای مدیریتی مورد استفاده قرار میگیرند در داخل دایرکتوری usr/local/bin/ قرار میگیرند.
ترفندهای دیگر فرمتدهی
یکی از اهداف کلیدی نوشتن گسترده اسکریپتها نگهداری آسان آنهاست. این آسانی زمانی حاصل میشود که بدانیم چه شخصی اسکریپت را در چه زمانی نوشته و آیا دیگران برای استفادههای خود آن را تغییر دادهاند و … ایجاد یک اسکریپت که خواندن و درک آن آسان باشد راه مناسبی برای آسان کردن نگهداری است.
گزینههایی با اسامی بلند
بسیاری از فرمانهایی که تا اینجا در خط فرمان یاد گرفتیم دارای گزینههای کوتاه و بلند هستند. برای نمونه فرمان ls را در نظر بگیرید. گزینههای این فرمان را میتوان هم به صورت بلند و هم به صورت کوتاه نوشت. برای مثال دو فرمان زیر یکی هستند فقط با این تفاوت که فرمان اولی به فرم کوتاه نوشته شده است و فرمان دومی به فرم طولانی و بلند:
[me@linuxbox ~]$ ls -ad
و
[me@linuxbox ~]$ ls --all --directory
زمانی که شما به صورت مستقیم یک فرمان را در خط فرمان وارد میکنید به منظور تایپ کمتر ترجیح بر این است که از فرمانهای کوتاه استفاده کنید ولی زمانی که اسکریپت مینویسید به منظور افزایش خوانایی فایل اسکریپت و اینکه بعدها تغییر آن آسانتر خواهد بود بهتر است که از فرم بلند گزینههای دستوری استفاده کنید.
تورفتگی و ادامه خط
زمانی که از فرم گزینههای بلند استفاده میکنیم میتوانیم با پخش کردن یک فرما بر روی چندین خط خوانایی آن را افزایش دهیم. برای مثال فرمان زیر را در نظر بگیرید:
[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -or \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';' \)
یک سوال آیا دستور بالا خواناست؟ جواب آن مشخص است خیر همین دستور را با پخش کردن بین خطوط و سطرهای بیشتر میتوانید خواناتر کنید به صورت زیر:
find playground \
\( \
-type f \
-not -perm 0600 \
-exec chmod 0600 '{}' ';' \
\) \
-or \
\( \
-type d \
-not -perm 0700 \
-exec chmod 0700 '{}' ';' \
\)
با اضافه کردن تورفتگیها به خطوط و قرار دادن فرمان در چندین خط (متدی که همه برنامهنویسان برای کدنویسی از آن استفاده میکنند) خوانایی متن را افزایش و ویرایش مجدد آن را آسان کنید.
درباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.
دیدگاهتان را بنویسید