DASH(1) General Commands Manual DASH(1)

dash — مفسر دستورات (پوسته)

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 ...]

dash مفسر استاندارد دستورات برای سیستم است. نسخهٔ کنونی dash در حال توسعه برای تطابق با مشخصات POSIX 1003.2 و 1003.2a برای پوسته‌ها است. این نسخه ویژگی‌های متعددی دارد که از برخی جهات آن را شبیه به پوستهٔ Korn می‌کند، اما یک شبیه‌ساز پوستهٔ Korn نیست (ببینید ksh(1)). تنها ویژگی‌های تعیین‌شده توسط POSIX, به همراه چند افزونهٔ برکلی، در این پوسته گنجانده شده‌اند. این صفحهٔ راهنما قرار نیست یک راهنمای آموزشی یا مشخصات کامل این پوسته باشد.

پوسته دستوری است که خطوط را از یک فایل یا ترمینال می‌خواند، آن‌ها را تفسیر می‌کند، و معمولاً دستورات دیگر را اجرا می‌کند. این همان برنامه‌ای است که هنگام ورود کاربر به سیستم در حال اجرا است (اگرچه کاربر می‌تواند با استفاده از دستور chsh(1) پوستهٔ دیگری را انتخاب کند). پوسته زبانی را پیاده‌سازی می‌کند که شامل ساختارهای کنترل جریان، امکانات ماکرو که قابلیت‌های متنوعی را افزون بر ذخیره‌سازی داده‌ها فراهم می‌کند، و همچنین قابلیت‌های توکار تاریخچه و ویرایش خط است. این پوسته ویژگی‌های فراوانی را برای تسهیل استفادهٔ تعاملی در خود جای داده و این مزیت را دارد که زبان تفسیری آن میان هر دو حالت تعاملی و غیرتعاملی (اسکریپت‌های پوسته) مشترک است. بدین معنا که دستورات می‌توانند مستقیماً در پوستهٔ در حال اجرا تایپ شوند یا درون یک فایل قرار گرفته و فایل مستقیماً توسط پوسته اجرا شود.

اگر هیچ آرگومانی داده نشده باشد و ورودی استاندارد پوسته به یک ترمینال متصل باشد (یا اگر فلگ -i تنظیم شده باشد)، و گزینهٔ -c داده نشده باشد، پوسته یک پوستهٔ تعاملی (interactive) در نظر گرفته می‌شود. یک پوستهٔ تعاملی معمولاً پیش از هر دستور اعلان (prompt) نمایش می‌دهد و خطاهای برنامه‌نویسی و دستورات را به شیوه‌ای متفاوت مدیریت می‌کند (همان‌گونه که در زیر توضیح داده شده است). هنگام آغاز به کار، پوسته آرگومان ۰ را بررسی می‌کند، و اگر با خط تیره ‘-’ آغاز شود، پوسته به عنوان یک پوستهٔ ورود (login shell) نیز در نظر گرفته می‌شود. این کار معمولاً هنگام اولین ورود کاربر توسط سیستم به طور خودکار انجام می‌شود. یک پوستهٔ ورود، نخست دستورات را از فایل‌های /etc/profile و .profile در صورت وجود می‌خواند. اگر متغیر محیطی ENV هنگام ورود به یک پوستهٔ تعاملی تنظیم شده باشد، یا در .profile یک پوستهٔ ورود تنظیم شده باشد، پوسته در مرحلهٔ بعد دستورات را از فایل تعیین‌شده در ENV می‌خواند. بنابراین، کاربر باید دستوراتی را که تنها هنگام ورود به سیستم باید اجرا شوند در فایل .profile قرار دهد، و دستوراتی را که برای هر پوستهٔ تعاملی اجرا می‌شوند در فایل تعیین‌شده توسط ENV بگذارد. برای تنظیم متغیر ENV روی یک فایل مشخص، خط زیر را در فایل .profile در دایرکتوری خانگی خود قرار دهید:

ENV=$HOME/.shinit; export ENV

و به جای “.shinit” هر نام فایلی را که می‌خواهید جایگزین کنید.

اگر آرگومان‌های خط فرمان علاوه بر گزینه‌ها مشخص شده باشند، پوسته نخستین آرگومان را به عنوان نام فایلی که باید دستورات از آن خوانده شوند (اسکریپت پوسته) تلقی می‌کند، و آرگومان‌های باقی‌مانده به عنوان پارامترهای موضعی پوسته ($1، $2، و غیره) تنظیم می‌شوند. در غیر این صورت، پوسته دستورات را از ورودی استاندارد خود می‌خواند.

تمامی گزینه‌های تک‌حرفی که نام متناظری دارند می‌توانند به عنوان آرگومان برای گزینهٔ -o استفاده شوند. نام متناظر برای -o در توضیحات زیر در کنار گزینهٔ تک‌حرفی ارائه شده است. مشخص کردن یک خط تیره “-” گزینه را فعال می‌کند، در حالی که استفاده از یک علامت مثبت “+” گزینه را غیرفعال می‌سازد. گزینه‌های زیر می‌توانند از طریق خط فرمان یا با دستور توکار set (که بعداً شرح داده شده است) تنظیم شوند.

صدور (export) تمامی متغیرهایی که مقداری به آن‌ها تخصیص می‌یابد.
خواندن دستورات از عملوند command_string به جای ورودی استاندارد. پارامتر ویژهٔ 0 از عملوند command_name تنظیم شده و پارامترهای موضعی ($1، $2، و غیره) از سایر عملوندهای آرگومان تنظیم می‌شوند.
عدم بازنویسی فایل‌های موجود با استفاده از “>”.
در صورت غیرتعاملی بودن پوسته، خروج فوری چنانچه هر دستور آزموده‌نشده‌ای شکست بخورد. وضعیت خروج یک دستور در صورتی به صراحت آزموده شده تلقی می‌شود که برای کنترل یک if, elif, while, یا until استفاده شود؛ یا اگر دستور در سمت چپ عملگر “&&” یا “||” قرار گیرد.
غیرفعال‌سازی گسترش نام مسیر (pathname expansion).
در صورت غیرتعاملی بودن، خواندن دستورات بدون اجرای آن‌ها. این گزینه برای بررسی صحت ساختار نحوی (syntax) اسکریپت‌های پوسته مفید است.
نوشتن پیام در خطای استاندارد هنگام تلاش برای گسترش متغیری که مقداردهی نشده است، و خروج فوری در صورتی که پوسته غیرتعاملی باشد.
پوسته هم‌زمان با خواندن ورودی خود، آن را در خطای استاندارد می‌نویسد. برای اشکال‌زدایی مفید است.
نوشتن هر دستور در خطای استاندارد (با پیشوند ‘+ ’) پیش از اجرای آن. برای اشکال‌زدایی مفید است.
نادیده گرفتن پایان فایل (EOF) در ورودی هنگام کار در حالت تعاملی.
اجبار پوسته به رفتار تعاملی.
ایجاد رفتار مشابه فراخوانی به عنوان یک پوستهٔ ورود (login shell) در dash.
فعال کردن کنترل کارها (job control) (به طور خودکار در حالت تعاملی تنظیم می‌شود).
خواندن دستورات از ورودی استاندارد (در صورت نبود آرگومان‌های فایل به طور خودکار تنظیم می‌شود). این گزینه پس از شروع به کار پوسته (مثلاً با set) هیچ اثری ندارد.
فعال‌سازی ویرایشگر خط فرمان توکار vi(1) (در صورت تنظیم بودن -E, آن را غیرفعال می‌کند).
فعال‌سازی ویرایشگر خط فرمان توکار emacs(1) (در صورت تنظیم بودن -V, آن را غیرفعال می‌کند).
فعال‌سازی اعلان ناهمگام پایان کارهای پس‌زمینه. (پیاده‌سازی‌نشده برای 4.4alpha)

پوسته ورودی را به صورت خطوطی از یک فایل می‌خواند و آن را در فاصله‌های خالی (فاصله‌ها و تب‌ها) و در توالی‌های معینی از نویسه‌ها که برای پوسته خاص هستند و “عملگرها” نامیده می‌شوند، به کلمات تجزیه می‌کند. دو نوع عملگر وجود دارد: عملگرهای کنترلی و عملگرهای تغییر مسیر (معنای آن‌ها بعداً شرح داده می‌شود). در ادامه فهرستی از عملگرها آورده شده است:

عملگرهای کنترلی:
& && ( ) ; ;; | || <newline>
عملگرهای تغییر مسیر:
< > >| << >> <& >& <<- <>

