فصل دوم - اصول اولیه و تعریف برخی مفاهیم شل

از Linuxreview Wiki
پرش به: ناوبری, جستجو


محتویات

[نهفتن]

یک دستور چیست؟

در یونیکس یک دستور برنامه‌ای است که شما قادر به اجرای آن هستید. برای اجرای یک دستور باید نام آن را در محیط شل تایپ کنید.

مثال:

$ 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'
$

یونیکس

سیستم‌های یونیکسی شامل دو مولفه‌ی زیر هستند:

  1. ابزارها
  2. هسته

ابزارها برنامه‌هایی هستند قابل اجرا که به منظور انجام عمل خاصی مورد استفاده قرار میگیرند. دو دستور بخش قبل یعنی 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)

ابزارهای شخصی
گویش‌ها
فضاهای نام
عملکردها
گشتن
کتاب‌ها
مقاله‌ها
جعبه‌ابزار