فصل دوم - اصول اولیه و تعریف برخی مفاهیم شل
محتویات[نهفتن] |
یک دستور چیست؟
در یونیکس یک دستور برنامهای است که شما قادر به اجرای آن هستید. برای اجرای یک دستور باید نام آن را در محیط شل تایپ کنید.
مثال:
$ date Fri Mar 2 4:34:14 IRST 2012 $
مثال:
$ who baroon :0 2012-03-02 17:26 baroon pts/0 2012-03-02 17:27 (:0) $
در اینجا دستور date اجرا شدهاست. این دستور تاریخ و زمان جاری را نمایش میدهد. بعد از اینکه اجرای دستور پایان یافت و خروجی آن نمایش داده شد مجدداً کاراکتر $ نمایش داده میشود. در این کتاب از کاراکتر $ برای نمایش prompt استفاده میشود. زمانی که شما این کاراکتر را مشاهده میکنید میتوانید شروع به وارد کردن دستورات خود کنید تا شل آنها را اجرا کند. زمانی که یک دستور در حال اجرا $ نمایش داده نمیشود و زمانی که اجرای دستورات پایان یافت مجدداً کاراکتر $ نمایش داده میشود .
توجه: کاراکتر $ بخشی از یک دستور نیست! بلکه نمایانگر این است که شل منتظر وارد کردن دستورات است. به عبارت دیگر در مثال بالا دستور date اجرا شده است نه date $ !
ترکیب چند دستور
در شل امکان ترکیب چندین دستور در یک خط وجود دارد. برای این منظور میتوان دستورات را با استفاده از ; از هم جدا کرد. در این حالت خروجی هر دستور به ترتیب بر روی صفحهی نمایش نشان داده میشود. در حالت کلی به صورت زیر میتوان چندین دستور را پشتسر تایپ و اجرا کرد:
$ command1 ; command2 ; command3 ; ... ; commandN ;
مثال:
$ date; who Fri Mar 2 14:57:22 IRST 2012 baroon :0 2012-03-02 17:26 baroon pts/0 2012-03-02 17:27 (:0) $
در این مثال ابتدا دستور date اجرا و خروجی آن نمایش داده میشود و سپس دستور who اجرا میشود .
توجه: در صورتی که دستورات با ; از هم جدا نشوند، فقط اولی به عنوان دستور تلقی شده، و دومی بعنوان آرگومان به دستور پاس داده میشود، که در این حالت خطا رخ میدهد چون آرگومان غیرمعتبر است.
مثال
$ date who date: invalid date `who' $
یونیکس
سیستمهای یونیکسی شامل دو مولفهی زیر هستند:
- ابزارها
- هسته
ابزارها برنامههایی هستند قابل اجرا که به منظور انجام عمل خاصی مورد
استفاده قرار میگیرند. دو دستور بخش قبل یعنی date و who نمونهای از
ابزارهای یونیکس هستند. معمولاً هر برنامهای که میشناسید در دستهی
ابزارهای یونیکس قرار دارد.
هسته قلب سیستمهای یونیکسی است. هسته راه ارتباط ابزارها با سختافزار را
فراهم میکند. همچنین وظیفهی زمانبندی و تخصیص حافظه نیز بر عهدهی
هستهی یونیکس قرار دارد. همچنین از زمانی که سیستمعامل اجرا میشود تا
زمانی که اجرای آن پایان میباید هسته در حافظه قرار دارد.
مثال. زمانی که شما دستور who را اجرا میکنید شل بکمک توابع سیستمی از کرنل
می خواهد که برنامه را از روی هارد دیسک در حافظه رم بارگذاری کرده و سپس
آن را اجرا میکند. و زمانی که اجرای آن پایان مییابد از رم حذف میشود.
شل چیست؟
در بخش قبل با دستور date آشنا شدید و مشاهده کردید که زمانی که این دستور را وارد میکنید چه اتفاقی میافتد؟
درواقع سیستمعامل برنامهی خاصی به نام شل را برای اجرای دستورات شما
فراخوانی میکند. به عبارت دیگر شل رابطی را برای اجرای دستورات شما در
سیستمهای یونیکسی فراهم میکند. قدرت اصلی شل در این نهفته است که چیزی
بسیار فراتر از یک مفسر دستور است. شل یک زبان برنامهنویسی قدرتمند شامل
ساختارهای شرطی، حلقهها و توابع است.
نسخههای مختلف شل
به طور کلی انواع مختلف شل به دو دستهی زیر تقسیم میشوند:
Bourne shell شامل sh, bash, ksh The C shell شامل csh , tcsh
در صورتی که شما از bourne-shell استفاده کنید شکل prompt به صورت $ و
در صورتی که از C-shell استفاده کنید به صورت % خواهد بود.
در این ویکی، bash از خانوادهی bourne بررسی شدهاست.
انواع مختلف دستورات
اسامی مستعار (alias)
دستوراتی که بصورت میانبری به دستور دیگر برای شل معرفی شده است، مثلاً:
$ type ll ll is aliased to `ls -l --time-style='+%Y-%m-%d__%H:%M:%S
برای تعریف یک میانبر جدید هم:
alias ll='ls -l --time-style='+%Y-%m-%d__%H:%M:%S'
دستورات درونی (builtin)
دستوراتی که توسط خود شل اجرا میشوند و به برنامهٔ دیگری وابسته نیست.
مثال:
$ type cd cd is a shell builtin
$ type pwd pwd is a shell builtin
دستورات خارجی
که اغلب دستورات را تشکیل میدهند، متناظر با یک فایل اجرایی برای شل (باینری یا اسکریپت) هستند که در پوشههای خاصی قرار دارند که بعدا معرفی خواهد شد. مثلا:
$ type date date is /bin/date
$ type who who is /usr/bin/who
مسیردهی شل
زمانی که شما در شل دستوری تایپ و سپس وارد میکنید شل ابتدا بررسی
میکند که (اولین کلمهٔ) دستور ورودی، اسم مستعار هست یا نه، اگر نبود
بررسی میکند که آیا دستور دورنی هست یا نه، اگر نبود، با این فرض که یک
دستور خارجی است، به دنبال فایل اجرایی آن میگردد، اما در کجا؟ در
دایرکتوریهایی که لیست آنها در متغیر محیطی PATH تعیین شده است. در این
متغیر هر مسیر با استفاده از کاراکتر : از دیگری جدا میشود. اگر در
این دایرکتوریها هم فایل اجرایی با آن اسم پیدا نکرد، خطای Command not
found نمایش داده خواهد شد.
برای کاربرهای عادی، متغیر PATH حداقل این دایرکتوریها را شامل میشود:
PATH=/bin:/usr/bin:/usr/local/bin
برای کاربر ریشه، دایرکتوریهای sbin مخفف system binary را هم شامل میشود.
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
نوشتن و اجرای یک اسکریپت
یکی از مهمترین عملیاتی پس از نوشتن یک اسکریپت باید انجام شود قابل اجرا کردن آن است. به صورتی که اسکریپت مجوز اجرا داشته باشد.
برای نوشتن و اجرای یک اسکریپت ابتدا یک فایل متنی با نام first را باز
کرده و سپس دو خط زیر را درون آن بنویسید و سپس آن را با فرمت sh. ذخیره
کنید.
#!/bin/bash date; who
خط اول این اسکریپت که معروف به خط جادویی نیز است موجب ایجاد یک
نمونهی جدید از شل برای اجرای دستورات میشود. در صورتی که خط اول در
ابتدای اسکریپت نوشته نشود، از شل جاری برای اجرای اسکریپت استفاده میشود.
به عنوان مثال در صورتی که این خط نوشته نشود اسکریپتهایی که با استفاده
از tcsh یا csh نوشته شدهاند توسط bourne قابل اجرا نیست.
برای اجرایی کردن فایل first دستور زیر را اجرا کنید:
chmod +x first.sh
حال برای اجرای این اسکریپت میتوان از نام آن استفاده کرد:
first.sh
که خروجی مشابه زیر تولید میکند:
Fri Mar 2 22:19:12 IRST 2012 baroon :0 2012-03-02 23:22 baroon pts/0 2012-03-02 23:23 (:0)
نکته: دستور bin/bash/ !# حتماً باید در سطر اول اسکریپت قرار داشته باشد. در غیر اینصورت شل آن را نادیده میگیرد.
نکته: پسوند sh برای فایل اسکریپت لازم نیست، و خط اول فایل برای شل کافی است تا بفهمد باید آن را با bash اجرا کند.
اشاره: دستور chmod در فصل پنج بررسی شده است
توضیحات
توضیحات خطهایی در اسکریپت هستند که اجرا نمیشود و فقط برای مستند سازی
دستورات به کار میروند. در شل توضیحات با کاراکتر # آغاز میشوند و هر
چیزی که بعد از آن نوشته شود برای اجرا نادیده گرفته میشود. همچنین اکثر
برنامه نویسان اضافه کردن توضیحات به برنامهها را جهت خوانایی آن ضروری
میدانند.
مثال: اسکریپت بخش قبل را در نظر بگیرید. میتوان توضیحاتی به صورت زیر به آن اضافه نمود:
#!/bin/bash # print out the date and who's logged on date ; who ;
خروجی این اسکریپت با خروجی اسکریپت بخش قبل تفاوتی ندارد:
Fri Mar 2 22:19:12 IRST 2012 baroon :0 2012-03-02 23:22 baroon pts/0 2012-03-02 23:23 (:0)
همچنین میتوان توضیحات را به صورت زیر نیز اضافه نمود:
#!/bin/bash # print out the date and who's logged on date ; who ; # execute the date and who commands
که همچنان تفاوتی در خروجی ایجاد نمیشود.
Eman ۲ مارس ۲۰۱۲، ساعت ۲۰:۱۱ (UTC)
مصطفی جعفرپور ۵ آوریل ۲۰۱۲، ساعت ۰۹:۳۸ (UTC)
مصطفی جعفرپور ۷ آوریل ۲۰۱۲، ساعت ۱۹:۱۵ (UTC)