نقل‌قول برای حذف معنای ویژهٔ برخی نویسه‌ها یا کلمات برای پوسته، مانند عملگرها، فاصله‌های خالی یا کلمات کلیدی به کار می‌رود. سه نوع نقل‌قول وجود دارد: نقل‌قول تکی جفت‌شده، نقل‌قول جفتی جفت‌شده، و اسلش وارو (بک‌اسلش).

اسلش وارو معنای تحت‌اللفظی نویسهٔ بعدی را حفظ می‌کند، به استثنای ⟨newline⟩. یک اسلش وارو که قبل از یک ⟨newline⟩ قرار گیرد، به عنوان ادامهٔ خط در نظر گرفته می‌شود.

قرار دادن نویسه‌ها در نقل‌قول تکی، معنای تحت‌اللفظی تمامی نویسه‌ها را حفظ می‌کند (به جز خود نقل‌قول‌های تکی، که قرار دادن نقل‌قول تکی درون یک رشتهٔ محصور در نقل‌قول تکی را غیرممکن می‌سازد).

قرار دادن نویسه‌ها درون نقل‌قول جفتی، معنای تحت‌اللفظی تمامی نویسه‌ها را حفظ می‌کند، به جز علامت دلار ($), علامت بک‌تیک (`), و اسلش وارو (\). اسلش وارو درون نقل‌قول جفتی از نظر تاریخی رفتاری نامعمول دارد و تنها برای نقل‌قول کردن نویسه‌های زیر به کار می‌رود:

$ ` " \ <newline>
. در غیر این صورت، معنای تحت‌اللفظی خود را حفظ می‌کند.

کلمات رزروشده کلماتی هستند که معنای ویژه‌ای برای پوسته دارند و در ابتدای یک خط و پس از یک عملگر کنترلی شناخته می‌شوند. کلمات زیر رزروشده هستند:

! elif fi while case
else for then { }
do done until if esac

معنای آن‌ها بعداً بررسی می‌شود.

نام مستعار یک نام و مقدار متناظر با آن است که با استفاده از دستور توکار alias(1) تنظیم می‌شود. هر جا که ممکن است یک کلمهٔ رزروشده ظاهر شود (به بالا مراجعه کنید)، و پس از بررسی کلمات رزروشده، پوسته کلمه را بررسی می‌کند تا ببیند آیا با یک نام مستعار مطابقت دارد یا خیر. اگر مطابقت داشته باشد، آن را در جریان ورودی با مقدار مربوطه جایگزین می‌کند. برای مثال، اگر نام مستعاری به نام “lf” با مقدار “ls -F” وجود داشته باشد، ورودی:

lf foobar ⟨return⟩

به شکل زیر تبدیل خواهد شد:

ls -F foobar ⟨return⟩

نام‌های مستعار راهی مناسب برای کاربران تازه‌کار فراهم می‌کنند تا میان‌برهایی برای دستورات ایجاد کنند بدون آن‌که نیازی به یادگیری ساخت توابع با آرگومان داشته باشند. همچنین می‌توان از آن‌ها برای ایجاد کدهای نامفهوم از نظر لغوی استفاده کرد. استفاده به این شکل توصیه نمی‌شود.

پوسته کلماتی را که می‌خواند مطابق با یک زبان تفسیر می‌کند که مشخصات آن خارج از حیطهٔ این صفحهٔ راهنما است (به BNF در سند POSIX 1003.2 مراجعه کنید). با این حال، اساساً یک خط خوانده می‌شود و اگر نخستین کلمهٔ خط (یا پس از یک عملگر کنترلی) یک کلمهٔ رزروشده نباشد، پوسته یک دستور ساده را شناسایی کرده است. در غیر این صورت، یک دستور پیچیده یا ساختار ویژهٔ دیگری ممکن است شناسایی شده باشد.

اگر یک دستور ساده شناسایی شده باشد، پوسته اقدامات زیر را انجام می‌دهد:

  1. کلمات ابتدایی به شکل “name=value” جدا شده و به محیط دستور ساده اختصاص داده می‌شوند. عملگرهای تغییر مسیر و آرگومان‌های آن‌ها (همان‌گونه که در زیر شرح داده شده) جدا شده و برای پردازش ذخیره می‌شوند.
  2. کلمات باقی‌مانده همان‌گونه که در بخش “گسترش‌ها (Expansions)” توضیح داده شده است گسترش می‌یابند، و نخستین کلمهٔ باقی‌مانده به عنوان نام دستور در نظر گرفته شده و دستور مکان‌یابی می‌شود. کلمات باقی‌مانده به عنوان آرگومان‌های دستور تلقی می‌شوند. اگر نام دستوری حاصل نشود، انتساب متغیرهای “name=value” که در بند ۱ شناسایی شده بودند پوستهٔ فعلی را تحت تأثیر قرار می‌دهند.
  3. تغییر مسیرها همان‌گونه که در بخش بعدی شرح داده شده است انجام می‌شوند.

تغییر مسیرها برای تغییر مکانی که یک دستور ورودی خود را از آن می‌خواند یا خروجی‌اش را به آن می‌فرستد به کار می‌روند. به طور کلی، تغییر مسیرها یک ارجاع موجود به یک فایل را باز می‌کنند، می‌بندند، یا تکثیر می‌نمایند. قالب کلی استفاده‌شده برای تغییر مسیر عبارت است از:

[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” نامیده می‌شود:

تمامی متن در خطوط متوالی تا رسیدن به جداکننده (delimiter) ذخیره شده و در ورودی استاندارد یا توصیف‌گر فایل n (در صورت تعیین) در اختیار دستور قرار می‌گیرد. اگر جداکننده در خط اولیه نقل‌قول شده باشد، متن here-doc به صورت تحت‌اللفظی پردازش می‌شود؛ در غیر این صورت متن مشمول گسترش پارامتر، جایگزینی دستور، و گسترش محاسباتی می‌شود (همان‌گونه که در بخش “گسترش‌ها” شرح داده شده است). اگر عملگر به جای “<<” به صورت “<<-” باشد، تب‌های ابتدای خطوط در متن here-doc حذف می‌شوند.

سه نوع دستور وجود دارد: توابع پوسته، دستورات توکار، و برنامه‌های عادی – و دستور (بر اساس نام) به همین ترتیب جستجو می‌شود. هر یک از آن‌ها به روش متفاوتی اجرا می‌شوند.

هنگامی که یک تابع پوسته اجرا می‌شود، تمامی پارامترهای موضعی پوسته (به جز $0 که بدون تغییر باقی می‌ماند) روی آرگومان‌های تابع پوسته تنظیم می‌شوند. متغیرهایی که صریحاً در محیط دستور قرار می‌گیرند (با قرار دادن انتساب به آن‌ها قبل از نام تابع) برای تابع محلی شده و روی مقادیر ارائه‌شده تنظیم می‌گردند. سپس دستور ارائه‌شده در تعریف تابع اجرا می‌شود. پارامترهای موضعی پس از تکمیل دستور به مقادیر اولیهٔ خود بازگردانده می‌شوند. تمامی این مراحل درون پوستهٔ فعلی رخ می‌دهد.

دستورات توکار پوسته در درون پوسته اجرا می‌شوند، بدون آن‌که فرایند جدیدی ایجاد شود.

در غیر این صورت، اگر نام دستور با یک تابع یا دستور توکار مطابقت نداشته باشد، دستور به عنوان یک برنامهٔ عادی در فایل‌سیستم جستجو می‌شود (همان‌گونه که در بخش بعدی شرح داده شده است). هنگامی که یک برنامهٔ عادی اجرا می‌شود، پوسته برنامه را اجرا کرده و آرگومان‌ها و متغیرهای محیطی را به برنامه منتقل می‌کند. اگر برنامه یک فایل اجرایی عادی نباشد (یعنی اگر با "عدد جادویی" که نمایش ASCII آن "#!" است آغاز نشود، به طوری که execve(2) خطای ENOEXEC را برگرداند) در این صورت پوسته برنامه را در یک زیرپوسته (subshell) تفسیر خواهد کرد. پوستهٔ فرزند در این حالت خود را مجدداً راه‌اندازی می‌کند، به طوری که اثر آن مشابه حالتی خواهد بود که یک پوستهٔ جدید برای مدیریت اسکریپت موردی پوسته فراخوانی شده باشد، به جز این‌که مکان دستورات هش‌شده در پوستهٔ والد توسط فرزند به خاطر سپرده می‌شود.

توجه داشته باشید که نسخه‌های پیشین این سند و خود کد منبع گاهی به اشتباه و پراکنده به یک اسکریپت پوستهٔ فاقد عدد جادویی با عنوان "روال پوسته (shell procedure)" اشاره کرده‌اند.

هنگام مکان‌یابی یک دستور، پوسته ابتدا بررسی می‌کند که آیا تابع پوسته‌ای با آن نام وجود دارد یا خیر. سپس به دنبال یک دستور توکار با آن نام می‌گردد. اگر دستور توکار پیدا نشد، یکی از دو حالت رخ می‌دهد:

  1. نام‌های دستوری که شامل اسلش هستند، به سادگی و بدون انجام هیچ‌گونه جستجویی اجرا می‌شوند.
  2. پوسته به نوبت هر یک از مدخل‌های موجود در PATH را برای یافتن دستور جستجو می‌کند. مقدار متغیر PATH باید مجموعه‌ای از مدخل‌ها باشد که با دو‌نقطه (colon) از یکدیگر جدا شده‌اند. هر مدخل شامل نام یک دایرکتوری است. دایرکتوری جاری می‌تواند به صورت ضمنی با یک نام دایرکتوری خالی، یا به صورت صریح با یک نقطهٔ تنها مشخص شود.

هر دستور یک وضعیت خروج دارد که می‌تواند رفتار سایر دستورات پوسته را تحت تأثیر قرار دهد. الگو به این صورت است که دستور برای حالت عادی یا موفقیت با صفر خارج می‌شود، و برای شکست، خطا، یا یک وضعیت نادرست با غیرصفر خارج می‌گردد. صفحهٔ راهنمای هر دستور باید کدهای خروج مختلف و معنای آن‌ها را نشان دهد. علاوه بر این، دستورات توکار نیز کدهای خروج برمی‌گردانند، همان‌گونه که یک تابع اجراشدهٔ پوسته این کار را انجام می‌دهد.

اگر یک دستور کاملاً از انتساب متغیرها تشکیل شده باشد، وضعیت خروج دستور وضعیت خروج آخرین جایگزینی دستور در صورت وجود خواهد بود، و در غیر این صورت 0 است.

دستورات پیچیده ترکیبی از دستورات ساده به همراه عملگرهای کنترلی یا کلمات رزروشده هستند که با هم یک دستور پیچیدهٔ بزرگ‌تر را می‌سازند. به طور کلی‌تر، یک دستور یکی از موارد زیر است:

  • دستور ساده
  • خط‌لوله (pipeline)
  • لیست یا لیست مرکب
  • دستور مرکب
  • تعریف تابع

مگر آن‌که خلاف آن قید شده باشد، وضعیت خروج یک دستور وضعیت خروج آخرین دستور ساده‌ای است که توسط آن دستور اجرا شده است.

خط‌لوله توالی از یک یا چند دستور است که با عملگر کنترلی | از یکدیگر جدا شده‌اند. خروجی استاندارد تمامی دستورات به جز دستور آخر، به ورودی استاندارد دستور بعدی متصل می‌شود. خروجی استاندارد آخرین دستور طبق معمول از پوسته به ارث برده می‌شود.

قالب یک خط‌لوله عبارت است از:

[!] command1 [| command2 ...]

خروجی استاندارد command1 به ورودی استاندارد command2 متصل می‌شود. ورودی استاندارد، خروجی استاندارد، یا هر دو برای یک دستور، پیش از اعمال هرگونه تغییر مسیر مشخص‌شده توسط عملگرهای تغییر مسیری که بخشی از دستور هستند، توسط خط‌لوله تخصیص‌یافته تلقی می‌شوند.

اگر خط‌لوله در پس‌زمینه نباشد (که بعداً شرح داده شده)، پوسته منتظر تکمیل تمامی دستورات می‌ماند.

اگر گزینهٔ pipefail هنگام آغاز اجرای خط‌لوله توسط پوسته فعال بوده باشد، وضعیت خروج خط‌لوله وضعیت خروج آخرین دستور در خط‌لوله است که با وضعیت غیرصفر خارج شده است، یا در صورتی که تمامی دستورات خط‌لوله با وضعیت صفر خارج شده باشند، صفر خواهد بود. اگر گزینهٔ pipefail فعال نبوده باشد، وضعیت خروج خط‌لوله برابر با وضعیت خروج آخرین دستور مشخص‌شده در خط‌لوله است؛ وضعیت خروج سایر دستورات استفاده نمی‌شود. اگر کلمهٔ رزروشدهٔ ! پیش از خط‌لوله بیاید، وضعیت خروج آن NOT منطقی وضعیت خروج شرح‌داده‌شده در بالا است.

از آن‌جا که تخصیص ورودی استاندارد یا خروجی استاندارد یا هر دو در خط‌لوله پیش از تغییر مسیر انجام می‌گیرد، می‌تواند با تغییر مسیر اصلاح شود. برای نمونه:

$ command1 2>&1 | command2

هم خروجی استاندارد و هم خطای استاندارد command1 را به ورودی استاندارد command2 ارسال می‌کند.

یک پایان‌دهندهٔ ; یا ⟨newline⟩ باعث می‌شود که لیست AND-OR قبلی (که در ادامه توضیح داده شده) به طور متوالی اجرا شود؛ یک & باعث اجرای ناهمگام لیست AND-OR قبلی می‌گردد.

توجه داشته باشید که بر خلاف برخی پوسته‌های دیگر، هر فرایند در خط‌لوله فرزندی از پوستهٔ فراخواننده است (مگر آن‌که یک دستور توکار پوسته باشد، که در این صورت در پوستهٔ جاری اجرا می‌شود – اما هر اثری که بر محیط داشته باشد پاک خواهد شد).

اگر دستوری با عملگر کنترلی امپرسند (&) خاتمه یابد، پوسته دستور را به صورت ناهمگام اجرا می‌کند – بدین معنا که پوسته پیش از اجرای دستور بعدی منتظر پایان کار آن دستور نمی‌ماند.

قالب اجرای دستور در پس‌زمینه عبارت است از:

command1 & [command2 & ...]

اگر پوسته غیرتعاملی باشد، ورودی استاندارد یک دستور ناهمگام بر روی /dev/null تنظیم می‌شود.

لیست توالی از صفر یا چند دستور است که با خطوط جدید، نقطه‌ویرگول (semicolon)، یا امپرسند از یکدیگر جدا شده‌اند، و به صورت اختیاری با یکی از این سه نویسه خاتمه می‌یابند. دستورات در یک لیست به همان ترتیبی که نوشته شده‌اند اجرا می‌شوند. اگر دستوری با امپرسند دنبال شود، پوسته دستور را آغاز کرده و فوراً به سراغ دستور بعدی می‌رود؛ در غیر این صورت منتظر پایان یافتن دستور پیش از رفتن به سراغ دستور بعدی می‌ماند.

“&&” و “||” عملگرهای لیست AND-OR هستند. “&&” دستور اول را اجرا می‌کند، و سپس دستور دوم را اگر و تنها اگر وضعیت خروج دستور اول صفر باشد اجرا می‌نماید. “||” مشابه است، اما دستور دوم را اگر و تنها اگر وضعیت خروج دستور اول غیرصفر باشد اجرا می‌کند. “&&” و “||” هر دو اولویت یکسانی دارند.

نحو دستور 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

الگو می‌تواند در واقع یک یا چند الگو باشد (به الگوهای پوسته که بعداً شرح داده شده مراجعه کنید)، که با نویسه‌های “|” از یکدیگر جدا شده‌اند. نویسهٔ “(” قبل از الگو اختیاری است.

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

(list)

یا

{ list; }

حالت نخست، دستورات را درون یک زیرپوسته (subshell) اجرا می‌کند. دستورات توکار گروه‌بندی‌شده در یک (list) پوستهٔ فعلی را تحت تأثیر قرار نخواهند داد. شکل دوم پوستهٔ دیگری ایجاد نمی‌کند، بنابراین کمی کارآمدتر است. گروه‌بندی دستورات با این شیوه به شما امکان می‌دهد خروجی آن‌ها را چنان تغییر مسیر دهید که گویی یک برنامهٔ واحد هستند:

{ printf " hello " ; printf " world\n" ; } > greeting

توجه داشته باشید که “}” باید پس از یک عملگر کنترلی (در این‌جا “;”) بیاید تا به عنوان یک کلمهٔ رزروشده شناخته شود و نه به عنوان آرگومان دیگری از دستور.

نحو تعریف یک تابع عبارت است از:

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 به صورت یک دستور توکار پیاده‌سازی شده است.

پوسته مجموعه‌ای از پارامترها را نگهداری می‌کند. پارامتری که با یک نام مشخص شود متغیر نامیده می‌شود. هنگام آغاز به کار، پوسته تمامی متغیرهای محیطی را به متغیرهای پوسته تبدیل می‌کند. متغیرهای جدید می‌توانند با استفاده از فرم زیر مقداردهی شوند:

name=value

متغیرهایی که توسط کاربر تنظیم می‌شوند باید نامی متشکل از حروف الفبا، اعداد، و زیرخط (underscore) داشته باشند – که نخستین نویسهٔ آن نباید عددی باشد. یک پارامتر همچنین می‌تواند با یک عدد یا یک نویسهٔ ویژه مشخص شود همان‌گونه که در زیر توضیح داده شده است.

پارامتر موضعی پارامتری است که با یک عدد مشخص می‌شود (n > 0). پوسته در ابتدا این پارامترها را روی مقادیر آرگومان‌های خط فرمان خود که پس از نام اسکریپت پوسته می‌آیند تنظیم می‌کند. دستور توکار set نیز می‌تواند برای تنظیم یا بازنشانی آن‌ها استفاده شود.

پارامتر ویژه پارامتری است که با یکی از نویسه‌های ویژهٔ زیر مشخص می‌شود. مقدار پارامتر در کنار نویسهٔ آن فهرست شده است.

*
به پارامترهای موضعی گسترش می‌یابد، که از یک شروع می‌شوند. هنگامی که گسترش درون یک رشتهٔ محصور در نقل‌قول جفتی رخ می‌دهد، به یک فیلد واحد گسترش می‌یابد که مقدار هر پارامتر در آن با نخستین نویسهٔ متغیر IFS از یکدیگر جدا شده است، یا با یک ⟨space⟩ در صورتی که IFS تنظیم نشده باشد.
@
به پارامترهای موضعی گسترش می‌یابد، که از یک شروع می‌شوند. هنگامی که گسترش درون نقل‌قول جفتی رخ می‌دهد، هر پارامتر موضعی به عنوان یک آرگومان جداگانه گسترش می‌یابد. اگر هیچ پارامتر موضعی وجود نداشته باشد، گسترش @ هیچ آرگومانی تولید نمی‌کند، حتی اگر @ درون نقل‌قول جفتی باشد. معنای اساسی این موضوع به عنوان مثال این است که اگر $1 برابر با “abc” و $2 برابر با “def ghi” باشد، در این صورت "$@" به دو آرگومان زیر گسترش می‌یابد:
"abc" "def ghi"
#
به تعداد پارامترهای موضعی گسترش می‌یابد.
?
به وضعیت خروج آخرین خط‌لوله گسترش می‌یابد.
- (خط تیره)
به فلگ‌های گزینه‌های جاری (نام‌های تک‌حرفی گزینه‌ها که به صورت یک رشته به هم پیوسته‌اند) گسترش می‌یابد، همان‌گونه که در هنگام فراخوانی، توسط دستور توکار set، یا به طور ضمنی توسط پوسته مشخص شده است.
$
به شناسهٔ فرایند (PID) پوستهٔ فراخوانده‌شده گسترش می‌یابد. یک زیرپوسته همان مقدار $ والد خود را حفظ می‌کند.
!
به شناسهٔ فرایند (PID) آخرین دستور پس‌زمینه که از پوستهٔ جاری اجرا شده گسترش می‌یابد. برای یک خط‌لوله، شناسهٔ فرایند متعلق به آخرین دستور در خط‌لوله است.
0 (صفر)
به نام پوسته یا اسکریپت پوسته گسترش می‌یابد.

این بند گسترش‌های مختلفی را که روی کلمات انجام می‌شوند شرح می‌دهد. همهٔ گسترش‌ها روی همهٔ کلمات انجام نمی‌شوند، همان‌گونه که بعداً توضیح داده شده است.

گسترش‌های تیلدا، گسترش‌های پارامتر، جایگزینی‌های دستور، گسترش‌های محاسباتی، و حذف نقل‌قول‌ها که درون یک کلمهٔ واحد رخ می‌دهند، به یک فیلد واحد گسترش می‌یابند. تنها تفکیک فیلدها یا گسترش نام مسیر است که می‌تواند چندین فیلد از یک کلمهٔ واحد بسازد. تنها استثنا بر این قاعده، گسترش پارامتر ویژهٔ @ درون نقل‌قول جفتی است، همان‌گونه که در بالا شرح داده شد.

ترتیب گسترش کلمات به این شرح است:

  1. گسترش تیلدا، گسترش پارامتر، جایگزینی دستور، گسترش محاسباتی (این موارد همگی هم‌زمان رخ می‌دهند).
  2. تفکیک فیلدها روی فیلدهای تولیدشده توسط گام (۱) انجام می‌شود مگر آن‌که متغیر IFS تهی (null) باشد.
  3. گسترش نام مسیر (مگر آن‌که set -f در حال اجرا باشد).
  4. حذف نقل‌قول.

نویسهٔ $ برای معرفی گسترش پارامتر، جایگزینی دستور، یا ارزیابی محاسباتی به کار می‌رود.

کلمه‌ای که با یک نویسهٔ تیلدا (~) بدون نقل‌قول آغاز شود مشمول گسترش تیلدا می‌گردد. تمامی نویسه‌ها تا یک اسلش (/) یا انتهای کلمه به عنوان نام کاربری در نظر گرفته شده و با دایرکتوری خانگی آن کاربر جایگزین می‌شوند. اگر نام کاربری وجود نداشته باشد (مانند ~/foobar), تیلدا با مقدار متغیر HOME (دایرکتوری خانگی کاربر فعلی) جایگزین می‌شود.

قالب گسترش پارامتر به این شکل است:

${expression}

که در آن عبارت (expression) شامل تمامی نویسه‌ها تا “}” متناظر است. هر “}” که با یک اسلش وارو اسکیپ شده باشد یا درون یک رشتهٔ محصور در نقل‌قول باشد، و نویسه‌ها در گسترش‌های محاسباتی تعبیه‌شده، جایگزینی‌های دستور، و گسترش‌های متغیر، در تعیین “}” متناظر بررسی نمی‌شوند.

