| DASH(1) | General Commands Manual | DASH(1) |
نام (NAME)
dash —
مفسر
دستورات
(پوسته)
خلاصه دستور (SYNOPSIS)
dash
[-aCefnuvxIimqVEb]
[+aCefnuvxIimqVEb]
[-o option_name]
[+o option_name]
[command_file [argument ...]]
dash -c
[-aCefnuvxIimqVEb]
[+aCefnuvxIimqVEb]
[-o option_name]
[+o option_name]
command_string
[command_name [argument ...]]
dash -s
[-aCefnuvxIimqVEb]
[+aCefnuvxIimqVEb]
[-o option_name]
[+o option_name]
[argument ...]
توضیحات (DESCRIPTION)
dash مفسر
استاندارد
دستورات
برای سیستم
است. نسخهٔ
کنونی dash
در حال
توسعه برای
تطابق با
مشخصات POSIX 1003.2 و
1003.2a برای
پوستهها
است. این
نسخه
ویژگیهای
متعددی
دارد که از
برخی جهات
آن را شبیه
به پوستهٔ Korn
میکند،
اما یک
شبیهساز
پوستهٔ Korn
نیست
(ببینید
ksh(1)).
تنها
ویژگیهای
تعیینشده
توسط POSIX, به
همراه چند
افزونهٔ
برکلی، در
این پوسته
گنجانده
شدهاند.
این صفحهٔ
راهنما
قرار نیست
یک راهنمای
آموزشی یا
مشخصات
کامل این
پوسته
باشد.
نمای کلی (Overview)
پوسته دستوری است که خطوط را از یک فایل یا ترمینال میخواند، آنها را تفسیر میکند، و معمولاً دستورات دیگر را اجرا میکند. این همان برنامهای است که هنگام ورود کاربر به سیستم در حال اجرا است (اگرچه کاربر میتواند با استفاده از دستور chsh(1) پوستهٔ دیگری را انتخاب کند). پوسته زبانی را پیادهسازی میکند که شامل ساختارهای کنترل جریان، امکانات ماکرو که قابلیتهای متنوعی را افزون بر ذخیرهسازی دادهها فراهم میکند، و همچنین قابلیتهای توکار تاریخچه و ویرایش خط است. این پوسته ویژگیهای فراوانی را برای تسهیل استفادهٔ تعاملی در خود جای داده و این مزیت را دارد که زبان تفسیری آن میان هر دو حالت تعاملی و غیرتعاملی (اسکریپتهای پوسته) مشترک است. بدین معنا که دستورات میتوانند مستقیماً در پوستهٔ در حال اجرا تایپ شوند یا درون یک فایل قرار گرفته و فایل مستقیماً توسط پوسته اجرا شود.
فراخوانی (Invocation)
اگر هیچ
آرگومانی
داده نشده
باشد و
ورودی
استاندارد
پوسته به یک
ترمینال
متصل باشد
(یا اگر فلگ
-i تنظیم
شده باشد)، و
گزینهٔ -c
داده نشده
باشد،
پوسته یک
پوستهٔ
تعاملی (interactive)
در نظر
گرفته
میشود. یک
پوستهٔ
تعاملی
معمولاً
پیش از هر
دستور
اعلان (prompt)
نمایش
میدهد و
خطاهای
برنامهنویسی
و دستورات
را به
شیوهای
متفاوت
مدیریت
میکند
(همانگونه
که در زیر
توضیح داده
شده است).
هنگام آغاز
به کار،
پوسته
آرگومان ۰
را بررسی
میکند، و
اگر با خط
تیره ‘-’
آغاز شود،
پوسته به
عنوان یک
پوستهٔ
ورود (login shell) نیز
در نظر
گرفته
میشود. این
کار
معمولاً
هنگام
اولین ورود
کاربر توسط
سیستم به
طور خودکار
انجام
میشود. یک
پوستهٔ
ورود، نخست
دستورات را
از
فایلهای
/etc/profile و
.profile در
صورت وجود
میخواند.
اگر متغیر
محیطی ENV
هنگام ورود
به یک
پوستهٔ
تعاملی
تنظیم شده
باشد، یا در
.profile یک
پوستهٔ
ورود تنظیم
شده باشد،
پوسته در
مرحلهٔ بعد
دستورات را
از فایل
تعیینشده
در ENV
میخواند.
بنابراین،
کاربر باید
دستوراتی
را که تنها
هنگام ورود
به سیستم
باید اجرا
شوند در
فایل .profile
قرار دهد، و
دستوراتی
را که برای
هر پوستهٔ
تعاملی
اجرا
میشوند در
فایل
تعیینشده
توسط ENV
بگذارد.
برای تنظیم
متغیر ENV
روی یک فایل
مشخص، خط
زیر را در
فایل .profile
در
دایرکتوری
خانگی خود
قرار دهید:
ENV=$HOME/.shinit; export
ENVو به جای “.shinit” هر نام فایلی را که میخواهید جایگزین کنید.
اگر آرگومانهای خط فرمان علاوه بر گزینهها مشخص شده باشند، پوسته نخستین آرگومان را به عنوان نام فایلی که باید دستورات از آن خوانده شوند (اسکریپت پوسته) تلقی میکند، و آرگومانهای باقیمانده به عنوان پارامترهای موضعی پوسته ($1، $2، و غیره) تنظیم میشوند. در غیر این صورت، پوسته دستورات را از ورودی استاندارد خود میخواند.
پردازش لیست آرگومانها (Argument List Processing)
تمامی
گزینههای
تکحرفی که
نام
متناظری
دارند
میتوانند
به عنوان
آرگومان
برای
گزینهٔ -o
استفاده
شوند. نام
متناظر
برای -o در
توضیحات
زیر در کنار
گزینهٔ
تکحرفی
ارائه شده
است. مشخص
کردن یک خط
تیره “-”
گزینه را
فعال
میکند، در
حالی که
استفاده از
یک علامت
مثبت “+”
گزینه را
غیرفعال
میسازد.
گزینههای
زیر
میتوانند
از طریق خط
فرمان یا با
دستور
توکار set
(که بعداً
شرح داده
شده است)
تنظیم
شوند.
-aallexport- صدور (export) تمامی متغیرهایی که مقداری به آنها تخصیص مییابد.
-c- خواندن دستورات از عملوند command_string به جای ورودی استاندارد. پارامتر ویژهٔ 0 از عملوند command_name تنظیم شده و پارامترهای موضعی ($1، $2، و غیره) از سایر عملوندهای آرگومان تنظیم میشوند.
-Cnoclobber- عدم بازنویسی فایلهای موجود با استفاده از “>”.
-eerrexit- در صورت
غیرتعاملی
بودن
پوسته،
خروج فوری
چنانچه هر
دستور
آزمودهنشدهای
شکست بخورد.
وضعیت خروج
یک دستور در
صورتی به
صراحت
آزموده شده
تلقی
میشود که
برای کنترل
یک
if,elif,while, یاuntilاستفاده شود؛ یا اگر دستور در سمت چپ عملگر “&&” یا “||” قرار گیرد. -fnoglob- غیرفعالسازی گسترش نام مسیر (pathname expansion).
-nnoexec- در صورت غیرتعاملی بودن، خواندن دستورات بدون اجرای آنها. این گزینه برای بررسی صحت ساختار نحوی (syntax) اسکریپتهای پوسته مفید است.
-unounset- نوشتن پیام در خطای استاندارد هنگام تلاش برای گسترش متغیری که مقداردهی نشده است، و خروج فوری در صورتی که پوسته غیرتعاملی باشد.
-vverbose- پوسته همزمان با خواندن ورودی خود، آن را در خطای استاندارد مینویسد. برای اشکالزدایی مفید است.
-xxtrace- نوشتن هر دستور در خطای استاندارد (با پیشوند ‘+ ’) پیش از اجرای آن. برای اشکالزدایی مفید است.
-Iignoreeof- نادیده گرفتن پایان فایل (EOF) در ورودی هنگام کار در حالت تعاملی.
-iinteractive- اجبار پوسته به رفتار تعاملی.
-l- ایجاد رفتار مشابه فراخوانی به عنوان یک پوستهٔ ورود (login shell) در dash.
-mmonitor- فعال کردن کنترل کارها (job control) (به طور خودکار در حالت تعاملی تنظیم میشود).
-sstdin- خواندن
دستورات از
ورودی
استاندارد
(در صورت
نبود
آرگومانهای
فایل به طور
خودکار
تنظیم
میشود).
این گزینه
پس از شروع
به کار
پوسته
(مثلاً با
set) هیچ اثری ندارد. -Vvi- فعالسازی
ویرایشگر
خط فرمان
توکار
vi(1) (در
صورت تنظیم
بودن
-E, آن را غیرفعال میکند). -Eemacs- فعالسازی
ویرایشگر
خط فرمان
توکار
emacs(1) (در
صورت تنظیم
بودن
-V, آن را غیرفعال میکند). -bnotify- فعالسازی اعلان ناهمگام پایان کارهای پسزمینه. (پیادهسازینشده برای 4.4alpha)
ساختار لغوی (Lexical Structure)
پوسته ورودی را به صورت خطوطی از یک فایل میخواند و آن را در فاصلههای خالی (فاصلهها و تبها) و در توالیهای معینی از نویسهها که برای پوسته خاص هستند و “عملگرها” نامیده میشوند، به کلمات تجزیه میکند. دو نوع عملگر وجود دارد: عملگرهای کنترلی و عملگرهای تغییر مسیر (معنای آنها بعداً شرح داده میشود). در ادامه فهرستی از عملگرها آورده شده است:
- عملگرهای کنترلی:
-
& && ( ) ; ;; | || <newline> - عملگرهای تغییر مسیر:
-
< > >| << >> <& >& <<- <>
نقلقول (Quoting)
نقلقول برای حذف معنای ویژهٔ برخی نویسهها یا کلمات برای پوسته، مانند عملگرها، فاصلههای خالی یا کلمات کلیدی به کار میرود. سه نوع نقلقول وجود دارد: نقلقول تکی جفتشده، نقلقول جفتی جفتشده، و اسلش وارو (بکاسلش).
اسلش وارو (Backslash)
اسلش وارو معنای تحتاللفظی نویسهٔ بعدی را حفظ میکند، به استثنای ⟨newline⟩. یک اسلش وارو که قبل از یک ⟨newline⟩ قرار گیرد، به عنوان ادامهٔ خط در نظر گرفته میشود.
نقلقول تکی (Single Quotes)
قرار دادن نویسهها در نقلقول تکی، معنای تحتاللفظی تمامی نویسهها را حفظ میکند (به جز خود نقلقولهای تکی، که قرار دادن نقلقول تکی درون یک رشتهٔ محصور در نقلقول تکی را غیرممکن میسازد).
نقلقول جفتی (Double Quotes)
قرار دادن نویسهها درون نقلقول جفتی، معنای تحتاللفظی تمامی نویسهها را حفظ میکند، به جز علامت دلار ($), علامت بکتیک (`), و اسلش وارو (\). اسلش وارو درون نقلقول جفتی از نظر تاریخی رفتاری نامعمول دارد و تنها برای نقلقول کردن نویسههای زیر به کار میرود:
$ ` " \
<newline>کلمات رزروشده (Reserved Words)
کلمات رزروشده کلماتی هستند که معنای ویژهای برای پوسته دارند و در ابتدای یک خط و پس از یک عملگر کنترلی شناخته میشوند. کلمات زیر رزروشده هستند:
| ! | elif | fi | while | case |
| else | for | then | { | } |
| do | done | until | if | esac |
معنای آنها بعداً بررسی میشود.
نامهای مستعار (Aliases)
نام مستعار یک نام و مقدار متناظر با آن است که با استفاده از دستور توکار alias(1) تنظیم میشود. هر جا که ممکن است یک کلمهٔ رزروشده ظاهر شود (به بالا مراجعه کنید)، و پس از بررسی کلمات رزروشده، پوسته کلمه را بررسی میکند تا ببیند آیا با یک نام مستعار مطابقت دارد یا خیر. اگر مطابقت داشته باشد، آن را در جریان ورودی با مقدار مربوطه جایگزین میکند. برای مثال، اگر نام مستعاری به نام “lf” با مقدار “ls -F” وجود داشته باشد، ورودی:
lf foobar
⟨return⟩به شکل زیر تبدیل خواهد شد:
ls -F foobar
⟨return⟩نامهای مستعار راهی مناسب برای کاربران تازهکار فراهم میکنند تا میانبرهایی برای دستورات ایجاد کنند بدون آنکه نیازی به یادگیری ساخت توابع با آرگومان داشته باشند. همچنین میتوان از آنها برای ایجاد کدهای نامفهوم از نظر لغوی استفاده کرد. استفاده به این شکل توصیه نمیشود.
دستورات (Commands)
پوسته کلماتی را که میخواند مطابق با یک زبان تفسیر میکند که مشخصات آن خارج از حیطهٔ این صفحهٔ راهنما است (به BNF در سند POSIX 1003.2 مراجعه کنید). با این حال، اساساً یک خط خوانده میشود و اگر نخستین کلمهٔ خط (یا پس از یک عملگر کنترلی) یک کلمهٔ رزروشده نباشد، پوسته یک دستور ساده را شناسایی کرده است. در غیر این صورت، یک دستور پیچیده یا ساختار ویژهٔ دیگری ممکن است شناسایی شده باشد.
دستورات ساده (Simple Commands)
اگر یک دستور ساده شناسایی شده باشد، پوسته اقدامات زیر را انجام میدهد:
- کلمات ابتدایی به شکل “name=value” جدا شده و به محیط دستور ساده اختصاص داده میشوند. عملگرهای تغییر مسیر و آرگومانهای آنها (همانگونه که در زیر شرح داده شده) جدا شده و برای پردازش ذخیره میشوند.
- کلمات باقیمانده همانگونه که در بخش “گسترشها (Expansions)” توضیح داده شده است گسترش مییابند، و نخستین کلمهٔ باقیمانده به عنوان نام دستور در نظر گرفته شده و دستور مکانیابی میشود. کلمات باقیمانده به عنوان آرگومانهای دستور تلقی میشوند. اگر نام دستوری حاصل نشود، انتساب متغیرهای “name=value” که در بند ۱ شناسایی شده بودند پوستهٔ فعلی را تحت تأثیر قرار میدهند.
- تغییر مسیرها همانگونه که در بخش بعدی شرح داده شده است انجام میشوند.
تغییر مسیرها (Redirections)
تغییر مسیرها برای تغییر مکانی که یک دستور ورودی خود را از آن میخواند یا خروجیاش را به آن میفرستد به کار میروند. به طور کلی، تغییر مسیرها یک ارجاع موجود به یک فایل را باز میکنند، میبندند، یا تکثیر مینمایند. قالب کلی استفادهشده برای تغییر مسیر عبارت است از:
[n] redir-op
fileکه در آن redir-op یکی از عملگرهای تغییر مسیر ذکرشده در قبل است. در ادامه فهرستی از تغییر مسیرهای ممکن آورده شده است. مقدار [n] یک عدد اختیاری بین 0 تا 9 است، مانند ‘3’ (نه ‘[3]’), که به یک توصیفگر فایل (file descriptor) اشاره دارد.
- [n]> file
- تغییر مسیر خروجی استاندارد (یا n) به فایل.
- [n]>| file
- مشابه مورد
قبل، اما
نادیده
گرفتن
گزینهٔ
-C. - [n]>> file
- الحاق خروجی استاندارد (یا n) به انتهای فایل.
- [n]< file
- تغییر مسیر ورودی استاندارد (یا n) از فایل.
- [n1]<&n2
- تکثیر توصیفگر فایل n2 به عنوان stdin (یا توصیفگر فایل n1).
- [n]<&-
- بستن ورودی استاندارد (یا n).
- [n1]>&n2
- تکثیر توصیفگر فایل n2 به عنوان stdout (یا توصیفگر فایل n1).
- [n]>&-
- بستن خروجی استاندارد (یا n).
- [n]<> file
- باز کردن فایل برای خواندن و نوشتن در ورودی استاندارد (یا n).
تغییر مسیر زیر اغلب “here-document” نامیده میشود:
[n]<< delimiterhere-doc-text ...delimiter
تمامی متن در خطوط متوالی تا رسیدن به جداکننده (delimiter) ذخیره شده و در ورودی استاندارد یا توصیفگر فایل n (در صورت تعیین) در اختیار دستور قرار میگیرد. اگر جداکننده در خط اولیه نقلقول شده باشد، متن here-doc به صورت تحتاللفظی پردازش میشود؛ در غیر این صورت متن مشمول گسترش پارامتر، جایگزینی دستور، و گسترش محاسباتی میشود (همانگونه که در بخش “گسترشها” شرح داده شده است). اگر عملگر به جای “<<” به صورت “<<-” باشد، تبهای ابتدای خطوط در متن here-doc حذف میشوند.
جستجو و اجرا (Search and Execution)
سه نوع دستور وجود دارد: توابع پوسته، دستورات توکار، و برنامههای عادی – و دستور (بر اساس نام) به همین ترتیب جستجو میشود. هر یک از آنها به روش متفاوتی اجرا میشوند.
هنگامی که یک تابع پوسته اجرا میشود، تمامی پارامترهای موضعی پوسته (به جز $0 که بدون تغییر باقی میماند) روی آرگومانهای تابع پوسته تنظیم میشوند. متغیرهایی که صریحاً در محیط دستور قرار میگیرند (با قرار دادن انتساب به آنها قبل از نام تابع) برای تابع محلی شده و روی مقادیر ارائهشده تنظیم میگردند. سپس دستور ارائهشده در تعریف تابع اجرا میشود. پارامترهای موضعی پس از تکمیل دستور به مقادیر اولیهٔ خود بازگردانده میشوند. تمامی این مراحل درون پوستهٔ فعلی رخ میدهد.
دستورات توکار پوسته در درون پوسته اجرا میشوند، بدون آنکه فرایند جدیدی ایجاد شود.
در غیر این
صورت، اگر
نام دستور
با یک تابع
یا دستور
توکار
مطابقت
نداشته
باشد،
دستور به
عنوان یک
برنامهٔ
عادی در
فایلسیستم
جستجو
میشود
(همانگونه
که در بخش
بعدی شرح
داده شده
است). هنگامی
که یک
برنامهٔ
عادی اجرا
میشود،
پوسته
برنامه را
اجرا کرده و
آرگومانها
و متغیرهای
محیطی را به
برنامه
منتقل
میکند. اگر
برنامه یک
فایل
اجرایی
عادی نباشد
(یعنی اگر با
"عدد
جادویی" که
نمایش ASCII آن
"#!" است آغاز
نشود، به
طوری که
execve(2)
خطای ENOEXEC
را
برگرداند)
در این صورت
پوسته
برنامه را
در یک
زیرپوسته (subshell)
تفسیر
خواهد کرد.
پوستهٔ
فرزند در
این حالت
خود را
مجدداً
راهاندازی
میکند، به
طوری که اثر
آن مشابه
حالتی
خواهد بود
که یک
پوستهٔ
جدید برای
مدیریت
اسکریپت
موردی
پوسته
فراخوانی
شده باشد،
به جز
اینکه
مکان
دستورات
هششده در
پوستهٔ
والد توسط
فرزند به
خاطر سپرده
میشود.
توجه داشته باشید که نسخههای پیشین این سند و خود کد منبع گاهی به اشتباه و پراکنده به یک اسکریپت پوستهٔ فاقد عدد جادویی با عنوان "روال پوسته (shell procedure)" اشاره کردهاند.
جستجوی مسیر (Path Search)
هنگام مکانیابی یک دستور، پوسته ابتدا بررسی میکند که آیا تابع پوستهای با آن نام وجود دارد یا خیر. سپس به دنبال یک دستور توکار با آن نام میگردد. اگر دستور توکار پیدا نشد، یکی از دو حالت رخ میدهد:
- نامهای دستوری که شامل اسلش هستند، به سادگی و بدون انجام هیچگونه جستجویی اجرا میشوند.
- پوسته به
نوبت هر یک
از
مدخلهای
موجود در
PATHرا برای یافتن دستور جستجو میکند. مقدار متغیرPATHباید مجموعهای از مدخلها باشد که با دونقطه (colon) از یکدیگر جدا شدهاند. هر مدخل شامل نام یک دایرکتوری است. دایرکتوری جاری میتواند به صورت ضمنی با یک نام دایرکتوری خالی، یا به صورت صریح با یک نقطهٔ تنها مشخص شود.
وضعیت خروج دستور (Command Exit Status)
هر دستور یک وضعیت خروج دارد که میتواند رفتار سایر دستورات پوسته را تحت تأثیر قرار دهد. الگو به این صورت است که دستور برای حالت عادی یا موفقیت با صفر خارج میشود، و برای شکست، خطا، یا یک وضعیت نادرست با غیرصفر خارج میگردد. صفحهٔ راهنمای هر دستور باید کدهای خروج مختلف و معنای آنها را نشان دهد. علاوه بر این، دستورات توکار نیز کدهای خروج برمیگردانند، همانگونه که یک تابع اجراشدهٔ پوسته این کار را انجام میدهد.
اگر یک دستور کاملاً از انتساب متغیرها تشکیل شده باشد، وضعیت خروج دستور وضعیت خروج آخرین جایگزینی دستور در صورت وجود خواهد بود، و در غیر این صورت 0 است.
دستورات پیچیده (Complex Commands)
دستورات پیچیده ترکیبی از دستورات ساده به همراه عملگرهای کنترلی یا کلمات رزروشده هستند که با هم یک دستور پیچیدهٔ بزرگتر را میسازند. به طور کلیتر، یک دستور یکی از موارد زیر است:
- دستور ساده
- خطلوله (pipeline)
- لیست یا لیست مرکب
- دستور مرکب
- تعریف تابع
مگر آنکه خلاف آن قید شده باشد، وضعیت خروج یک دستور وضعیت خروج آخرین دستور سادهای است که توسط آن دستور اجرا شده است.
خطلولهها (Pipelines)
خطلوله توالی از یک یا چند دستور است که با عملگر کنترلی | از یکدیگر جدا شدهاند. خروجی استاندارد تمامی دستورات به جز دستور آخر، به ورودی استاندارد دستور بعدی متصل میشود. خروجی استاندارد آخرین دستور طبق معمول از پوسته به ارث برده میشود.
قالب یک خطلوله عبارت است از:
[!] command1 [| command2
...]خروجی استاندارد command1 به ورودی استاندارد command2 متصل میشود. ورودی استاندارد، خروجی استاندارد، یا هر دو برای یک دستور، پیش از اعمال هرگونه تغییر مسیر مشخصشده توسط عملگرهای تغییر مسیری که بخشی از دستور هستند، توسط خطلوله تخصیصیافته تلقی میشوند.
اگر خطلوله در پسزمینه نباشد (که بعداً شرح داده شده)، پوسته منتظر تکمیل تمامی دستورات میماند.
اگر گزینهٔ pipefail هنگام آغاز اجرای خطلوله توسط پوسته فعال بوده باشد، وضعیت خروج خطلوله وضعیت خروج آخرین دستور در خطلوله است که با وضعیت غیرصفر خارج شده است، یا در صورتی که تمامی دستورات خطلوله با وضعیت صفر خارج شده باشند، صفر خواهد بود. اگر گزینهٔ pipefail فعال نبوده باشد، وضعیت خروج خطلوله برابر با وضعیت خروج آخرین دستور مشخصشده در خطلوله است؛ وضعیت خروج سایر دستورات استفاده نمیشود. اگر کلمهٔ رزروشدهٔ ! پیش از خطلوله بیاید، وضعیت خروج آن NOT منطقی وضعیت خروج شرحدادهشده در بالا است.
از آنجا که تخصیص ورودی استاندارد یا خروجی استاندارد یا هر دو در خطلوله پیش از تغییر مسیر انجام میگیرد، میتواند با تغییر مسیر اصلاح شود. برای نمونه:
$ command1 2>&1 |
command2هم خروجی استاندارد و هم خطای استاندارد command1 را به ورودی استاندارد command2 ارسال میکند.
یک پایاندهندهٔ ; یا ⟨newline⟩ باعث میشود که لیست AND-OR قبلی (که در ادامه توضیح داده شده) به طور متوالی اجرا شود؛ یک & باعث اجرای ناهمگام لیست AND-OR قبلی میگردد.
توجه داشته باشید که بر خلاف برخی پوستههای دیگر، هر فرایند در خطلوله فرزندی از پوستهٔ فراخواننده است (مگر آنکه یک دستور توکار پوسته باشد، که در این صورت در پوستهٔ جاری اجرا میشود – اما هر اثری که بر محیط داشته باشد پاک خواهد شد).
دستورات پسزمینه – &
اگر دستوری با عملگر کنترلی امپرسند (&) خاتمه یابد، پوسته دستور را به صورت ناهمگام اجرا میکند – بدین معنا که پوسته پیش از اجرای دستور بعدی منتظر پایان کار آن دستور نمیماند.
قالب اجرای دستور در پسزمینه عبارت است از:
command1 & [command2 &
...]اگر پوسته غیرتعاملی باشد، ورودی استاندارد یک دستور ناهمگام بر روی /dev/null تنظیم میشود.
لیستها – بهطور کلی
لیست توالی از صفر یا چند دستور است که با خطوط جدید، نقطهویرگول (semicolon)، یا امپرسند از یکدیگر جدا شدهاند، و به صورت اختیاری با یکی از این سه نویسه خاتمه مییابند. دستورات در یک لیست به همان ترتیبی که نوشته شدهاند اجرا میشوند. اگر دستوری با امپرسند دنبال شود، پوسته دستور را آغاز کرده و فوراً به سراغ دستور بعدی میرود؛ در غیر این صورت منتظر پایان یافتن دستور پیش از رفتن به سراغ دستور بعدی میماند.
عملگرهای اتصال کوتاه در لیست (Short-Circuit List Operators)
“&&” و “||” عملگرهای لیست AND-OR هستند. “&&” دستور اول را اجرا میکند، و سپس دستور دوم را اگر و تنها اگر وضعیت خروج دستور اول صفر باشد اجرا مینماید. “||” مشابه است، اما دستور دوم را اگر و تنها اگر وضعیت خروج دستور اول غیرصفر باشد اجرا میکند. “&&” و “||” هر دو اولویت یکسانی دارند.
ساختارهای کنترل جریان – if, while, for, case
نحو دستور if عبارت است از:
if list then list [ elif list then list ] ... [ else list ] fi
نحو دستور while عبارت است از:
while list do list done
دو لیست تا زمانی که وضعیت خروج لیست اول صفر باشد به طور مکرر اجرا میشوند. دستور until مشابه است، اما کلمهٔ until را به جای while دارد، که باعث میشود تکرار تا زمانی که وضعیت خروج لیست اول صفر شود ادامه یابد.
نحو دستور for عبارت است از:
for variable [ in [ word ... ] ] do list done
کلمات پس از in گسترش مییابند، و سپس لیست به طور مکرر اجرا میشود در حالی که variable به نوبت روی هر کلمه تنظیم میگردد. حذف in word ... معادل in "$@" است.
نحو دستورهای break و continue عبارت است از:
break [ num ] continue [ num ]
دستور Break به تعداد num از درونیترین حلقههای for یا while را خاتمه میدهد. دستور Continue اجرای تکرار بعدی از درونیترین حلقه را ادامه میدهد. این موارد به عنوان دستورات توکار پیادهسازی شدهاند.
نحو دستور case عبارت است از:
case word in [(]pattern) list ;; ... esac
الگو میتواند در واقع یک یا چند الگو باشد (به الگوهای پوسته که بعداً شرح داده شده مراجعه کنید)، که با نویسههای “|” از یکدیگر جدا شدهاند. نویسهٔ “(” قبل از الگو اختیاری است.
گروهبندی دستورات در کنار یکدیگر (Grouping Commands Together)
دستورات ممکن است با نوشتن یکی از حالتهای زیر گروهبندی شوند:
(list)یا
{ list; }حالت نخست، دستورات را درون یک زیرپوسته (subshell) اجرا میکند. دستورات توکار گروهبندیشده در یک (list) پوستهٔ فعلی را تحت تأثیر قرار نخواهند داد. شکل دوم پوستهٔ دیگری ایجاد نمیکند، بنابراین کمی کارآمدتر است. گروهبندی دستورات با این شیوه به شما امکان میدهد خروجی آنها را چنان تغییر مسیر دهید که گویی یک برنامهٔ واحد هستند:
{ printf " hello " ; printf " world\n" ; } > greeting
توجه داشته باشید که “}” باید پس از یک عملگر کنترلی (در اینجا “;”) بیاید تا به عنوان یک کلمهٔ رزروشده شناخته شود و نه به عنوان آرگومان دیگری از دستور.
توابع (Functions)
نحو تعریف یک تابع عبارت است از:
name () commandتعریف تابع یک دستور اجرایی است؛ هنگامی که اجرا میشود تابعی به نام name را نصب کرده و وضعیت خروج صفر برمیگرداند. دستور command معمولاً لیستی است که میان “{” و “}” محصور شده است.
متغیرها میتوانند با استفاده از دستور local برای یک تابع محلی اعلام شوند. این دستور باید به عنوان نخستین دستور تابع ظاهر شود، و نحو آن چنین است:
local [variable | -] ...دستور Local به صورت یک دستور توکار پیادهسازی شده است.
هنگامی که متغیری محلی میشود، مقدار اولیه و فلگهای صدور (exported) و فقطخواندنی (readonly) را از متغیری با همین نام در حوزهٔ بیرونی (در صورت وجود) به ارث میبرد. در غیر این صورت، متغیر در ابتدا مقداردهی نشده است. پوسته از حوزهٔ پویا (dynamic scoping) استفاده میکند، بنابراین اگر متغیر x را در تابع f محلی کنید، و سپس f تابع g را فراخوانی کند، ارجاعات به متغیر x که درون g انجام میشوند به متغیر x اعلانشده درون f اشاره خواهند داشت، نه به متغیر سراسری با نام x.
تنها پارامتر ویژهای که میتواند محلی شود “-” است. محلی کردن “-” باعث میشود هر گزینهٔ پوستهای که از طریق دستور set درون تابع تغییر میکند، هنگام بازگشت تابع به مقادیر اولیهٔ خود بازگردانده شود.
نحو دستور return عبارت است از:
return [exitstatusاین دستور اجرای تابع در حال اجرا را خاتمه میدهد. دستور Return به صورت یک دستور توکار پیادهسازی شده است.
متغیرها و پارامترها (Variables and Parameters)
پوسته مجموعهای از پارامترها را نگهداری میکند. پارامتری که با یک نام مشخص شود متغیر نامیده میشود. هنگام آغاز به کار، پوسته تمامی متغیرهای محیطی را به متغیرهای پوسته تبدیل میکند. متغیرهای جدید میتوانند با استفاده از فرم زیر مقداردهی شوند:
name=valueمتغیرهایی که توسط کاربر تنظیم میشوند باید نامی متشکل از حروف الفبا، اعداد، و زیرخط (underscore) داشته باشند – که نخستین نویسهٔ آن نباید عددی باشد. یک پارامتر همچنین میتواند با یک عدد یا یک نویسهٔ ویژه مشخص شود همانگونه که در زیر توضیح داده شده است.
پارامترهای موضعی (Positional Parameters)
پارامتر
موضعی
پارامتری
است که با یک
عدد مشخص
میشود (n > 0).
پوسته در
ابتدا این
پارامترها
را روی
مقادیر
آرگومانهای
خط فرمان
خود که پس از
نام
اسکریپت
پوسته
میآیند
تنظیم
میکند.
دستور
توکار set
نیز
میتواند
برای تنظیم
یا
بازنشانی
آنها
استفاده
شود.
پارامترهای ویژه (Special Parameters)
پارامتر ویژه پارامتری است که با یکی از نویسههای ویژهٔ زیر مشخص میشود. مقدار پارامتر در کنار نویسهٔ آن فهرست شده است.
- *
- به
پارامترهای
موضعی
گسترش
مییابد،
که از یک
شروع
میشوند.
هنگامی که
گسترش درون
یک رشتهٔ
محصور در
نقلقول
جفتی رخ
میدهد، به
یک فیلد
واحد گسترش
مییابد که
مقدار هر
پارامتر در
آن با
نخستین
نویسهٔ
متغیر
IFSاز یکدیگر جدا شده است، یا با یک ⟨space⟩ در صورتی کهIFSتنظیم نشده باشد. - @
- به
پارامترهای
موضعی
گسترش
مییابد،
که از یک
شروع
میشوند.
هنگامی که
گسترش درون
نقلقول
جفتی رخ
میدهد، هر
پارامتر
موضعی به
عنوان یک
آرگومان
جداگانه
گسترش
مییابد.
اگر هیچ
پارامتر
موضعی وجود
نداشته
باشد،
گسترش @ هیچ
آرگومانی
تولید
نمیکند،
حتی اگر @
درون
نقلقول
جفتی باشد.
معنای
اساسی این
موضوع به
عنوان مثال
این است که
اگر $1 برابر
با “abc” و $2
برابر با “def
ghi” باشد، در
این صورت "$@"
به دو
آرگومان
زیر گسترش
مییابد:
"abc" "def ghi" - #
- به تعداد پارامترهای موضعی گسترش مییابد.
- ?
- به وضعیت خروج آخرین خطلوله گسترش مییابد.
- - (خط تیره)
- به فلگهای گزینههای جاری (نامهای تکحرفی گزینهها که به صورت یک رشته به هم پیوستهاند) گسترش مییابد، همانگونه که در هنگام فراخوانی، توسط دستور توکار set، یا به طور ضمنی توسط پوسته مشخص شده است.
- $
- به شناسهٔ فرایند (PID) پوستهٔ فراخواندهشده گسترش مییابد. یک زیرپوسته همان مقدار $ والد خود را حفظ میکند.
- !
- به شناسهٔ فرایند (PID) آخرین دستور پسزمینه که از پوستهٔ جاری اجرا شده گسترش مییابد. برای یک خطلوله، شناسهٔ فرایند متعلق به آخرین دستور در خطلوله است.
- 0 (صفر)
- به نام پوسته یا اسکریپت پوسته گسترش مییابد.
گسترشهای کلمه (Word Expansions)
این بند گسترشهای مختلفی را که روی کلمات انجام میشوند شرح میدهد. همهٔ گسترشها روی همهٔ کلمات انجام نمیشوند، همانگونه که بعداً توضیح داده شده است.
گسترشهای تیلدا، گسترشهای پارامتر، جایگزینیهای دستور، گسترشهای محاسباتی، و حذف نقلقولها که درون یک کلمهٔ واحد رخ میدهند، به یک فیلد واحد گسترش مییابند. تنها تفکیک فیلدها یا گسترش نام مسیر است که میتواند چندین فیلد از یک کلمهٔ واحد بسازد. تنها استثنا بر این قاعده، گسترش پارامتر ویژهٔ @ درون نقلقول جفتی است، همانگونه که در بالا شرح داده شد.
ترتیب گسترش کلمات به این شرح است:
- گسترش تیلدا، گسترش پارامتر، جایگزینی دستور، گسترش محاسباتی (این موارد همگی همزمان رخ میدهند).
- تفکیک
فیلدها روی
فیلدهای
تولیدشده
توسط گام (۱)
انجام
میشود مگر
آنکه
متغیر
IFSتهی (null) باشد. - گسترش نام
مسیر (مگر
آنکه set
-fدر حال اجرا باشد). - حذف نقلقول.
نویسهٔ $ برای معرفی گسترش پارامتر، جایگزینی دستور، یا ارزیابی محاسباتی به کار میرود.
گسترش تیلدا (جایگزینی دایرکتوری خانگی کاربر)
کلمهای که با یک نویسهٔ تیلدا (~) بدون نقلقول آغاز شود مشمول گسترش تیلدا میگردد. تمامی نویسهها تا یک اسلش (/) یا انتهای کلمه به عنوان نام کاربری در نظر گرفته شده و با دایرکتوری خانگی آن کاربر جایگزین میشوند. اگر نام کاربری وجود نداشته باشد (مانند ~/foobar), تیلدا با مقدار متغیر HOME (دایرکتوری خانگی کاربر فعلی) جایگزین میشود.
گسترش پارامتر (Parameter Expansion)
قالب گسترش پارامتر به این شکل است:
${expression}که در آن عبارت (expression) شامل تمامی نویسهها تا “}” متناظر است. هر “}” که با یک اسلش وارو اسکیپ شده باشد یا درون یک رشتهٔ محصور در نقلقول باشد، و نویسهها در گسترشهای محاسباتی تعبیهشده، جایگزینیهای دستور، و گسترشهای متغیر، در تعیین “}” متناظر بررسی نمیشوند.
سادهترین شکل برای گسترش پارامتر چنین است:
${parameter}مقدار parameter (در صورت وجود) جایگزین میشود.
نام یا نماد پارامتر میتواند درون آکولادها محصور شود، که این آکولادها اختیاری هستند به جز برای پارامترهای موضعی دارای بیش از یک رقم یا هنگامی که پس از پارامتر نویسهای بیاید که میتواند به عنوان بخشی از نام تفسیر شود. اگر گسترش پارامتر درون نقلقول جفتی رخ دهد:
- گسترش نام مسیر روی نتایج گسترش انجام نمیشود.
- تفکیک فیلدها روی نتایج گسترش انجام نمیشود، به استثنای @.
علاوه بر این، یک گسترش پارامتر میتواند با استفاده از یکی از قالبهای زیر تغییر یابد:
- ${parameter:-word}
- استفاده از مقادیر پیشفرض. اگر parameter مقداردهی نشده یا تهی باشد، گسترش word جایگزین میشود؛ در غیر این صورت مقدار parameter جایگزین میگردد.
- ${parameter:=word}
- انتساب مقادیر پیشفرض. اگر parameter مقداردهی نشده یا تهی باشد، گسترش word به parameter انتساب مییابد. در تمامی حالات، مقدار نهایی parameter جایگزین میشود. تنها متغیرها، و نه پارامترهای موضعی یا پارامترهای ویژه، میتوانند به این شیوه انتساب یابند.
- ${parameter:?[word]}
- نمایش خطا در صورت تهی بودن یا نبود مقدار. اگر parameter مقداردهی نشده یا تهی باشد، گسترش word (یا پیامی دال بر نبود مقدار در صورت حذف word) در خطای استاندارد نوشته شده و پوسته با وضعیت خروج غیرصفر خارج میشود. در غیر این صورت، مقدار parameter جایگزین میگردد. یک پوستهٔ تعاملی نیازی به خروج ندارد.
- ${parameter:+word}
- استفاده از مقدار جایگزین. اگر parameter مقداردهی نشده یا تهی باشد، تهی جایگزین میشود؛ در غیر این صورت، گسترش word جایگزین میگردد.
در گسترشهای پارامتر که در بالا نشان داده شد، استفاده از دونقطه در قالب موجب آزمایش برای پارامتری میشود که تنظیمنشده یا تهی است؛ حذف دونقطه موجب آزمایش برای پارامتری میشود که فقط تنظیمنشده باشد.
- ${#parameter}
- طول رشته. طول مقدار parameter بر حسب تعداد نویسهها.
چهار گونهٔ زیر از گسترش پارامتر امکان پردازش زیررشتهها را فراهم میکنند. در هر مورد، از نمادگذاری تطبیق الگو (ببینید الگوهای پوسته) ، به جای نمادگذاری عبارتهای منظم (regex)، برای ارزیابی الگوها استفاده میشود. اگر parameter برابر با * یا @ باشد، نتیجهٔ گسترش نامشخص است. قرار دادن کل رشتهٔ گسترش پارامتر درون نقلقول جفتی موجب نقلقول شدن نویسههای الگوی چهار گونهٔ زیر نمیشود، در حالی که نقلقول کردن نویسهها درون آکولادها چنین اثری دارد.
- ${parameter%word}
- حذف کوچکترین الگوی پسوند. کلمه word گسترش مییابد تا الگویی ایجاد شود. سپس گسترش پارامتر منجر به parameter میشود، به طوری که کوچکترین بخش از پسوند که با الگو مطابقت دارد حذف شده است.
- ${parameter%%word}
- حذف بزرگترین الگوی پسوند. کلمه word گسترش مییابد تا الگویی ایجاد شود. سپس گسترش پارامتر منجر به parameter میشود، به طوری که بزرگترین بخش از پسوند که با الگو مطابقت دارد حذف شده است.
- ${parameter#word}
- حذف کوچکترین الگوی پیشوند. کلمه word گسترش مییابد تا الگویی ایجاد شود. سپس گسترش پارامتر منجر به parameter میشود، به طوری که کوچکترین بخش از پیشوند که با الگو مطابقت دارد حذف شده است.
- ${parameter##word}
- حذف بزرگترین الگوی پیشوند. کلمه word گسترش مییابد تا الگویی ایجاد شود. سپس گسترش پارامتر منجر به parameter میشود، به طوری که بزرگترین بخش از پیشوند که با الگو مطابقت دارد حذف شده است.
جایگزینی دستور (Command Substitution)
جایگزینی دستور امکان میدهد که خروجی یک دستور به جای خود نام دستور جایگزین شود. جایگزینی دستور هنگامی رخ میدهد که دستور به شکل زیر محصور شده باشد:
$(command)یا (نسخهٔ “محصور در بکتیک”):
`command`پوسته
جایگزینی
دستور را با
اجرای command در
یک محیط
زیرپوسته و
جایگزین
کردن
جایگزینی
دستور با
خروجی
استاندارد
دستور
گسترش
میدهد، و
توالیهای
یک یا چند
⟨newline⟩را در
انتهای
جایگزینی
حذف میکند.
(نویسههای
⟨newline⟩تعبیهشده
پیش از
انتهای
خروجی حذف
نمیشوند؛
با این حال،
در طول
تفکیک
فیلدها،
ممکن است
بسته به
مقدار IFS
و
نقلقولهای
فعال، به
⟨space⟩تبدیل
شوند.)
گسترش محاسباتی (Arithmetic Expansion)
گسترش محاسباتی سازوکاری برای ارزیابی یک عبارت محاسباتی و جایگزین کردن مقدار آن فراهم میکند. قالب گسترش محاسباتی به این صورت است:
$((expression))با عبارت طوری رفتار میشود که گویی درون نقلقول جفتی است، به جز اینکه نقلقول جفتی درون عبارت رفتار ویژهای ندارد. پوسته تمامی نشانهها (tokens) در عبارت را برای گسترش پارامتر، جایگزینی دستور، و حذف نقلقول گسترش میدهد.
سپس، پوسته با آن به عنوان یک عبارت محاسباتی رفتار کرده و مقدار عبارت را جایگزین میکند.
تفکیک بر اساس فاصلهها (Field Splitting)
پس از گسترش پارامتر، جایگزینی دستور، و گسترش محاسباتی، پوسته نتایج گسترشها و جایگزینیهایی را که درون نقلقول جفتی رخ ندادهاند برای تفکیک فیلدها بررسی میکند و چندین فیلد میتواند حاصل شود.
پوسته با
هر نویسه از
IFS به
عنوان یک
جداکننده
رفتار کرده
و از
جداکنندهها
برای تفکیک
نتایج
گسترش
پارامتر و
جایگزینی
دستور به
فیلدها
استفاده
میکند.
اگر IFS
خالی باشد،
تفکیک
فیلدها در
صورتی که
رشتهٔ
ورودی خالی
بوده باشد
هیچ فیلدی
تولید
نمیکند، و
در غیر این
صورت یک
رشته با
مقدار بدون
تغییر
ورودی
تولید
مینماید.
برای مثال،
با IFS
پیشفرض،
دستور
“read -r
l”
هرگونه
فاصلهٔ
خالی
ابتدایی را
حذف خواهد
کرد، اما
“IFS= read
-r l”
کل خط را
درون l
باقی خواهد
گذاشت.
گسترش مسیر فایل (تولید نام فایل)
مگر آنکه
فلگ -f
تنظیم شده
باشد،
تولید نام
فایل پس از
تکمیل
تفکیک
کلمات
انجام
میشود. به
هر کلمه به
عنوان
توالی از
الگوها
نگریسته
میشود که
با اسلشها
از یکدیگر
جدا
شدهاند.
فرآیند
گسترش،
کلمه را با
نامهای
تمامی
فایلهای
موجود که
نام آنها
میتواند
با
جایگزینی
هر الگو با
رشتهای که
با الگوی
مشخص
مطابقت
دارد ساخته
شود،
جایگزین
میکند. دو
محدودیت بر
این موضوع
حاکم است:
نخست، یک
الگو
نمیتواند
با رشتهای
حاوی اسلش
مطابقت
یابد، و
دوم، یک
الگو
نمیتواند
با رشتهای
که با یک
نقطه آغاز
میشود
مطابقت
یابد مگر
آنکه
نخستین
نویسهٔ
الگو یک
نقطه باشد.
بخش بعدی
الگوهای
مورد
استفاده را
هم برای
گسترش نام
مسیر و هم
برای دستور
case شرح
میدهد.
الگوهای پوسته (Shell Patterns)
یک الگو از نویسههای عادی، که با خودشان مطابقت مییابند، و فرانویسهها (meta-characters) تشکیل میشود. فرانویسهها عبارتند از: “!”, “*”, “?”, و “[”. این نویسهها در صورت نقلقول شدن معنای ویژهٔ خود را از دست میدهند. هنگامی که جایگزینی دستور یا متغیر انجام میشود و علامت دلار یا بکتیک درون نقلقول جفتی نباشد، مقدار متغیر یا خروجی دستور برای یافتن این نویسهها بررسی شده و آنها به فرانویسهها تبدیل میشوند.
یک ستاره (“*”) با هر رشتهای از نویسهها مطابقت مییابد. علامت سؤال با هر نویسهٔ منفرد مطابقت مییابد. یک کروشهٔ باز (“[”) یک کلاس نویسه را معرفی میکند. انتهای کلاس نویسه با یک (“]”) مشخص میشود؛ اگر “]” وجود نداشته باشد، در این صورت “[” به جای معرفی کلاس نویسه، با یک “[” تطبیق داده میشود. یک کلاس نویسه با هر یک از نویسههای بین کروشهها مطابقت مییابد. محدودهای از نویسهها میتواند با استفاده از علامت منفی مشخص شود. کلاس نویسه میتواند با قرار دادن علامت تعجب به عنوان نخستین نویسهٔ کلاس نویسه متمم شود.
برای گنجاندن یک “]” در یک کلاس نویسه، آن را به عنوان نخستین نویسهٔ فهرستشده قرار دهید (پس از “!”, در صورت وجود). برای گنجاندن علامت منفی، آن را به عنوان نخستین یا آخرین نویسهٔ فهرستشده قرار دهید.
دستورات توکار (Builtins)
این بخش دستورات توکاری را فهرست میکند که توکار هستند زیرا نیاز به انجام عملیاتی دارند که نمیتواند توسط یک فرایند جداگانه انجام شود. علاوه بر اینها، چندین دستور دیگر نیز وجود دارند که ممکن است به منظور افزایش کارایی توکار باشند (مانند printf(1), echo(1), test(1), و غیره).
- :
- true
- دستوری تهی (null) که مقدار خروج 0 (درست / true) برمیگرداند.
- false
- دستوری تهی (null) که مقدار خروج 1 (نادرست / false) برمیگرداند.
- . file
- دستورات موجود در فایل مشخصشده توسط پوسته خوانده و اجرا میشوند.
- alias [name[=string ...]]
- اگر name=string
مشخص شود،
پوسته نام
مستعار
name را با
مقدار string
تعریف
میکند. اگر
تنها name
مشخص شود،
مقدار نام
مستعار
name چاپ
میشود.
بدون هیچ
آرگومانی،
دستور
توکار
aliasنامها و مقادیر تمامی نامهای مستعار تعریفشده را چاپ میکند (ببینیدunalias). - bg [job] ...
- ادامهٔ کارهای مشخصشده (یا کار فعلی در صورت مشخص نشدن هیچ کاری) در پسزمینه.
- command [
-p] [-v] [-V] command [arg ...] - اجرای
دستور
مشخصشده
با نادیده
گرفتن
توابع
پوسته
هنگام
جستجو برای
آن. (این
مورد زمانی
مفید است که
یک تابع
پوسته با
نامی مشابه
با یک دستور
توکار
داشته
باشید.)
-p- جستجوی
دستور با
استفاده
از یک
PATHکه یافتن تمامی ابزارهای استاندارد را تضمین میکند. -V- عدم اجرای دستور اما جستجو برای آن و چاپ نتیجهٔ تفکیک جستجوی دستور. این گزینه مشابه دستور توکار type است.
-v- عدم اجرای دستور اما جستجو برای آن و چاپ مسیر مطلق ابزارها، نام دستورات توکار یا گسترش نامهای مستعار.
- cd|chdir -
- cd|chdir [
-LP] [directory] - تغییر مکان
به
دایرکتوری
مشخصشده
(پیشفرض
HOME). اگر مدخلی برایCDPATHدر محیط دستورcdظاهر شود یا متغیر پوستهٔCDPATHتنظیم شده باشد و نام دایرکتوری با یک اسلش آغاز نشود، در این صورت دایرکتوریهای فهرستشده درCDPATHبرای یافتن دایرکتوری مشخصشده جستجو خواهند شد. قالبCDPATHمشابه قالبPATHاست. اگر یک خط تیرهٔ تنها به عنوان آرگومان مشخص شود، با مقدارOLDPWDجایگزین خواهد شد. دستورcdدر صورتی که نام دایرکتوری تغییریافته با نامی که کاربر وارد کرده متفاوت باشد، نام آن را چاپ خواهد کرد. این تفاوت ممکن است به دلیل استفاده از سازوکارCDPATHیا مشخص شدن خط تیرهٔ تنها به عنوان آرگومان باشد. گزینهٔ-Pموجب میشود ساختار فیزیکی دایرکتوری استفاده شود، یعنی تمامی پیوندهای نمادین به مقادیر مربوطهٔ خود تفکیک شوند. گزینهٔ-Lاثر گزینههای قبلی-Pرا لغو میکند. - echo [
-n] args... - چاپ
آرگومانها
روی خروجی
استاندارد،
که با
فاصلهها
از یکدیگر
جدا
شدهاند.
مگر آنکه
گزینهٔ
-nحاضر باشد، یک خط جدید در انتهای آرگومانها خروجی داده میشود.اگر هر یک از توالیهای نویسهای زیر در حین خروجی مشاهده شود، آن توالی خروجی داده نمیشود، بلکه اقدام مشخصشده انجام میگیرد:
\b- یک نویسهٔ پسبر (backspace) چاپ میشود.
\c- خروجیهای
بعدی
متوقف
میشوند.
این
معمولاً
در انتهای
آخرین
آرگومان
برای
جلوگیری
از چاپ خط
جدید
انتهایی
که
echoدر غیر این صورت چاپ میکرد استفاده میشود. \f- چاپ یک فرمفید (form feed).
\n- چاپ یک نویسهٔ خط جدید (newline).
\r- چاپ یک نویسهٔ بازگشت به ابتدای سطر (carriage return).
\t- چاپ یک نویسهٔ تب (افقی).
\v- چاپ یک تب عمودی.
\0digits- چاپ نویسهای که مقدار آن با صفر تا سه رقم اکتال (پایهٔ ۸) مشخص شده است. اگر هیچ رقمی نباشد، یک نویسهٔ تهی (nul) خروجی داده میشود.
\\- چاپ یک اسلش وارو (بکاسلش).
تمامی توالیهای دیگر اسلش وارو رفتار تعریفنشده ایجاد میکنند.
- eval string ...
- اتصال تمامی آرگومانها با فاصله، و سپس تجزیهٔ مجدد و اجرای دستور.
- exec [command arg ...]
- مگر در صورت
حذف command،
فرایند
پوسته با
برنامهٔ
مشخصشده
جایگزین
میشود (که
باید یک
برنامهٔ
واقعی
باشد، نه یک
دستور
توکار یا
تابع
پوسته).
هرگونه
تغییر مسیر
روی دستور
execبه عنوان دائمی علامتگذاری میشود، به طوری که با پایان دستورexecلغو نخواهند شد. - exit [exitstatus]
- پایان دادن به فرایند پوسته. اگر exitstatus داده شود، به عنوان وضعیت خروج پوسته استفاده میشود؛ در غیر این صورت وضعیت خروج دستور قبلی استفاده خواهد شد.
- export name ...
- export
-p - نامهای
مشخصشده
صادر (export)
میشوند تا
در محیط
دستورات
بعدی ظاهر
شوند. تنها
راه لغو
صدور یک
متغیر، حذف
مقدار آن (unset)
است. پوسته
امکان
میدهد
مقدار یک
متغیر
همزمان با
صدور آن با
نوشتن
عبارت زیر
تنظیم شود:
export name=valueبدون هیچ آرگومانی، دستور export نام تمامی متغیرهای صادرشده را فهرست میکند. با مشخص شدن گزینهٔ
-p, خروجی به گونهای قالببندی میشود که برای استفادهٔ غیرتعاملی مناسب باشد. - fc [
-eeditor] [first [last]] - fc
-l[-nr] [first [last]] - fc
-s[old=new] [first] - دستور
توکار
fcدستوراتی را که پیشتر به یک پوستهٔ تعاملی وارد شدهاند فهرست میکند، یا ویرایش کرده و دوباره اجرا مینماید.-eeditor- استفاده
از
ویرایشگر
تعیینشده
با editor برای
ویرایش
دستورات.
رشتهٔ editor یک
نام دستور
است که
مشمول
جستجو از
طریق
متغیر
PATHمیباشد. مقدار متغیرFCEDITدر صورت مشخص نشدن-eبه عنوان پیشفرض استفاده میشود. اگرFCEDITتهی یا تنظیمنشده باشد، مقدار متغیرEDITORاستفاده خواهد شد. اگرEDITORتهی یا تنظیمنشده باشد، ed(1) به عنوان ویرایشگر استفاده میشود. -l(ell)- فهرست
کردن
دستورات
به جای
فراخوانی
ویرایشگر
روی آنها.
دستورات
به ترتیبی
که توسط
عملوندهای
first و last مشخص
شده، با
اعمال اثر
-r, نوشته میشوند و پیش از هر دستور شمارهٔ آن قرار میگیرد. -n- حذف شمارهٔ دستورات هنگام فهرست کردن با -l.
-r- معکوس
کردن
ترتیب
دستورات
فهرستشده
(با
-l) یا ویرایششده (در صورت نبود-lو-s). -s- اجرای مجدد دستور بدون فراخوانی ویرایشگر.
- first
- last
- انتخاب
دستورات
برای
فهرست
کردن یا
ویرایش.
تعداد
دستورات
قبلی که
میتوان
به آنها
دسترسی
داشت بر
اساس
مقدار
متغیر
HISTSIZEتعیین میشود. مقدار first یا last یا هر دو یکی از موارد زیر است:- [+]number
- یک عدد
مثبت که
نشاندهندهٔ
شمارهٔ
دستور
است؛
شمارهٔ
دستورات
را
میتوان
با گزینهٔ
-lنمایش داد. -number- یک عدد اعشاری منفی که نشاندهندهٔ دستوری است که به تعداد آن عدد قبلتر اجرا شده است. برای مثال، -1 دستوری است که بلافاصله پیش از دستور فعلی اجرا شده است.
- string
- رشتهای
که
نشاندهندهٔ
جدیدترین
دستور
واردشده
است که با
آن رشته
آغاز
میشود.
اگر
عملوند old=new
با
-sمشخص نشده باشد، شکل رشتهای عملوند نخست نمیتواند حاوی علامت مساوی تعبیهشده باشد.
متغیرهای محیطی زیر بر اجرای fc تأثیر میگذارند:
- fg [job]
- انتقال کار مشخصشده یا کار فعلی به پیشزمینه.
- getopts optstring var [arg ...]
- دستور
getoptsاستاندارد POSIX, که نباید با ابزار برگرفته از آزمایشگاههای بل (Bell Labs-derived) getopt(1) اشتباه گرفته شود.آرگومان نخست باید توالی از حروف باشد، که هر یک میتواند به صورت اختیاری با یک دونقطه دنبال شود تا نشان دهد آن گزینه به یک آرگومان نیاز دارد. متغیر مشخصشده روی گزینهٔ تجزیهشده تنظیم میشود.
دستور
getoptsابزار قدیمیتر getopt(1) را به دلیل نحوهٔ مدیریت آرگومانهای حاوی فاصله منسوخ میکند.دستور توکار
getoptsمیتواند برای دریافت گزینهها و آرگومانهای آنها از یک لیست از پارامترها به کار رود. هنگام فراخوانی،getoptsمقدار گزینهٔ بعدی را از رشتهٔ گزینهها در متغیر پوستهٔ مشخصشده توسط var و شاخص آن را در متغیر پوستهٔOPTINDقرار میدهد. هنگام فراخوانی پوسته،OPTINDروی 1 مقداردهی اولیه میشود. برای هر گزینهای که نیازمند آرگومان باشد، دستور توکارgetoptsآن را در متغیر پوستهٔOPTARGقرار خواهد داد. اگر گزینهای در optstring مجاز دانسته نشده باشد، متغیرOPTARGحذف مقدار خواهد شد.به طور پیشفرض، متغیرهای $1, ..., $n بررسی میشوند؛ در صورت مشخص شدن args, آنها به جای متغیرها تجزیه خواهند شد.
متغیر optstring رشتهای از حروف گزینههای شناختهشده است (ببینید getopt(3)). اگر حرفی با دونقطه دنبال شود، انتظار میرود که گزینه دارای آرگومانی باشد که ممکن است با فاصله از آن جدا شده یا نشده باشد. اگر نویسهٔ گزینهای در جایی که انتظار میرفت یافت نشود،
getoptsمتغیر var را روی یک “?” تنظیم میکند؛ سپسgetoptsمقدارOPTARGرا حذف کرده و خروجی را در خطای استاندارد مینویسد. با مشخص کردن یک دونقطه به عنوان نخستین نویسهٔ optstring تمامی خطاها نادیده گرفته خواهند شد.پس از آخرین گزینه،
getoptsیک مقدار غیرصفر برگردانده و var را روی “?” تنظیم میکند.قطعه کد زیر نشان میدهد که چگونه میتوان آرگومانهای دستوری را که میتواند گزینههای [a] و [b], و گزینهٔ [c] را که نیازمند یک آرگومان است بپذیرد پردازش کرد:
while getopts abc: f do case $f in a | b) flag=$f;; c) carg=$OPTARG;; \?) echo $USAGE; exit 1;; esac done shift $((OPTIND - 1))
این کد هر یک از موارد زیر را به عنوان معادل خواهد پذیرفت:
cmd -acarg file file cmd -a -c arg file file cmd -carg -a file file cmd -a -carg -- file file
- hash [command ...]
- hash
-r - پوسته یک
جدول
درهمسازی
(hash table) را
نگهداری
میکند که
مکانهای
دستورات را
به خاطر
میسپارد.
بدون هیچ
آرگومانی،
دستور
hashمحتویات این جدول را چاپ میکند. مدخلهایی که از زمان آخرین دستورcdبررسی نشدهاند با یک ستاره علامتگذاری میشوند؛ این امکان وجود دارد که این مدخلها نامعتبر باشند.با داشتن آرگومان، دستور
hashدستورات مشخصشده را از جدول درهمسازی حذف میکند (مگر آنکه تابع باشند) و سپس آنها را مکانیابی مینماید. گزینهٔ-rموجب میشود دستور hash تمامی مدخلهای جدول درهمسازی را به جز توابع حذف کند. - jobs [
-lp] [job ...] - نمایش وضعیت تمامی، یا صرفاً کارهای مشخصشده، jobها:
- kill [
-ssigspec |-signum |-sigspec] [pid | job ...] - معادل
kill(1), اما
میتوان
مشخصهٔ یک
job را نیز
تعیین کرد.
سیگنالها
میتوانند
نامهای
غیرحساس به
حروف کوچک و
بزرگ بدون
پیشوندهای
SIGیا اعداد اعشاری باشند؛ پیشفرضTERMاست. - kill
-l[signum | exitstatus] - فهرست کردن
نام
سیگنالهای
موجود بدون
پیشوند
SIG(sigspecs). اگر signum مشخص شود، صرفاً sigspec مربوط به آن سیگنال را نمایش میدهد. اگر exitstatus مشخص شود (> 128), صرفاً sigspec را که باعث آن شده است نمایش میدهد. - pwd [
-LP] - دستور
توکار به
جای
محاسبهٔ
مجدد
دایرکتوری
جاری در هر
بار، آن را
به خاطر
میسپارد.
این ویژگی
آن را
سریعتر
میکند. با
این حال،
اگر نام
دایرکتوری
جاری تغییر
یابد،
نسخهٔ
توکار
pwdهمچنان نام قدیمی دایرکتوری را چاپ خواهد کرد. گزینهٔ-Pموجب میشود مقدار فیزیکی دایرکتوری کاری فعلی نشان داده شود، یعنی تمامی پیوندهای نمادین به مقادیر مربوطهٔ خود تفکیک شوند. گزینهٔ-Lاثر گزینههای قبلی-Pرا لغو میکند. - read [
-pprompt] [-r] variable [...] - در صورت
مشخص شدن
گزینهٔ
-pو اتصال ورودی استاندارد به یک ترمینال، عبارت اعلان (prompt) چاپ میشود. سپس یک خط از ورودی استاندارد خوانده میشود. نویسهٔ خط جدید انتهایی از خط حذف شده و خط همانگونه که در بخش تفکیک کلمات در بالا شرح داده شد تفکیک میشود، و بخشها به ترتیب به متغیرها اختصاص مییابند. دستکم یک متغیر باید مشخص شود. اگر تعداد بخشها بیشتر از متغیرها باشد، بخشهای باقیمانده (به همراه نویسههای موجود درIFSکه آنها را جدا کرده بودند) به آخرین متغیر اختصاص مییابند. اگر تعداد متغیرها بیشتر از بخشها باشد، به متغیرهای باقیمانده رشتهٔ تهی اختصاص مییابد. دستور توکارreadموفقیت را اعلام خواهد کرد مگر آنکه در ورودی با پایان فایل (EOF) مواجه شود، که در این صورت شکست برگردانده میشود.به طور پیشفرض، مگر در صورت مشخص شدن گزینهٔ
-r, اسلش وارو “\” به عنوان نویسهٔ گریز عمل کرده و باعث میشود با نویسهٔ بعدی به صورت تحتاللفظی رفتار شود. اگر پس از اسلش وارو یک خط جدید بیاید، اسلش وارو و خط جدید حذف خواهند شد. - readonly name ...
- readonly
-p - نامهای
مشخصشده
به عنوان
فقطخواندنی
علامتگذاری
میشوند،
به طوری که
پس از آن
نمیتوانند
تغییر
یافته یا
حذف شوند.
پوسته
امکان
میدهد
مقدار یک
متغیر
همزمان با
علامتگذاری
آن به عنوان
فقطخواندنی
با نوشتن
عبارت زیر
تنظیم شود:
readonly name=valueبدون هیچ آرگومانی، دستور readonly نام تمامی متغیرهای فقطخواندنی را فهرست میکند. با مشخص شدن گزینهٔ
-p, خروجی به گونهای قالببندی میشود که برای استفادهٔ غیرتعاملی مناسب باشد. - printf format [value]...
- دستور
printfآرگومانهای خود را مطابق با format قالببندی کرده و چاپ میکند، که یک رشتهٔ نویسهای حاوی سه نوع شیء است: نویسههای ساده، که به سادگی در خروجی استاندارد کپی میشوند، توالیهای گریز نویسهای که تبدیل شده و در خروجی استاندارد کپی میگردند، و مشخصات قالب، که هر یک موجب چاپ مقدار بعدی متوالی value میشود.با هر value به عنوان یک رشته رفتار میشود اگر مشخصهٔ قالب مربوطه یکی از
b,c, یاsباشد؛ در غیر این صورت به عنوان یک ثابت زبان C ارزیابی میشود، با افزونههای زیر:- علامت مثبت یا منفی ابتدایی مجاز است.
- اگر نویسهٔ آغازین یک نقلقول تکی یا جفتی باشد، مقدار بایت بعدی ارزیابی میشود.
رشتهٔ قالب به دفعات لازم تا مصرف تمامی valueها مجدداً استفاده میشود. هرگونه مشخصهٔ قالب اضافی با صفر یا رشتهٔ تهی ارزیابی میشود.
توالیهای گریز نویسهای در نمادگذاری اسلش وارو مطابق با تعریف در ANSI X3.159-1989 (“ANSI C89”) هستند. نویسهها و معانی آنها به شرح زیر است:
\a- چاپ یک نویسهٔ <زنگ (bell)>.
\b- چاپ یک نویسهٔ <پسبر (backspace)>.
\f- چاپ یک نویسهٔ <فرمفید (form-feed)>.
\n- چاپ یک نویسهٔ <خط جدید (new-line)>.
\r- چاپ یک نویسهٔ <بازگشت سطر (carriage return)>.
\t- چاپ یک نویسهٔ <تب (tab)>.
\v- چاپ یک نویسهٔ <تب عمودی (vertical tab)>.
\\- چاپ یک نویسهٔ اسلش وارو (بکاسلش).
\num- چاپ یک نویسهٔ ۸ بیتی که مقدار ASCII آن عدد اکتال ۱، ۲، یا ۳ رقمی num است.
هر مشخصهٔ قالب با نویسهٔ درصد (``%'') معرفی میشود. باقیماندهٔ مشخصهٔ قالب شامل موارد زیر است، به ترتیب:
- صفر یا چند مورد از فلگهای زیر:
-
#- یک نویسهٔ
`#' که مشخص
میکند
مقدار
باید در یک
``شکل
جایگزین''
چاپ شود.
برای
قالبهای
b,c,d, وs, این گزینه اثری ندارد. برای قالبoدقت عدد افزایش مییابد تا نخستین نویسهٔ رشتهٔ خروجی به صفر تبدیل شود. برای قالبx(X), یک نتیجهٔ غیرصفر رشتهٔ0x(0X) را در ابتدای خود خواهد داشت. برای قالبهایe,E,f,g, وG, نتیجه همواره شامل ممیز اعشاری خواهد بود، حتی اگر هیچ رقمی پس از ممیز نیاید (معمولاً ممیز اعشاری در نتایج این قالبها تنها زمانی ظاهر میشود که رقمی پس از ممیز باشد). برای قالبهایgوG, صفرهای انتهایی از نتیجه حذف نمیشوند بر خلاف حالتی که در غیر این صورت حذف میشدند. -- یک علامت منفی `-' که تراز به چپ خروجی را در فیلد مشخصشده تعیین میکند؛
+- یک نویسهٔ `+' که مشخص میکند همواره باید علامتی پیش از عدد هنگام استفاده از قالبهای علامتدار قرار گیرد.
- ‘ ’
- یک فاصله که مشخص میکند باید یک جای خالی پیش از یک عدد مثبت برای قالب علامتدار گذاشته شود. یک `+' در صورت استفاده از هر دو بر فاصله اولویت دارد؛
0- یک نویسهٔ صفر `0' که نشان میدهد باید از پر کردن با صفر به جای پر کردن با فاصله استفاده شود. یک `-' در صورت استفاده از هر دو بر `0' اولویت دارد؛
- عرض فیلد (Field Width):
- یک رشتهٔ رقمی اختیاری که عرض فیلد را مشخص میکند؛ اگر رشتهٔ خروجی نویسههای کمتری نسبت به عرض فیلد داشته باشد، برای جبران عرض فیلد از سمت چپ (یا راست، در صورتی که نشانگر تراز به چپ داده شده باشد) با فاصله پر میشود (توجه داشته باشید که صفر آغازین یک فلگ است، اما صفر تعبیهشده در میان، بخشی از عرض فیلد است)؛
- دقت (Precision):
- یک نقطهٔ
اختیاری،
‘
.’, دنبالشده توسط یک رشتهٔ رقمی اختیاری که دقت را ارائه میدهد که تعداد ارقامی را که باید پس از ممیز اعشاری ظاهر شوند، برای قالبهایeوf, یا حداکثر تعداد بایتهایی را که باید از یک رشته چاپ شوند (قالبهایbوs) مشخص میکند؛ اگر رشتهٔ رقمی وجود نداشته باشد، دقت به عنوان صفر تلقی میشود؛ - قالب (Format):
- نویسهای
که نوع
قالب مورد
استفاده
را نشان
میدهد
(یکی از
diouxXfwEgGbcs).
عرض فیلد یا دقت میتواند ‘
*’ به جای یک رشتهٔ رقمی باشد. در این حالت یک argument عرض فیلد یا دقت را تأمین میکند.نویسههای قالب و معانی آنها عبارتند از:
diouXx- عملوند argument به ترتیب به عنوان دهدهی علامتدار (d یا i)، اکتال بدون علامت، دهدهی بدون علامت، یا هگزادسیمال بدون علامت (X یا x) چاپ میشود.
f- عملوند
argument به
سبک
[-]ddd
.ddd چاپ میشود که در آن تعداد dها پس از ممیز اعشاری برابر با مشخصهٔ دقت برای آرگومان است. اگر دقت حذف شده باشد، ۶ رقم داده میشود؛ اگر دقت صراحتاً ۰ باشد، هیچ رقمی و هیچ ممیزی چاپ نمیشود. eE- عملوند
argument به
سبک
[-]d
.ddde±dd چاپ میشود که در آن یک رقم قبل از ممیز اعشاری است و تعداد پس از آن برابر با مشخصهٔ دقت برای آرگومان است؛ در صورت نبود دقت، ۶ رقم تولید میشود. یک E بزرگ برای قالب `E' استفاده میشود. gG- عملوند
argument به
سبک
fیا به سبکe(E) چاپ میشود، هر کدام که دقت کامل را در کمترین فضا ارائه دهد. b- نویسهها
از رشتهٔ
argument با
گسترش
توالیهای
گریز اسلش
وارو چاپ
میشوند.
توالیهای گریز اسلش واروی اضافی زیر پشتیبانی میشوند: c- نخستین نویسهٔ argument چاپ میشود.
s- نویسهها از رشتهٔ argument تا رسیدن به انتها یا تا رسیدن به تعداد بایتهای نشاندادهشده توسط مشخصهٔ دقت چاپ میشوند؛ در صورت حذف دقت، تمامی نویسهها در رشته چاپ میگردند.
%- چاپ یک `%'؛ هیچ آرگومانی استفاده نمیشود.
در هیچ حالتی عرض فیلد ناموجود یا کوچک موجب کوتاهسازی یک فیلد نمیشود؛ پر کردن فضا تنها در صورتی انجام میگیرد که عرض فیلد مشخصشده از عرض واقعی فراتر رود.
- set [{
-options|+options|-- }] arg ... - دستور
setسه عملکرد متفاوت انجام میدهد.بدون هیچ آرگومانی، مقادیر تمامی متغیرهای پوسته را فهرست میکند.
اگر گزینهها داده شوند، فلگهای گزینهٔ مشخصشده را تنظیم کرده یا آنها را همانگونه که در بخش پردازش لیست آرگومانها شرح داده شد پاک میکند. به عنوان یک حالت خاص، اگر گزینه -o یا +o باشد و هیچ آرگومانی ارائه نشود، پوسته تنظیمات تمامی گزینههای خود را چاپ میکند. اگر گزینه -o باشد، تنظیمات در قالبی خوانا برای انسان چاپ میشوند؛ اگر گزینه +o باشد، تنظیمات در قالبی چاپ میشوند که برای ورود مجدد به پوسته جهت اعمال همان تنظیمات گزینه مناسب باشد.
علاوه بر نامهای گزینههای فهرستشده در بخش پردازش لیست آرگومانها ، گزینههای زیر نیز میتوانند به عنوان آرگومان برای -o یا +o مشخص شوند:
- pipefail
- محاسبهٔ وضعیت خروج یک خطلوله بر اساس وضعیتهای خروج تمامی دستورات موجود در خطلوله، نه فقط آخرین دستور، همانگونه که در بخش خطلولهها توضیح داده شد.
سومین کاربرد دستور set تنظیم مقادیر پارامترهای موضعی پوسته روی آرگومانهای مشخصشده است. برای تغییر پارامترهای موضعی بدون تغییر در هیچ گزینهای، از “--” به عنوان نخستین آرگومان برای set استفاده کنید. اگر هیچ آرگومانی وجود نداشته باشد، دستور set تمامی پارامترهای موضعی را پاک خواهد کرد (معادل اجرای “shift $#”.)
- shift [n]
- انتقال
پارامترهای
موضعی به
تعداد n بار.
یک
shiftمقدار $1 را روی مقدار $2, مقدار $2 را روی مقدار $3, و به همین ترتیب تنظیم میکند، و مقدار $# را یک واحد کاهش میدهد. اگر n بزرگتر از تعداد پارامترهای موضعی باشد،shiftیک پیام خطا صادر کرده و با وضعیت بازگشت 2 خارج میشود. - test expression
- [ expression
] - ابزار
testعبارت expression را ارزیابی کرده و در صورتی که نتیجهٔ آن درست (true) باشد، وضعیت خروج صفر (true) برمیگرداند؛ در غیر این صورت مقدار 1 (false) برمیگرداند. اگر هیچ عبارتی وجود نداشته باشد، test نیز مقدار 1 (false) برمیگرداند.تمامی عملگرها و فلگها آرگومانهای جداگانهای برای ابزار
testهستند.گزارههای اولیه (primaries) زیر برای ساخت عبارت به کار میروند:
-bfile- درست اگر file وجود داشته باشد و یک فایل ویژهٔ بلوکی باشد.
-cfile- درست اگر file وجود داشته باشد و یک فایل ویژهٔ نویسهای باشد.
-dfile- درست اگر file وجود داشته باشد و یک دایرکتوری باشد.
-efile- درست اگر file وجود داشته باشد (صرفنظر از نوع آن).
-ffile- درست اگر file وجود داشته باشد و یک فایل معمولی باشد.
-gfile- درست اگر file وجود داشته باشد و فلگ شناسهٔ گروهی (setgid) آن فعال باشد.
-hfile- درست اگر file وجود داشته باشد و یک پیوند نمادین باشد.
-kfile- درست اگر file وجود داشته باشد و بیت چسبندهٔ (sticky bit) آن تنظیم شده باشد.
-nstring- درست اگر طول string غیرصفر باشد.
-pfile- درست اگر file یک لولهٔ نامگذاریشده (FIFO) باشد.
-rfile- درست اگر file وجود داشته باشد و خواندنی باشد.
-sfile- درست اگر file وجود داشته باشد و اندازهای بزرگتر از صفر داشته باشد.
-tfile_descriptor- درست اگر فایلی که شمارهٔ توصیفگر فایل آن file_descriptor است باز بوده و با یک ترمینال مرتبط باشد.
-ufile- درست اگر file وجود داشته باشد و فلگ شناسهٔ کاربری (setuid) آن فعال باشد.
-wfile- درست اگر file وجود داشته باشد و قابل نوشتن باشد. درست بودن تنها نشان میدهد که فلگ نوشتن فعال است. فایل در یک فایلسیستم فقطخواندنی قابل نوشتن نیست حتی اگر این آزمون مقدار درست را نشان دهد.
-xfile- درست اگر file وجود داشته باشد و قابل اجرا باشد. درست بودن تنها نشان میدهد که فلگ اجرا فعال است. اگر file یک دایرکتوری باشد، درست نشان میدهد که file میتواند جستجو شود.
-zstring- درست اگر طول string صفر باشد.
-Lfile- درست اگر
file وجود
داشته
باشد و یک
پیوند
نمادین
باشد. این
عملگر
برای
سازگاری
با
نسخههای
قبلی این
برنامه
حفظ شده
است. به
وجود آن
متکی
نباشید؛
به جای آن
از
-hاستفاده کنید. -Ofile- درست اگر file وجود داشته باشد و مالک آن با شناسهٔ کاربری مؤثر (effective UID) این فرایند مطابقت داشته باشد.
-Gfile- درست اگر file وجود داشته باشد و گروه آن با شناسهٔ گروهی مؤثر (effective GID) این فرایند مطابقت داشته باشد.
-Sfile- درست اگر file وجود داشته باشد و یک سوکت باشد.
- file1
-ntfile2 - درست اگر file1 و file2 وجود داشته باشند و file1 جدیدتر از file2 باشد، یا اگر file1 وجود داشته باشد اما file2 وجود نداشته باشد.
- file1
-otfile2 - درست اگر file1 و file2 وجود داشته باشند و file1 قدیمیتر از file2 باشد، یا اگر file2 وجود داشته باشد اما file1 وجود نداشته باشد.
- file1
-effile2 - درست اگر file1 و file2 وجود داشته باشند و به همان فایل یکسان ارجاع دهند.
- string
- درست اگر string رشتهٔ تهی نباشد.
- s1
=s2 - درست اگر رشتههای s1 و s2 یکسان باشند.
- s1
!=s2 - درست اگر رشتههای s1 و s2 یکسان نباشند.
- s1
<s2 - درست اگر رشتهٔ s1 بر اساس مقدار ASCII نویسههای آنها قبل از s2 بیاید.
- s1
>s2 - درست اگر رشتهٔ s1 بر اساس مقدار ASCII نویسههای آنها بعد از s2 بیاید.
- n1
-eqn2 - درست اگر اعداد صحیح n1 و n2 از نظر جبری برابر باشند.
- n1
-nen2 - درست اگر اعداد صحیح n1 و n2 از نظر جبری برابر نباشند.
- n1
-gtn2 - درست اگر عدد صحیح n1 از نظر جبری بزرگتر از عدد صحیح n2 باشد.
- n1
-gen2 - درست اگر عدد صحیح n1 از نظر جبری بزرگتر یا مساوی با عدد صحیح n2 باشد.
- n1
-ltn2 - درست اگر عدد صحیح n1 از نظر جبری کوچکتر از عدد صحیح n2 باشد.
- n1
-len2 - درست اگر عدد صحیح n1 از نظر جبری کوچکتر یا مساوی با عدد صحیح n2 باشد.
این گزارههای اولیه میتوانند با عملگرهای زیر ترکیب شوند:
!expression- درست اگر expression نادرست باشد.
- expression1
-aexpression2 - درست اگر هر دو expression1 و expression2 درست باشند.
- expression1
-oexpression2 - درست اگر یکی از expression1 یا expression2 درست باشد.
(expression)- درست اگر expression درست باشد.
عملگر
-aاولویت بالاتری نسبت به عملگر-oدارد. - times
- چاپ زمانهای کاربری و سیستمی انباشته برای پوسته و برای فرایندهای اجراشده از پوسته. وضعیت بازگشت 0 است.
- trap [action signal ...]
- باعث
میشود که
پوسته
هنگام
دریافت هر
یک از
سیگنالهای
مشخصشده،
دستور action را
تجزیه و
اجرا کند.
سیگنالها
با شمارهٔ
سیگنال یا
به عنوان
نام سیگنال
مشخص
میشوند.
اگر signal
برابر با
0یاEXITباشد، اقدام زمانی اجرا میشود که پوسته به طور عادی خارج شود (نه از طریق یک سیگنال مدیریتنشده مانند SIGINT). آرگومان action میتواند خالی باشد (''), که موجب نادیده گرفته شدن سیگنالهای مشخصشده میشود. با حذف action یا تنظیم آن روی `-' سیگنالهای مشخصشده روی اقدام پیشفرض خود تنظیم میشوند. هنگامی که پوسته یک زیرپوسته ایجاد میکند، سیگنالهای به دام افتاده (اما نه نادیده گرفته شده) را به اقدام پیشفرض بازنشانی مینماید. دستورtrapهیچ اثری بر سیگنالهایی که در هنگام ورود به پوسته نادیده گرفته شده بودند ندارد. دستورtrapبدون هیچ آرگومانی موجب میشود فهرستی از سیگنالها و اقدام مرتبط با آنها را در قالبی روی خروجی استاندارد بنویسد که به عنوان ورودی برای پوسته جهت دستیابی به همان نتایج به دام انداختن مناسب باشد.مثالها:
trapفهرست کردن سیگنالهای به دام افتاده و اقدام متناظر با آنها
trap '' INT QUIT tstp 30نادیده گرفتن سیگنالهای INT QUIT TSTP USR1
trap date INTچاپ تاریخ هنگام دریافت سیگنال INT
- type [name ...]
- تفسیر هر name به عنوان یک دستور و چاپ نتیجهٔ تفکیک جستجوی دستور. نتایج تفکیک ممکن عبارتند از: کلمهٔ کلیدی پوسته، نام مستعار، دستور توکار پوسته، دستور، نام مستعار ردیابیشده و یافتنشده. برای نامهای مستعار گسترش نام مستعار چاپ میشود؛ برای دستورات و نامهای مستعار ردیابیشده مسیر کامل دستور چاپ میگردد.
- ulimit [
-H|-S] [-a|-tfdscmlpnvwr[value]] - استعلام یا
تعیین
محدودیتهای
سخت (hard) یا نرم
(soft) روی
فرایندها
یا تنظیم
محدودیتهای
جدید.
انتخاب بین
محدودیت
سخت (که هیچ
فرایندی
مجاز به نقض
آن نیست و
پس از کاهش
نمیتواند
افزایش
یابد) و
محدودیت
نرم (که
باعث
میشود
فرایندها
سیگنال
دریافت
کنند اما
لزوماً
کشته
نشوند، و
ممکن است
افزایش
یابد) با
این فلگها
انجام
میشود:
-H- تنظیم یا استعلام دربارهٔ محدودیتهای سخت
-S- تنظیم یا
استعلام
دربارهٔ
محدودیتهای
نرم. اگر نه
-Hو نه-Sمشخص نشود، محدودیت نرم نمایش داده میشود یا هر دو محدودیت تنظیم میگردند. اگر هر دو مشخص شوند، مورد آخر اعمال میشود.
محدودیتی که باید استعلام یا تنظیم شود با مشخص کردن هر یک از این فلگها انتخاب میشود:
-a- نمایش تمامی محدودیتهای فعلی
-t- نمایش یا تنظیم محدودیت زمان CPU (بر حسب ثانیه)
-f- نمایش یا تنظیم محدودیت بزرگترین فایلی که میتواند ایجاد شود (در بلوکهای ۵۱۲ بایتی)
-d- نمایش یا تنظیم محدودیت اندازهٔ سگمنت دادهٔ یک فرایند (بر حسب کیلوبایت)
-s- نمایش یا تنظیم محدودیت اندازهٔ پشتهٔ یک فرایند (بر حسب کیلوبایت)
-c- نمایش یا تنظیم محدودیت بزرگترین اندازهٔ core dump که میتواند تولید شود (در بلوکهای ۵۱۲ بایتی)
-m- نمایش یا تنظیم محدودیت کل حافظهٔ فیزیکی که میتواند توسط یک فرایند استفاده شود (بر حسب کیلوبایت)
-l- نمایش یا تنظیم محدودیت مقداری از حافظه که یک فرایند میتواند با mlock(2) قفل کند (بر حسب کیلوبایت)
-p- نمایش یا تنظیم محدودیت تعداد فرایندهایی که این کاربر میتواند همزمان داشته باشد
-n- نمایش یا تنظیم محدودیت تعداد فایلهایی که یک فرایند میتواند همزمان باز داشته باشد
-v- نمایش یا تنظیم محدودیت کل حافظهٔ مجازی که میتواند توسط یک فرایند استفاده شود (بر حسب کیلوبایت)
-w- نمایش یا تنظیم محدودیت تعداد کل قفلهای نگهداشتهشده توسط یک فرایند
-r- نمایش یا تنظیم محدودیت اولویت زمانبندی بیدرنگ (real-time) یک فرایند
اگر هیچیک از اینها مشخص نشود، محدودیت اندازهٔ فایل است که نمایش داده شده یا تنظیم میشود. اگر value مشخص شود، محدودیت روی آن عدد تنظیم میگردد؛ در غیر این صورت محدودیت فعلی نمایش داده میشود. مقدار ویژهٔ value
unlimitedنشاندهندهٔ عدم وجود هرگونه محدودیت است.محدودیتهای یک فرایند دلخواه را میتوان با استفاده از ابزار sysctl(8) نمایش داد یا تنظیم کرد.
- umask [mask]
- تنظیم مقدار umask (ببینید umask(2)) روی مقدار اکتال مشخصشده. در صورت حذف آرگومان، مقدار umask چاپ میشود.
- unalias [
-a] [name] - اگر name
مشخص شود،
پوسته آن
نام مستعار
را حذف
میکند. اگر
-aمشخص شود، تمامی نامهای مستعار حذف میشوند. - unset [
-fv] name ... - متغیرها و
توابع
مشخصشده
حذف مقدار
شده و لغو
صدور (unexport)
میشوند.
اگر
-fیا-vمشخص شود، تابع یا متغیر مربوطه به ترتیب حذف مقدار میگردد. اگر یک نام معین با هر دو متغیر و تابع مطابقت داشته باشد و هیچ گزینهای داده نشده باشد، تنها متغیر حذف مقدار میشود. - wait [job]
- انتظار برای تکمیل کار مشخصشده و بازگرداندن وضعیت خروج آخرین فرایند در کار. اگر آرگومان حذف شود، انتظار برای تکمیل تمامی کارها و بازگرداندن وضعیت خروج صفر.
ویرایش خط فرمان (Command Line Editing)
هنگامی که
dash به
صورت
تعاملی از
یک ترمینال
استفاده
میشود،
دستور فعلی
و تاریخچهٔ
دستورات
(ببینید fc
در بخش
دستورات
توکار)
میتوانند
با استفاده
از ویرایش
خط فرمان در
حالت vi
ویرایش
شوند. این
حالت از
دستوراتی
استفاده
میکند که
در زیر
توضیح داده
شده و مشابه
زیرمجموعهای
از دستورات
ارائهشده
در صفحهٔ
راهنمای vi
هستند.
دستور ‘set -o
vi’ ویرایش
در حالت vi را
فعال کرده و
sh را در حالت
درج (insert mode)
پوستهٔ vi
قرار
میدهد. با
فعال بودن
حالت vi،
میتوان sh را
بین حالت
درج و حالت
دستور (command mode)
جابهجا
کرد. این
حالت مشابه vi
است: تایپ
کردن کلید
⟨ESC⟩ وارد
حالت دستور vi
میشود.
فشردن کلید
⟨return⟩ در حالت
دستور، خط
را به پوسته
ارسال
خواهد کرد.
وضعیت خروج (EXIT STATUS)
خطاهایی که توسط پوسته شناسایی میشوند، مانند خطای نحوی، باعث میشوند پوسته با وضعیت خروج غیرصفر خارج شود. اگر پوسته یک پوستهٔ تعاملی نباشد، اجرای فایل پوسته متوقف خواهد شد. در غیر این صورت، پوسته وضعیت خروج آخرین دستور اجراشده را برمیگرداند، یا اگر دستور توکار exit با یک آرگومان عددی استفاده شود، آن آرگومان را برمیگرداند.
محیط (ENVIRONMENT)
HOME- به طور خودکار توسط login(1) از دایرکتوری ورود کاربر در فایل گذرواژه (passwd(5)) تنظیم میشود. این متغیر محیطی همچنین به عنوان آرگومان پیشفرض برای دستور توکار cd عمل میکند.
PATH- مسیر جستجوی پیشفرض برای فایلهای اجرایی. بخش جستجوی مسیر در بالا را ببینید.
CDPATH- مسیر جستجوی مورد استفاده با دستور توکار cd.
MAIL- نام فایل
نامهای که
برای بررسی
ورود
نامههای
جدید بررسی
خواهد شد.
توسط
MAILPATHنادیده گرفته میشود. MAILCHECK- بسامد
زمانی بر
حسب ثانیه
که پوسته
ورود نامه
را در
فایلهای
مشخصشده
توسط
MAILPATHیا فایلMAILبررسی میکند. اگر روی 0 تنظیم شود، بررسی در هر اعلان دستور رخ خواهد داد. MAILPATH- فهرستی از
نامهای
فایل که با
دونقطه “:”
از هم جدا
شدهاند،
تا پوسته
نامههای
دریافتی را
در آنها
بررسی کند.
این تنظیم
محیطی بر
تنظیم
MAILاولویت دارد. حداکثر ۱۰ صندوق پستی میتوانند همزمان نظارت شوند. PS1- رشتهٔ اعلان اصلی، که پیشفرض آن “$ ”, است، مگر آنکه کاربر ارشد (superuser) باشید، که در این حالت پیشفرض آن “# ” خواهد بود.
PS2- رشتهٔ اعلان ثانویه، که پیشفرض آن “> ” است.
PS4- خروجی پیش از هر خط هنگامی که ردیابی اجرا (set -x) فعال است، که پیشفرض آن “+ ” میباشد.
IFS- جداکنندههای فیلد ورودی (Input Field Separators). این متغیر معمولاً روی ⟨space⟩, ⟨tab⟩, و ⟨newline⟩ تنظیم میشود. برای جزئیات بیشتر به بخش تفکیک بر اساس فاصلهها مراجعه کنید.
TERM- تنظیم پیشفرض ترمینال برای پوسته. این متغیر توسط فرزندان پوسته به ارث برده میشود و در حالتهای ویرایش تاریخچه به کار میرود.
HISTSIZE- تعداد خطوط در بافر تاریخچه برای پوسته.
PWD- مقدار
منطقی
دایرکتوری
کاری فعلی.
این مقدار
توسط دستور
cdتنظیم میشود. OLDPWD- مقدار
منطقی
پیشین
دایرکتوری
کاری فعلی.
این مقدار
توسط دستور
cdتنظیم میشود. PPID- شناسهٔ فرایند (PID) فرایند والد پوسته.
فایلها (FILES)
- $HOME/.profile
- /etc/profile
همچنین ببینید (SEE ALSO)
csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)
تاریخچه (HISTORY)
dash یک
پیادهسازی
سازگار با POSIX
از /bin/sh است که
هدف آن این
است که تا حد
امکان کوچک
و کمحجم
باشد. dash
نوادهٔ
مستقیم
نسخهٔ NetBSD از ash
(پوستهٔ Almquist SHell)
است، که در
اوایل ۱۹۹۷
به لینوکس
پورت شد. نام
آن در سال
۲۰۰۲ به
dash تغییر
یافت.
باگها (BUGS)
از اسکریپتهای پوستهای دارای بیت Setuid باید تحت هر شرایطی اجتناب شود، زیرا خطر امنیتی چشمگیری به شمار میروند.
| January 19, 2003 | Linux 6.12.107+deb13-amd64 |