ساده‌ترین شکل برای گسترش پارامتر چنین است:

${parameter}

مقدار parameter (در صورت وجود) جایگزین می‌شود.

نام یا نماد پارامتر می‌تواند درون آکولادها محصور شود، که این آکولادها اختیاری هستند به جز برای پارامترهای موضعی دارای بیش از یک رقم یا هنگامی که پس از پارامتر نویسه‌ای بیاید که می‌تواند به عنوان بخشی از نام تفسیر شود. اگر گسترش پارامتر درون نقل‌قول جفتی رخ دهد:

  1. گسترش نام مسیر روی نتایج گسترش انجام نمی‌شود.
  2. تفکیک فیلدها روی نتایج گسترش انجام نمی‌شود، به استثنای @.

علاوه بر این، یک گسترش پارامتر می‌تواند با استفاده از یکی از قالب‌های زیر تغییر یابد:

${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)

یا (نسخهٔ “محصور در بک‌تیک”):

`command`

پوسته جایگزینی دستور را با اجرای command در یک محیط زیرپوسته و جایگزین کردن جایگزینی دستور با خروجی استاندارد دستور گسترش می‌دهد، و توالی‌های یک یا چند ⟨newline⟩را در انتهای جایگزینی حذف می‌کند. (نویسه‌های ⟨newline⟩تعبیه‌شده پیش از انتهای خروجی حذف نمی‌شوند؛ با این حال، در طول تفکیک فیلدها، ممکن است بسته به مقدار IFS و نقل‌قول‌های فعال، به ⟨space⟩تبدیل شوند.)

گسترش محاسباتی سازوکاری برای ارزیابی یک عبارت محاسباتی و جایگزین کردن مقدار آن فراهم می‌کند. قالب گسترش محاسباتی به این صورت است:

$((expression))

با عبارت طوری رفتار می‌شود که گویی درون نقل‌قول جفتی است، به جز این‌که نقل‌قول جفتی درون عبارت رفتار ویژه‌ای ندارد. پوسته تمامی نشانه‌ها (tokens) در عبارت را برای گسترش پارامتر، جایگزینی دستور، و حذف نقل‌قول گسترش می‌دهد.

سپس، پوسته با آن به عنوان یک عبارت محاسباتی رفتار کرده و مقدار عبارت را جایگزین می‌کند.

پس از گسترش پارامتر، جایگزینی دستور، و گسترش محاسباتی، پوسته نتایج گسترش‌ها و جایگزینی‌هایی را که درون نقل‌قول جفتی رخ نداده‌اند برای تفکیک فیلدها بررسی می‌کند و چندین فیلد می‌تواند حاصل شود.

پوسته با هر نویسه از IFS به عنوان یک جداکننده رفتار کرده و از جداکننده‌ها برای تفکیک نتایج گسترش پارامتر و جایگزینی دستور به فیلدها استفاده می‌کند.

اگر IFS خالی باشد، تفکیک فیلدها در صورتی که رشتهٔ ورودی خالی بوده باشد هیچ فیلدی تولید نمی‌کند، و در غیر این صورت یک رشته با مقدار بدون تغییر ورودی تولید می‌نماید. برای مثال، با IFS پیش‌فرض، دستور “read -r l” هرگونه فاصلهٔ خالی ابتدایی را حذف خواهد کرد، اما “IFS= read -r l” کل خط را درون l باقی خواهد گذاشت.

مگر آن‌که فلگ -f تنظیم شده باشد، تولید نام فایل پس از تکمیل تفکیک کلمات انجام می‌شود. به هر کلمه به عنوان توالی از الگوها نگریسته می‌شود که با اسلش‌ها از یکدیگر جدا شده‌اند. فرآیند گسترش، کلمه را با نام‌های تمامی فایل‌های موجود که نام آن‌ها می‌تواند با جایگزینی هر الگو با رشته‌ای که با الگوی مشخص مطابقت دارد ساخته شود، جایگزین می‌کند. دو محدودیت بر این موضوع حاکم است: نخست، یک الگو نمی‌تواند با رشته‌ای حاوی اسلش مطابقت یابد، و دوم، یک الگو نمی‌تواند با رشته‌ای که با یک نقطه آغاز می‌شود مطابقت یابد مگر آن‌که نخستین نویسهٔ الگو یک نقطه باشد. بخش بعدی الگوهای مورد استفاده را هم برای گسترش نام مسیر و هم برای دستور case شرح می‌دهد.

یک الگو از نویسه‌های عادی، که با خودشان مطابقت می‌یابند، و فرا‌نویسه‌ها (meta-characters) تشکیل می‌شود. فرا‌نویسه‌ها عبارتند از: “!”, “*”, “?”, و “[”. این نویسه‌ها در صورت نقل‌قول شدن معنای ویژهٔ خود را از دست می‌دهند. هنگامی که جایگزینی دستور یا متغیر انجام می‌شود و علامت دلار یا بک‌تیک درون نقل‌قول جفتی نباشد، مقدار متغیر یا خروجی دستور برای یافتن این نویسه‌ها بررسی شده و آن‌ها به فرا‌نویسه‌ها تبدیل می‌شوند.

یک ستاره (“*”) با هر رشته‌ای از نویسه‌ها مطابقت می‌یابد. علامت سؤال با هر نویسهٔ منفرد مطابقت می‌یابد. یک کروشهٔ باز (“[”) یک کلاس نویسه را معرفی می‌کند. انتهای کلاس نویسه با یک (“]”) مشخص می‌شود؛ اگر “]” وجود نداشته باشد، در این صورت “[” به جای معرفی کلاس نویسه، با یک “[” تطبیق داده می‌شود. یک کلاس نویسه با هر یک از نویسه‌های بین کروشه‌ها مطابقت می‌یابد. محدوده‌ای از نویسه‌ها می‌تواند با استفاده از علامت منفی مشخص شود. کلاس نویسه می‌تواند با قرار دادن علامت تعجب به عنوان نخستین نویسهٔ کلاس نویسه متمم شود.

برای گنجاندن یک “]” در یک کلاس نویسه، آن را به عنوان نخستین نویسهٔ فهرست‌شده قرار دهید (پس از “!”, در صورت وجود). برای گنجاندن علامت منفی، آن را به عنوان نخستین یا آخرین نویسهٔ فهرست‌شده قرار دهید.

این بخش دستورات توکاری را فهرست می‌کند که توکار هستند زیرا نیاز به انجام عملیاتی دارند که نمی‌تواند توسط یک فرایند جداگانه انجام شود. علاوه بر این‌ها، چندین دستور دیگر نیز وجود دارند که ممکن است به منظور افزایش کارایی توکار باشند (مانند 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 ...]
اجرای دستور مشخص‌شده با نادیده گرفتن توابع پوسته هنگام جستجو برای آن. (این مورد زمانی مفید است که یک تابع پوسته با نامی مشابه با یک دستور توکار داشته باشید.)
جستجوی دستور با استفاده از یک PATH که یافتن تمامی ابزارهای استاندارد را تضمین می‌کند.
عدم اجرای دستور اما جستجو برای آن و چاپ نتیجهٔ تفکیک جستجوی دستور. این گزینه مشابه دستور توکار type است.
عدم اجرای دستور اما جستجو برای آن و چاپ مسیر مطلق ابزارها، نام دستورات توکار یا گسترش نام‌های مستعار.
cd|chdir -
 
cd|chdir [-LP] [directory]
تغییر مکان به دایرکتوری مشخص‌شده (پیش‌فرض HOME). اگر مدخلی برای CDPATH در محیط دستور cd ظاهر شود یا متغیر پوستهٔ CDPATH تنظیم شده باشد و نام دایرکتوری با یک اسلش آغاز نشود، در این صورت دایرکتوری‌های فهرست‌شده در CDPATH برای یافتن دایرکتوری مشخص‌شده جستجو خواهند شد. قالب CDPATH مشابه قالب PATH است. اگر یک خط تیرهٔ تنها به عنوان آرگومان مشخص شود، با مقدار OLDPWD جایگزین خواهد شد. دستور cd در صورتی که نام دایرکتوری تغییریافته با نامی که کاربر وارد کرده متفاوت باشد، نام آن را چاپ خواهد کرد. این تفاوت ممکن است به دلیل استفاده از سازوکار CDPATH یا مشخص شدن خط تیرهٔ تنها به عنوان آرگومان باشد. گزینهٔ -P موجب می‌شود ساختار فیزیکی دایرکتوری استفاده شود، یعنی تمامی پیوندهای نمادین به مقادیر مربوطهٔ خود تفکیک شوند. گزینهٔ -L اثر گزینه‌های قبلی -P را لغو می‌کند.
echo [-n] args...
چاپ آرگومان‌ها روی خروجی استاندارد، که با فاصله‌ها از یکدیگر جدا شده‌اند. مگر آن‌که گزینهٔ -n حاضر باشد، یک خط جدید در انتهای آرگومان‌ها خروجی داده می‌شود.

اگر هر یک از توالی‌های نویسه‌ای زیر در حین خروجی مشاهده شود، آن توالی خروجی داده نمی‌شود، بلکه اقدام مشخص‌شده انجام می‌گیرد:

یک نویسهٔ پس‌بر (backspace) چاپ می‌شود.
خروجی‌های بعدی متوقف می‌شوند. این معمولاً در انتهای آخرین آرگومان برای جلوگیری از چاپ خط جدید انتهایی که echo در غیر این صورت چاپ می‌کرد استفاده می‌شود.
چاپ یک فرم‌فید (form feed).
چاپ یک نویسهٔ خط جدید (newline).
چاپ یک نویسهٔ بازگشت به ابتدای سطر (carriage return).
چاپ یک نویسهٔ تب (افقی).
چاپ یک تب عمودی.
digits
چاپ نویسه‌ای که مقدار آن با صفر تا سه رقم اکتال (پایهٔ ۸) مشخص شده است. اگر هیچ رقمی نباشد، یک نویسهٔ تهی (nul) خروجی داده می‌شود.
\\
چاپ یک اسلش وارو (بک‌اسلش).

تمامی توالی‌های دیگر اسلش وارو رفتار تعریف‌نشده ایجاد می‌کنند.

eval string ...
اتصال تمامی آرگومان‌ها با فاصله، و سپس تجزیهٔ مجدد و اجرای دستور.
exec [command arg ...]
مگر در صورت حذف command، فرایند پوسته با برنامهٔ مشخص‌شده جایگزین می‌شود (که باید یک برنامهٔ واقعی باشد، نه یک دستور توکار یا تابع پوسته). هرگونه تغییر مسیر روی دستور exec به عنوان دائمی علامت‌گذاری می‌شود، به طوری که با پایان دستور exec لغو نخواهند شد.
exit [exitstatus]
پایان دادن به فرایند پوسته. اگر exitstatus داده شود، به عنوان وضعیت خروج پوسته استفاده می‌شود؛ در غیر این صورت وضعیت خروج دستور قبلی استفاده خواهد شد.
export name ...
 
export -p
نام‌های مشخص‌شده صادر (export) می‌شوند تا در محیط دستورات بعدی ظاهر شوند. تنها راه لغو صدور یک متغیر، حذف مقدار آن (unset) است. پوسته امکان می‌دهد مقدار یک متغیر هم‌زمان با صدور آن با نوشتن عبارت زیر تنظیم شود:
export name=value

بدون هیچ آرگومانی، دستور export نام تمامی متغیرهای صادرشده را فهرست می‌کند. با مشخص شدن گزینهٔ -p, خروجی به گونه‌ای قالب‌بندی می‌شود که برای استفادهٔ غیرتعاملی مناسب باشد.

fc [-e editor] [first [last]]
 
fc -l [-nr] [first [last]]
 
fc -s [old=new] [first]
دستور توکار fc دستوراتی را که پیش‌تر به یک پوستهٔ تعاملی وارد شده‌اند فهرست می‌کند، یا ویرایش کرده و دوباره اجرا می‌نماید.
editor
استفاده از ویرایشگر تعیین‌شده با editor برای ویرایش دستورات. رشتهٔ editor یک نام دستور است که مشمول جستجو از طریق متغیر PATH می‌باشد. مقدار متغیر FCEDIT در صورت مشخص نشدن -e به عنوان پیش‌فرض استفاده می‌شود. اگر FCEDIT تهی یا تنظیم‌نشده باشد، مقدار متغیر EDITOR استفاده خواهد شد. اگر EDITOR تهی یا تنظیم‌نشده باشد، ed(1) به عنوان ویرایشگر استفاده می‌شود.
(ell)
فهرست کردن دستورات به جای فراخوانی ویرایشگر روی آن‌ها. دستورات به ترتیبی که توسط عملوندهای first و last مشخص شده، با اعمال اثر -r, نوشته می‌شوند و پیش از هر دستور شمارهٔ آن قرار می‌گیرد.
حذف شمارهٔ دستورات هنگام فهرست کردن با -l.
معکوس کردن ترتیب دستورات فهرست‌شده (با -l) یا ویرایش‌شده (در صورت نبود -l و -s).
اجرای مجدد دستور بدون فراخوانی ویرایشگر.
first
 
last
انتخاب دستورات برای فهرست کردن یا ویرایش. تعداد دستورات قبلی که می‌توان به آن‌ها دسترسی داشت بر اساس مقدار متغیر HISTSIZE تعیین می‌شود. مقدار first یا last یا هر دو یکی از موارد زیر است:
[+]number
یک عدد مثبت که نشان‌دهندهٔ شمارهٔ دستور است؛ شمارهٔ دستورات را می‌توان با گزینهٔ -l نمایش داد.
یک عدد اعشاری منفی که نشان‌دهندهٔ دستوری است که به تعداد آن عدد قبل‌تر اجرا شده است. برای مثال، -1 دستوری است که بلافاصله پیش از دستور فعلی اجرا شده است.
string
رشته‌ای که نشان‌دهندهٔ جدیدترین دستور واردشده است که با آن رشته آغاز می‌شود. اگر عملوند old=new با -s مشخص نشده باشد، شکل رشته‌ای عملوند نخست نمی‌تواند حاوی علامت مساوی تعبیه‌شده باشد.

متغیرهای محیطی زیر بر اجرای fc تأثیر می‌گذارند:

نام ویرایشگر مورد استفاده.
تعداد دستورات قبلی که قابل دسترسی هستند.
fg [job]
انتقال کار مشخص‌شده یا کار فعلی به پیش‌زمینه.
getopts optstring var [arg ...]
دستور getopts استاندارد POSIX, که نباید با ابزار برگرفته از آزمایشگاه‌های بل (-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ها:
به طور پیش‌فرض
نمایش شمارهٔ کار، وضعیت اولویت () در صورت وجود، حالت کار، و دستور پوسته‌ای آن.
چاپ PID رهبر گروه کار، و صرفاً PID و دستورات پوسته‌ای سایر اعضای کار.
تنها نمایش PID رهبران کار، هر کدام در یک خط.
kill [-s sigspec | -signum | -sigspec] [pid | job ...]
معادل kill(1), اما می‌توان مشخصهٔ یک job را نیز تعیین کرد. سیگنال‌ها می‌توانند نام‌های غیرحساس به حروف کوچک و بزرگ بدون پیشوندهای SIG یا اعداد اعشاری باشند؛ پیش‌فرض TERM است.
kill -l [signum | exitstatus]
فهرست کردن نام سیگنال‌های موجود بدون پیشوند SIG (sigspecs). اگر signum مشخص شود، صرفاً sigspec مربوط به آن سیگنال را نمایش می‌دهد. اگر exitstatus مشخص شود (> ), صرفاً sigspec را که باعث آن شده است نمایش می‌دهد.
pwd [-LP]
دستور توکار به جای محاسبهٔ مجدد دایرکتوری جاری در هر بار، آن را به خاطر می‌سپارد. این ویژگی آن را سریع‌تر می‌کند. با این حال، اگر نام دایرکتوری جاری تغییر یابد، نسخهٔ توکار pwd همچنان نام قدیمی دایرکتوری را چاپ خواهد کرد. گزینهٔ -P موجب می‌شود مقدار فیزیکی دایرکتوری کاری فعلی نشان داده شود، یعنی تمامی پیوندهای نمادین به مقادیر مربوطهٔ خود تفکیک شوند. گزینهٔ -L اثر گزینه‌های قبلی -P را لغو می‌کند.
read [-p prompt] [-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”) هستند. نویسه‌ها و معانی آن‌ها به شرح زیر است:

چاپ یک نویسهٔ <زنگ (bell)>.
چاپ یک نویسهٔ <پس‌بر (backspace)>.
چاپ یک نویسهٔ <فرم‌فید (form-feed)>.
چاپ یک نویسهٔ <خط جدید (new-line)>.
چاپ یک نویسهٔ <بازگشت سطر (carriage return)>.
چاپ یک نویسهٔ <تب (tab)>.
چاپ یک نویسهٔ <تب عمودی (vertical tab)>.
\\
چاپ یک نویسهٔ اسلش وارو (بک‌اسلش).
\num
چاپ یک نویسهٔ ۸ بیتی که مقدار ASCII آن عدد اکتال ۱، ۲، یا ۳ رقمی num است.

هر مشخصهٔ قالب با نویسهٔ درصد (``%'') معرفی می‌شود. باقی‌ماندهٔ مشخصهٔ قالب شامل موارد زیر است، به ترتیب:

صفر یا چند مورد از فلگ‌های زیر:
یک نویسهٔ `#' که مشخص می‌کند مقدار باید در یک ``شکل جایگزین'' چاپ شود. برای قالب‌های b, c, d, و s, این گزینه اثری ندارد. برای قالب o دقت عدد افزایش می‌یابد تا نخستین نویسهٔ رشتهٔ خروجی به صفر تبدیل شود. برای قالب x (X), یک نتیجهٔ غیرصفر رشتهٔ 0x (0X) را در ابتدای خود خواهد داشت. برای قالب‌های e, E, f, g, و G, نتیجه همواره شامل ممیز اعشاری خواهد بود، حتی اگر هیچ رقمی پس از ممیز نیاید (معمولاً ممیز اعشاری در نتایج این قالب‌ها تنها زمانی ظاهر می‌شود که رقمی پس از ممیز باشد). برای قالب‌های g و G, صفر‌های انتهایی از نتیجه حذف نمی‌شوند بر خلاف حالتی که در غیر این صورت حذف می‌شدند.
-
یک علامت منفی `-' که تراز به چپ خروجی را در فیلد مشخص‌شده تعیین می‌کند؛
یک نویسهٔ `+' که مشخص می‌کند همواره باید علامتی پیش از عدد هنگام استفاده از قالب‌های علامت‌دار قرار گیرد.
‘ ’
یک فاصله که مشخص می‌کند باید یک جای خالی پیش از یک عدد مثبت برای قالب علامت‌دار گذاشته شود. یک `+' در صورت استفاده از هر دو بر فاصله اولویت دارد؛
یک نویسهٔ صفر `0' که نشان می‌دهد باید از پر کردن با صفر به جای پر کردن با فاصله استفاده شود. یک `-' در صورت استفاده از هر دو بر `0' اولویت دارد؛
عرض فیلد (Field Width):
یک رشتهٔ رقمی اختیاری که عرض فیلد را مشخص می‌کند؛ اگر رشتهٔ خروجی نویسه‌های کمتری نسبت به عرض فیلد داشته باشد، برای جبران عرض فیلد از سمت چپ (یا راست، در صورتی که نشانگر تراز به چپ داده شده باشد) با فاصله پر می‌شود (توجه داشته باشید که صفر آغازین یک فلگ است، اما صفر تعبیه‌شده در میان، بخشی از عرض فیلد است)؛
دقت (Precision):
یک نقطهٔ اختیاری، ‘.’, دنبال‌شده توسط یک رشتهٔ رقمی اختیاری که دقت را ارائه می‌دهد که تعداد ارقامی را که باید پس از ممیز اعشاری ظاهر شوند، برای قالب‌های e و f, یا حداکثر تعداد بایت‌هایی را که باید از یک رشته چاپ شوند (قالب‌هایb و s) مشخص می‌کند؛ اگر رشتهٔ رقمی وجود نداشته باشد، دقت به عنوان صفر تلقی می‌شود؛
قالب (Format):
نویسه‌ای که نوع قالب مورد استفاده را نشان می‌دهد (یکی از diouxXfwEgGbcs).

عرض فیلد یا دقت می‌تواند ‘*’ به جای یک رشتهٔ رقمی باشد. در این حالت یک argument عرض فیلد یا دقت را تأمین می‌کند.

نویسه‌های قالب و معانی آن‌ها عبارتند از:

عملوند argument به ترتیب به عنوان ده‌دهی علامت‌دار (d یا i)، اکتال بدون علامت، ده‌دهی بدون علامت، یا هگزادسیمال بدون علامت (X یا x) چاپ می‌شود.
عملوند argument به سبک [-]ddd.ddd چاپ می‌شود که در آن تعداد dها پس از ممیز اعشاری برابر با مشخصهٔ دقت برای آرگومان است. اگر دقت حذف شده باشد، ۶ رقم داده می‌شود؛ اگر دقت صراحتاً ۰ باشد، هیچ رقمی و هیچ ممیزی چاپ نمی‌شود.
عملوند argument به سبک [-]d.ddde±dd چاپ می‌شود که در آن یک رقم قبل از ممیز اعشاری است و تعداد پس از آن برابر با مشخصهٔ دقت برای آرگومان است؛ در صورت نبود دقت، ۶ رقم تولید می‌شود. یک E بزرگ برای قالب `E' استفاده می‌شود.
عملوند argument به سبک f یا به سبک e (E) چاپ می‌شود، هر کدام که دقت کامل را در کمترین فضا ارائه دهد.
نویسه‌ها از رشتهٔ argument با گسترش توالی‌های گریز اسلش وارو چاپ می‌شوند.
توالی‌های گریز اسلش واروی اضافی زیر پشتیبانی می‌شوند:
باعث می‌شود dash هرگونه نویسهٔ باقی‌مانده در عملوند رشتهٔ حاوی آن، هر عملوند رشتهٔ باقی‌مانده، و هر نویسهٔ اضافی در عملوند قالب را نادیده بگیرد.
num
چاپ یک نویسهٔ ۸ بیتی که مقدار ASCII آن عدد اکتال ۱، ۲، یا ۳ رقمی num است.
نخستین نویسهٔ argument چاپ می‌شود.
نویسه‌ها از رشتهٔ argument تا رسیدن به انتها یا تا رسیدن به تعداد بایت‌های نشان‌داده‌شده توسط مشخصهٔ دقت چاپ می‌شوند؛ در صورت حذف دقت، تمامی نویسه‌ها در رشته چاپ می‌گردند.
چاپ یک `%'؛ هیچ آرگومانی استفاده نمی‌شود.

در هیچ حالتی عرض فیلد ناموجود یا کوچک موجب کوتاه‌سازی یک فیلد نمی‌شود؛ پر کردن فضا تنها در صورتی انجام می‌گیرد که عرض فیلد مشخص‌شده از عرض واقعی فراتر رود.

set [{ -options | +options | -- }] arg ...
دستور set سه عملکرد متفاوت انجام می‌دهد.

بدون هیچ آرگومانی، مقادیر تمامی متغیرهای پوسته را فهرست می‌کند.

اگر گزینه‌ها داده شوند، فلگ‌های گزینهٔ مشخص‌شده را تنظیم کرده یا آن‌ها را همان‌گونه که در بخش پردازش لیست آرگومان‌ها شرح داده شد پاک می‌کند. به عنوان یک حالت خاص، اگر گزینه -o یا +o باشد و هیچ آرگومانی ارائه نشود، پوسته تنظیمات تمامی گزینه‌های خود را چاپ می‌کند. اگر گزینه -o باشد، تنظیمات در قالبی خوانا برای انسان چاپ می‌شوند؛ اگر گزینه +o باشد، تنظیمات در قالبی چاپ می‌شوند که برای ورود مجدد به پوسته جهت اعمال همان تنظیمات گزینه مناسب باشد.

علاوه بر نام‌های گزینه‌های فهرست‌شده در بخش پردازش لیست آرگومان‌ها ، گزینه‌های زیر نیز می‌توانند به عنوان آرگومان برای -o یا +o مشخص شوند:

محاسبهٔ وضعیت خروج یک خط‌لوله بر اساس وضعیت‌های خروج تمامی دستورات موجود در خط‌لوله، نه فقط آخرین دستور، همان‌گونه که در بخش خط‌لوله‌ها توضیح داده شد.

سومین کاربرد دستور 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) زیر برای ساخت عبارت به کار می‌روند:

file
درست اگر file وجود داشته باشد و یک فایل ویژهٔ بلوکی باشد.
file
درست اگر file وجود داشته باشد و یک فایل ویژهٔ نویسه‌ای باشد.
file
درست اگر file وجود داشته باشد و یک دایرکتوری باشد.
file
درست اگر file وجود داشته باشد (صرف‌نظر از نوع آن).
file
درست اگر file وجود داشته باشد و یک فایل معمولی باشد.
file
درست اگر file وجود داشته باشد و فلگ شناسهٔ گروهی (setgid) آن فعال باشد.
file
درست اگر file وجود داشته باشد و یک پیوند نمادین باشد.
file
درست اگر file وجود داشته باشد و بیت چسبندهٔ (sticky bit) آن تنظیم شده باشد.
string
درست اگر طول string غیرصفر باشد.
file
درست اگر file یک لولهٔ نام‌گذاری‌شده (FIFO) باشد.
file
درست اگر file وجود داشته باشد و خواندنی باشد.
file
درست اگر file وجود داشته باشد و اندازه‌ای بزرگ‌تر از صفر داشته باشد.
file_descriptor
درست اگر فایلی که شمارهٔ توصیف‌گر فایل آن file_descriptor است باز بوده و با یک ترمینال مرتبط باشد.
file
درست اگر file وجود داشته باشد و فلگ شناسهٔ کاربری (setuid) آن فعال باشد.
file
درست اگر file وجود داشته باشد و قابل نوشتن باشد. درست بودن تنها نشان می‌دهد که فلگ نوشتن فعال است. فایل در یک فایل‌سیستم فقط‌خواندنی قابل نوشتن نیست حتی اگر این آزمون مقدار درست را نشان دهد.
file
درست اگر file وجود داشته باشد و قابل اجرا باشد. درست بودن تنها نشان می‌دهد که فلگ اجرا فعال است. اگر file یک دایرکتوری باشد، درست نشان می‌دهد که file می‌تواند جستجو شود.
string
درست اگر طول string صفر باشد.
file
درست اگر file وجود داشته باشد و یک پیوند نمادین باشد. این عملگر برای سازگاری با نسخه‌های قبلی این برنامه حفظ شده است. به وجود آن متکی نباشید؛ به جای آن از -h استفاده کنید.
file
درست اگر file وجود داشته باشد و مالک آن با شناسهٔ کاربری مؤثر (effective UID) این فرایند مطابقت داشته باشد.
file
درست اگر file وجود داشته باشد و گروه آن با شناسهٔ گروهی مؤثر (effective GID) این فرایند مطابقت داشته باشد.
file
درست اگر file وجود داشته باشد و یک سوکت باشد.
file1 -nt file2
درست اگر file1 و file2 وجود داشته باشند و file1 جدیدتر از file2 باشد، یا اگر file1 وجود داشته باشد اما file2 وجود نداشته باشد.
file1 -ot file2
درست اگر file1 و file2 وجود داشته باشند و file1 قدیمی‌تر از file2 باشد، یا اگر file2 وجود داشته باشد اما file1 وجود نداشته باشد.
file1 -ef file2
درست اگر file1 و file2 وجود داشته باشند و به همان فایل یکسان ارجاع دهند.
string
درست اگر string رشتهٔ تهی نباشد.
s1 = s2
درست اگر رشته‌های s1 و s2 یکسان باشند.
s1 != s2
درست اگر رشته‌های s1 و s2 یکسان نباشند.
s1 < s2
درست اگر رشتهٔ s1 بر اساس مقدار ASCII نویسه‌های آن‌ها قبل از s2 بیاید.
s1 > s2
درست اگر رشتهٔ s1 بر اساس مقدار ASCII نویسه‌های آن‌ها بعد از s2 بیاید.
n1 -eq n2
درست اگر اعداد صحیح n1 و n2 از نظر جبری برابر باشند.
n1 -ne n2
درست اگر اعداد صحیح n1 و n2 از نظر جبری برابر نباشند.
n1 -gt n2
درست اگر عدد صحیح n1 از نظر جبری بزرگ‌تر از عدد صحیح n2 باشد.
n1 -ge n2
درست اگر عدد صحیح n1 از نظر جبری بزرگ‌تر یا مساوی با عدد صحیح n2 باشد.
n1 -lt n2
درست اگر عدد صحیح n1 از نظر جبری کوچک‌تر از عدد صحیح n2 باشد.
n1 -le n2
درست اگر عدد صحیح n1 از نظر جبری کوچک‌تر یا مساوی با عدد صحیح n2 باشد.

این گزاره‌های اولیه می‌توانند با عملگرهای زیر ترکیب شوند:

expression
درست اگر expression نادرست باشد.
expression1 -a expression2
درست اگر هر دو expression1 و expression2 درست باشند.
expression1 -o expression2
درست اگر یکی از 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 مشخص نشود، محدودیت نرم نمایش داده می‌شود یا هر دو محدودیت تنظیم می‌گردند. اگر هر دو مشخص شوند، مورد آخر اعمال می‌شود.

محدودیتی که باید استعلام یا تنظیم شود با مشخص کردن هر یک از این فلگ‌ها انتخاب می‌شود:

نمایش تمامی محدودیت‌های فعلی
نمایش یا تنظیم محدودیت زمان CPU (بر حسب ثانیه)
نمایش یا تنظیم محدودیت بزرگ‌ترین فایلی که می‌تواند ایجاد شود (در بلوک‌های ۵۱۲ بایتی)
نمایش یا تنظیم محدودیت اندازهٔ سگمنت دادهٔ یک فرایند (بر حسب کیلوبایت)
نمایش یا تنظیم محدودیت اندازهٔ پشتهٔ یک فرایند (بر حسب کیلوبایت)
نمایش یا تنظیم محدودیت بزرگ‌ترین اندازهٔ core dump که می‌تواند تولید شود (در بلوک‌های ۵۱۲ بایتی)
نمایش یا تنظیم محدودیت کل حافظهٔ فیزیکی که می‌تواند توسط یک فرایند استفاده شود (بر حسب کیلوبایت)
نمایش یا تنظیم محدودیت مقداری از حافظه که یک فرایند می‌تواند با mlock(2) قفل کند (بر حسب کیلوبایت)
نمایش یا تنظیم محدودیت تعداد فرایندهایی که این کاربر می‌تواند هم‌زمان داشته باشد
نمایش یا تنظیم محدودیت تعداد فایل‌هایی که یک فرایند می‌تواند هم‌زمان باز داشته باشد
نمایش یا تنظیم محدودیت کل حافظهٔ مجازی که می‌تواند توسط یک فرایند استفاده شود (بر حسب کیلوبایت)
نمایش یا تنظیم محدودیت تعداد کل قفل‌های نگه‌داشته‌شده توسط یک فرایند
نمایش یا تنظیم محدودیت اولویت زمان‌بندی بی‌درنگ (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]
انتظار برای تکمیل کار مشخص‌شده و بازگرداندن وضعیت خروج آخرین فرایند در کار. اگر آرگومان حذف شود، انتظار برای تکمیل تمامی کارها و بازگرداندن وضعیت خروج صفر.

هنگامی که dash به صورت تعاملی از یک ترمینال استفاده می‌شود، دستور فعلی و تاریخچهٔ دستورات (ببینید fc در بخش دستورات توکار) می‌توانند با استفاده از ویرایش خط فرمان در حالت vi ویرایش شوند. این حالت از دستوراتی استفاده می‌کند که در زیر توضیح داده شده و مشابه زیرمجموعه‌ای از دستورات ارائه‌شده در صفحهٔ راهنمای vi هستند. دستور ‘set -o vi’ ویرایش در حالت vi را فعال کرده و sh را در حالت درج (insert mode) پوستهٔ vi قرار می‌دهد. با فعال بودن حالت vi، می‌توان sh را بین حالت درج و حالت دستور (command mode) جابه‌جا کرد. این حالت مشابه vi است: تایپ کردن کلید ⟨ESC⟩ وارد حالت دستور vi می‌شود. فشردن کلید ⟨return⟩ در حالت دستور، خط را به پوسته ارسال خواهد کرد.

خطاهایی که توسط پوسته شناسایی می‌شوند، مانند خطای نحوی، باعث می‌شوند پوسته با وضعیت خروج غیرصفر خارج شود. اگر پوسته یک پوستهٔ تعاملی نباشد، اجرای فایل پوسته متوقف خواهد شد. در غیر این صورت، پوسته وضعیت خروج آخرین دستور اجراشده را برمی‌گرداند، یا اگر دستور توکار exit با یک آرگومان عددی استفاده شود، آن آرگومان را برمی‌گرداند.

به طور خودکار توسط login(1) از دایرکتوری ورود کاربر در فایل گذرواژه (passwd(5)) تنظیم می‌شود. این متغیر محیطی همچنین به عنوان آرگومان پیش‌فرض برای دستور توکار cd عمل می‌کند.
مسیر جستجوی پیش‌فرض برای فایل‌های اجرایی. بخش جستجوی مسیر در بالا را ببینید.
مسیر جستجوی مورد استفاده با دستور توکار cd.
نام فایل نامه‌ای که برای بررسی ورود نامه‌های جدید بررسی خواهد شد. توسط MAILPATH نادیده گرفته می‌شود.
بسامد زمانی بر حسب ثانیه که پوسته ورود نامه را در فایل‌های مشخص‌شده توسط MAILPATH یا فایل MAIL بررسی می‌کند. اگر روی 0 تنظیم شود، بررسی در هر اعلان دستور رخ خواهد داد.
فهرستی از نام‌های فایل که با دو‌نقطه “:” از هم جدا شده‌اند، تا پوسته نامه‌های دریافتی را در آن‌ها بررسی کند. این تنظیم محیطی بر تنظیم MAIL اولویت دارد. حداکثر ۱۰ صندوق پستی می‌توانند هم‌زمان نظارت شوند.
رشتهٔ اعلان اصلی، که پیش‌فرض آن “$ ”, است، مگر آن‌که کاربر ارشد (superuser) باشید، که در این حالت پیش‌فرض آن “# ” خواهد بود.
رشتهٔ اعلان ثانویه، که پیش‌فرض آن “> ” است.
خروجی پیش از هر خط هنگامی که ردیابی اجرا (set -x) فعال است، که پیش‌فرض آن “+ ” می‌باشد.
جداکننده‌های فیلد ورودی (Input Field Separators). این متغیر معمولاً روی ⟨space⟩, ⟨tab⟩, و ⟨newline⟩ تنظیم می‌شود. برای جزئیات بیشتر به بخش تفکیک بر اساس فاصله‌ها مراجعه کنید.
تنظیم پیش‌فرض ترمینال برای پوسته. این متغیر توسط فرزندان پوسته به ارث برده می‌شود و در حالت‌های ویرایش تاریخچه به کار می‌رود.
تعداد خطوط در بافر تاریخچه برای پوسته.
مقدار منطقی دایرکتوری کاری فعلی. این مقدار توسط دستور cd تنظیم می‌شود.
مقدار منطقی پیشین دایرکتوری کاری فعلی. این مقدار توسط دستور cd تنظیم می‌شود.
شناسهٔ فرایند (PID) فرایند والد پوسته.

  • $HOME/.profile
  • /etc/profile

csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)

dash یک پیاده‌سازی سازگار با POSIX از /bin/sh است که هدف آن این است که تا حد امکان کوچک و کم‌حجم باشد. dash نوادهٔ مستقیم نسخهٔ NetBSD از ash (پوستهٔ Almquist SHell) است، که در اوایل ۱۹۹۷ به لینوکس پورت شد. نام آن در سال ۲۰۰۲ به dash تغییر یافت.

از اسکریپت‌های پوسته‌ای دارای بیت Setuid باید تحت هر شرایطی اجتناب شود، زیرا خطر امنیتی چشمگیری به شمار می‌روند.

January 19, 2003 Linux 6.12.107+deb13-amd64