| KSH(1) | General Commands Manual | KSH(1) |
نام (NAME)
ksh, rksh, pfksh - پوسته تعاملی و زبان برنامهنویسی استاندارد KornShell
نکته (NOTE)
در حال حاضر، rksh و pfksh در سیستمعاملهای macOS / Darwin در دسترس نیستند.
خلاصه دستور (SYNOPSIS)
ksh [ ±abcefhiknoprstuvxBCDP ] [ -R file ] [ ±o option ] ... [ - ] [ arg ... ]
توضیحات (DESCRIPTION)
Ksh یک دستور و زبان برنامهنویسی است که دستورات خواندهشده از یک ترمینال یا یک فایل را اجرا میکند. Rksh نسخه محدودشدهای از مفسر دستور استاندارد ksh؛ است؛ این پوسته برای تنظیم نامهای ورود و محیطهای اجرایی به کار میرود که قابلیتهای آنها نسبت به پوسته استاندارد بیشتر کنترل شده است. Rpfksh یک نسخه پروفایلشل از مفسر دستور استاندارد ksh؛ است؛ از آن برای اجرای دستورات با ویژگیهای مشخصشده توسط پروفایلهای کاربر استفاده میشود (به pfexec(1) مراجعه کنید). برای مفهوم آرگومانهای ارسالی به پوسته، بخش فراخوانی (Invocation) در زیر را ببینید.
تعاریف (Definitions)
یک نویسه کنترلی (metacharacter) یکی از نویسههای زیر است:
یک نویسه خالی (blank) یک tab یا یک space است. یک شناسه (identifier) توالیای از حروف، ارقام یا زیرخطها است که با یک حرف یا زیرخط شروع میشود. شناسهها بهعنوان اجزای نامهای متغیر استفاده میشوند. یک vname توالیای از یک یا چند شناسه است که توسط یک . از هم جدا شدهاند و اختیاری است که در ابتدا نیز یک . داشته باشند. Vnameها بهعنوان نام توابع و متغیرها استفاده میشوند. یک کلمه (word) توالیای از نویسهها از مجموعه نویسههای تعریفشده در لوکال جاری است، به استثنای نویسههای کنترلی نقلقولنشده.
یک دستور (command) توالیای از نویسهها در نحو زبان پوسته است. پوسته هر دستور را میخواند و عمل مورد نظر را مستقیماً یا با فراخوانی ابزارهای مجزا به انجام میرساند. یک دستور توکار (built-in)، دستوری است که توسط خود پوسته بدون ایجاد فرایند جداگانه اجرا میشود. برخی دستورات صرفاً برای سهولت کار توکار هستند و در اینجا مستند نشدهاند. دستورات توکاری که باعث اثرات جانبی در محیط پوسته میشوند و دستورات توکاری که قبل از اجرای جستجوی مسیر یافت میشوند (به بخش اجرا (Execution) در زیر مراجعه کنید) در اینجا مستند شدهاند. به دلایل تاریخی، برخی از این دستورات توکار رفتاری متفاوت با سایر دستورات توکار دارند و دستورات توکار ویژه نامیده میشوند.
دستورها (Commands)
یک دستور ساده (simple-command) لیستی از انتسابهای متغیر (به بخش انتساب متغیرها (Variable Assignments) در زیر مراجعه کنید) یا توالیای از کلمات جداشده با نویسه خالی است که ممکن است پیش از آن لیستی از انتسابهای متغیر قرار گیرد (به بخش محیط (Environment) در زیر مراجعه کنید). کلمه اول نام دستوری را که باید اجرا شود مشخص میکند. به استثنای مواردی که در زیر مشخص شده، کلمات باقیمانده بهعنوان آرگومان به دستور فراخوانیشده ارسال میشوند. نام دستور بهعنوان آرگومان 0 ارسال میشود (به exec(2) مراجعه کنید). مقدار (value) یک دستور ساده همان وضعیت خروج آن است؛ در صورت خاتمه عادی 0-255؛ در صورت خاتمه غیرعادی 256+signum است (نام سیگنال متناظر با وضعیت خروج را میتوان از طریق گزینه -l در ابزار توکار kill به دست آورد).
یک خط لوله (pipeline) توالیای از یک یا چند دستور است که با ⎪ از هم جدا شدهاند. خروجی استاندارد هر دستور به جز دستور آخر توسط یک pipe(2) به ورودی استاندارد دستور بعدی متصل میشود. هر دستور، احتمالاً به جز دستور آخر، بهعنوان یک فرایند جداگانه اجرا میشود؛ پوسته منتظر خاتمه آخرین دستور میماند. وضعیت خروج یک خط لوله همان وضعیت خروج آخرین دستور است مگر آنکه گزینه pipefail فعال باشد. هر خط لوله میتواند با کلمه رزروشده ! شروع شود که باعث میشود وضعیت خروج خط لوله در صورت غیرصفر بودن وضعیت خروج آخرین دستور 0 شود و در صورت 0 بودن وضعیت خروج آخرین دستور 1 شود.
یک لیست (list) توالیای از یک یا چند خط لوله است که با ;، &، ⎪&، &&، یا ⎪⎪ از هم جدا شدهاند و به صورت اختیاری با ;، &، یا ⎪& خاتمه مییابند. از میان این پنج نماد، ;، &، و ⎪& دارای تقدم یکسان هستند، که پایینتر از تقدم && و ⎪⎪ است. نمادهای && و ⎪⎪ نیز دارای تقدم یکسان هستند. نقطهویرگول (;) باعث اجرای متوالی خط لوله قبلی میشود؛ علامت آمپرسند (&) باعث اجرای ناهمگام خط لوله قبلی میشود (یعنی پوسته منتظر اتمام آن خط لوله نمیماند). نماد ⎪& باعث اجرای ناهمگام خط لوله قبلی همراه با ایجاد یک لوله دوطرفه با پوسته والد میشود؛ پوسته والد میتواند با اعمال عملگرهای بازهدایت <& و >& با آرگومان p به دستورات و با استفاده از گزینه -p در دستورات توکار read و print که بعداً شرح داده شدهاند، در ورودی و خروجی استاندارد خط لوله ایجادشده بنویسد یا از آن بخواند. نماد && (⎪⎪) باعث میشود لیست پس از آن فقط در صورتی اجرا شود که خط لوله قبلی مقدار صفر (غیرصفر) برگرداند. یک یا چند خط جدید ممکن است در یک لیست به جای نقطهویرگول برای مرزبندی دستور قرار گیرند. اولین مورد از اولین خط لوله یک لیست که یک دستور ساده است و با بازهدایت شروع نمیشود، و درون یک لیست while، until، یا if قرار ندارد، میتواند با یک نقطهویرگول شروع شود. این نقطهویرگول نادیده گرفته میشود مگر آنکه گزینه showme همانطور که در دستور توکار set در زیر توضیح داده شده، فعال باشد.
یک دستور (command) یا یک دستور ساده است یا یکی از موارد زیر. مگر اینکه خلاف آن ذکر شده باشد، مقدار برگرداندهشده توسط یک دستور همان مقدار آخرین دستور ساده اجراشده در آن دستور است.
- for vname [ in word ... ] ;do list ;done
- هر بار که یک دستور for اجرا میشود، vname بر روی کلمه بعدی برگرفته از لیست in word تنظیم میشود. اگر in word ... حذف شود، آنگاه دستور for بخش do list را یک بار به ازای هر پارامتر مکانی تنظیمشده با شروع از 1 اجرا میکند (به بخش گسترش پارامتر (Parameter Expansion) در زیر مراجعه کنید). اجرا زمانی پایان مییابد که کلمه دیگری در لیست باقی نمانده باشد.
- for (( [expr1] ; [expr2] ; [expr3] )) ;do list ;done
- عبارت حسابی expr1 ابتدا ارزیابی میشود (به بخش ارزیابی حسابی (Arithmetic evaluation) در زیر مراجعه کنید). عبارت حسابی expr2 به طور مکرر ارزیابی میشود تا زمانی که مقدار آن صفر شود؛ و در صورت غیرصفر بودن، list اجرا شده و عبارت حسابی expr3 ارزیابی میشود. اگر هر عبارتی حذف شود، طوری رفتار میکند که گویی مقدار آن 1 ارزیابی شده است.
- select vname [ in word ... ] ;do list ;done
- یک دستور select مجموعه کلماترا، که هر کدام با یک عدد پیشدرآمد شدهاند، در خطای استاندارد (توصیفکننده فایل 2) چاپ میکند. اگر in word ... حذف شود، آنگاه پارامترهای مکانی با شروع از 1 به جای آن استفاده میشوند (به بخش گسترش پارامتر (Parameter Expansion) در زیر مراجعه کنید). اعلان PS3 چاپ میشود و یک خط از ورودی استاندارد خوانده میشود. اگر این خط شامل شماره یکی از کلمات فهرستشده باشد، آنگاه مقدار متغیر vname بر روی کلمه متناظر با این شماره تنظیم میشود. اگر این خط خالی باشد، لیست گزینهها مجدداً چاپ میشود. در غیر این صورت مقدار متغیر vname بر روی null تنظیم میشود. محتوای خط خواندهشده از ورودی استاندارد در متغیر REPLY ذخیره میشود. لیست به ازای هر انتخاب اجرا میشود تا زمانی که به یک break یا پایان فایل (end-of-file) برخورد کند. اگر متغیر REPLY با اجرای list بر روی null تنظیم شود، آنگاه لیست گزینهها قبل از نمایش اعلان PS3 برای انتخاب بعدی چاپ میشود.
- case word in [ [(]pattern [ ⎪ pattern ] ... ) list ;; ] ... esac
- یک دستور case آن لیستی را اجرا میکند که با اولین الگوی منطبق با word مرتبط است. قالب الگوها همان قالبی است که برای تولید نام فایل استفاده میشود (به بخش تولید نام فایل (File Name Generation) در زیر مراجعه کنید). عملگر ;; باعث خاتمه اجرای case میشود. اگر از ;& به جای ;; استفاده شود، لیست بعدی (در صورت وجود) اجرا خواهد شد.
- if list ;then list [ ;elif list ;then list ] ... [ ;else list ] ;fi
- لیست پس از if اجرا میشود و اگر وضعیت خروج صفر برگرداند، لیست پس از اولین then اجرا میشود. در غیر این صورت، لیست پس از elif اجرا شده و اگر مقدار آن صفر باشد، لیست پس از then بعدی اجرا میشود. در صورت عدم موفقیت هر یک از elif لیستهای متوالی، لیست else اجرا میشود. اگر if لیست وضعیت خروج غیرصفر داشته باشد و هیچ else لیستی وجود نداشته باشد، آنگاه دستور if وضعیت خروج صفر برمیگرداند.
- while list ;do list ;done
- until list ;do list ;done
- یک دستور while به طور مکرر while لیست را اجرا میکند و اگر وضعیت خروج آخرین دستور در لیست صفر باشد، do لیست را اجرا میکند؛ در غیر این صورت حلقه خاتمه مییابد. اگر هیچ دستوری در do لیست اجرا نشود، آنگاه دستور while وضعیت خروج صفر برمیگرداند؛ until میتواند به جای while برای نفی شرط خاتمه حلقه استفاده شود.
- ((expression))
-
عبارت با استفاده از قواعد ارزیابی حسابی که در زیر توضیح داده شده ارزیابی میشود. اگر مقدار عبارت حسابی غیرصفر باشد، وضعیت خروج 0 است، در غیر این صورت وضعیت خروج 1 خواهد بود. - (list)
-
لیست را در یک محیط جداگانه اجرا میکند. توجه داشته باشید که اگر دو پرانتز باز مجاور برای تودرتوسازی لازم باشد، باید یک فاصله درج شود تا از ارزیابی بهعنوان یک دستور حسابی (همانطور که در بالا شرح داده شد) جلوگیری شود. - { list;}
-
لیست صرفاً اجرا میشود. توجه داشته باشید که بر خلاف نویسههای کنترلی ( و )، نویسههای { و } جزو کلمات رزروشده هستند و برای شناخته شدن باید در ابتدای یک خط یا پس از یک ; قرار گیرند. - [[ expression ]]
-
عبارت را ارزیابی کرده و هنگامی که عبارت درست باشد وضعیت خروج صفر برمیگرداند. برای شرح expression، به بخش عبارتهای شرطی (Conditional Expressions) در زیر مراجعه کنید. - function varname { list ;}
- varname () { list ;}
- تابعی را تعریف میکند که با varname ارجاع داده میشود. تابعی که varname آن شامل یک . باشد، تابع انضباطی (discipline function) نامیده میشود و بخشی از varname که قبل از آخرین . میآید باید به یک متغیر موجود اشاره کند. بدنه تابع همان لیست دستورات بین { و } است. تابعی که با نحو function varname تعریف شده باشد میتواند بهعنوان آرگومان برای دستور توکار ویژه . نیز استفاده شود تا رفتاری معادل با حالتی که از نحو varname() برای تعریف آن استفاده شده به دست آید. (به بخش توابع (Functions) در زیر مراجعه کنید.)
- namespace varname { list ;}
-
فضای نام شناسه را تعریف کرده یا استفاده میکند و دستورات موجود در list را در این فضای نام اجرا مینماید. (به بخش فضاهای نام (Name Spaces) در زیر مراجعه کنید.) - & [ name [ arg... ] ]
- باعث میشود دستورات لیست بعدی که با & خاتمه مییابند در استخر کارهای پسزمینه name قرار گیرند. اگر name حذف شود، یک استخر بدون نام پیشفرض استفاده میشود. دستورات موجود در یک استخر پسزمینه نامگذاریشده ممکن است از راه دور اجرا شوند.
- time [ pipeline ]
-
اگر pipeline حذف شود، زمان کاربری و سیستمی برای پوسته جاری و فرایندهای فرزند تکمیلشده در خطای استاندارد چاپ میشود. در غیر این صورت، خط لوله اجرا شده و زمان سپریشده و همچنین زمان کاربری و سیستمی در خطای استاندارد چاپ میشوند. متغیر TIMEFORMAT میتواند روی یک رشته قالببندی تنظیم شود که نحوه نمایش اطلاعات زمانبندی را مشخص میکند. برای شرح متغیر TIMEFORMAT، به بخش متغیرهای پوسته (Shell Variables) در زیر مراجعه کنید.
کلمات رزروشده زیر تنها زمانی که کلمه اول یک دستور باشند و نقلقول نشده باشند بهعنوان کلمه رزروشده شناخته میشوند:
if then else elif fi case esac for while until do done { } function select time [[ ]] !
انتساب متغیرها (Variable Assignments)
یک یا چند انتساب متغیر میتواند در ابتدای یک دستور ساده قرار گیرد یا به عنوان آرگومان به دستورات توکار ویژه typeset، enum، export، یا readonly و همچنین به سایر دستورات اعلان ایجادشده به عنوان نوع داده (Type) داده شود. نحو یک انتساب به فرم زیر است:
- varname=word
- varname[word]=word
- هیچ فاصلهای بین varname و = یا بین = و word مجاز نیست.
- varname=(assign_list)
- هیچ فاصلهای بین varname و = مجاز نیست. متغیر varname پیش از انتساب، لغو تعریف (unset) میشود. یک assign_list میتواند یکی از موارد زیر باشد:
- word ...
- انتساب آرایه اندیسی.
- [word]=word ...
- انتساب آرایه انجمنی (Associative Array). اگر پیش از آن typeset -a بیاید، در عوض یک آرایه اندیسی ایجاد خواهد شد.
- assignment ...
- انتساب متغیر ترکیبی (Compound Variable). این دستور یک متغیر ترکیبی به نام varname با زیرمتغیرهایی به فرم varname.name ایجاد میکند، که در آن name بخش نام در assignment است. مقدار varname شامل تمام عناصر انتساب خواهد بود. انتسابهای اضافی ایجادشده برای زیرمتغیرهای varname نیز به عنوان بخشی از مقدار varname نمایش داده میشوند. اگر هیچ assignment مشخص نشود، varname یک متغیر ترکیبی خواهد بود که اجازه تعریف عناصر فرزند بعدی را میدهد.
- typeset [options] assignment ...
- انتساب متغیر تودرتو. انتسابهای چندگانه را میتوان با جدا کردن هر کدام با ; مشخص کرد. مقدار قبلی پیش از انتساب، لغو تعریف (unset) میشود. سایر دستورات اعلان مانند readonly، enum و سایر دستورات اعلان را میتوان به جای typeset استفاده کرد.
- . filename
- شامل کردن دستورات انتساب موجود در filename.
علاوه بر این، میتوان از += به جای = استفاده کرد تا به معنای افزودن یا پیوست کردن به مقدار قبلی باشد. هنگامی که += روی یک نوع محاسباتی اعمال شود، word به عنوان یک عبارت محاسباتی ارزیابی شده و به مقدار فعلی افزوده میشود. هنگامی که روی یک متغیر رشتهای اعمال شود، مقدار مشخصشده توسط word به مقدار قبلی پیوست میشود. برای انتسابهای ترکیبی، مقدار قبلی لغو تعریف نمیشود و مقادیر جدید به مقادیر قبلی پیوست میشوند، به شرطی که نوعها سازگار باشند.
سمت راست یک انتساب متغیر تحت تمام گسترشهای ذکرشده در زیر به جز تفکیک کلمات، گسترش آکولاد و تولید نام فایل قرار میگیرد. هنگامی که سمت چپ یک انتساب، یک متغیر ترکیبی باشد و سمت راست نام یک متغیر ترکیبی باشد، متغیر ترکیبی سمت راست در متغیر ترکیبی سمت چپ کپی یا به آن پیوست خواهد شد.
توضیحات (Comments)
کلمهای که با # شروع شود باعث میشود آن کلمه و تمام نویسههای بعدی تا خط جدید نادیده گرفته شوند.
نام مستعار (Aliasing)
کلمه اول هر دستور با متن یک alias جایگزین میشود اگر یک alias برای این کلمه تعریف شده باشد. یک نام alias شامل هر تعداد نویسه به جز فرانویسهها (Metacharacters)، نویسههای نقلقول، نویسههای گسترش فایل، نویسههای گسترش پارامتر و جایگزینی دستور، و نویسههای / و = است. رشته جایگزین میتواند شامل هر اسکریپت شل معتبری از جمله فرانویسههای ذکرشده در بالا باشد. کلمه اول هر دستور در متن جایگزینشده، به جز مواردی که در حال جایگزینی هستند، برای نامهای مستعار بررسی خواهد شد. اگر آخرین نویسه مقدار نام مستعار یک blank (فاصله یا تب) باشد، کلمه پس از نام مستعار نیز برای جایگزینی نام مستعار بررسی خواهد شد. نامهای مستعار را میتوان برای بازتعریف دستورات توکار استفاده کرد، اما نمیتوان از آنها برای بازتعریف کلمات رزروشده ذکرشده در بالا استفاده کرد. نامهای مستعار را میتوان با دستور alias ایجاد کرد و فهرست نمود و با دستور unalias آنها را حذف کرد.
نامگذاری مستعار (Aliasing) هنگامی که اسکریپتها خوانده میشوند انجام میگیرد، نه در زمان اجرای آنها. بنابراین، برای اینکه یک نام مستعار اعمال شود، دستور تعریف alias باید پیش از خوانده شدن دستوری که به نام مستعار ارجاع میدهد، اجرا شده باشد.
نامهای مستعار زیر در شل کامپایل شدهاند اما میتوان آنها را لغو تعریف یا بازتعریف کرد:
- autoload=′typeset -fu′
- bool=′_Bool′
- command=′command ′
- compound=′typeset -C′
- fc=hist
- float=′typeset -lE′
- functions=′typeset -f′
- hash=′alias -t --′
- history=′hist -l′
- integer=′typeset -li′
- nameref=′typeset -n′
- nohup=′nohup ′
- r=′hist -s′
- redirect=′command exec′
- source=′command .′
- stop=′kill -s STOP′
- suspend=′kill -s STOP "$$"′
- type=′whence -v′
جایگزینی مدک (Tilde Substitution)
پس از انجام جایگزینی نام مستعار، هر کلمه بررسی میشود تا مشخص شود آیا با یک ∼ (مدک) بدون نقلقول شروع میشود یا خیر. برای جایگزینی مدک، word به بخش word در گسترش پارامتر نیز اشاره دارد (بخش گسترش متغیرها و پارامترها در زیر را ببینید). اگر چنین باشد، کلمه تا یک / بررسی میشود تا مشخص شود آیا با نام کاربری در پایگاهداده گذرواژهها مطابقت دارد یا خیر (نگاه کنید به getpwname(3).) اگر تطابقی یافت شود، ∼ و نام کاربری منطبق با دایرکتوری ورود کاربر مربوطه جایگزین میشوند. اگر تطابقی یافت نشود، متن اصلی دستنخورده باقی میماند. یک ∼ به تنهایی یا در جلوی یک /، با $HOME جایگزین میشود. یک ∼ که پس از آن یک + یا - بیاید، به ترتیب با مقدار $PWD و $OLDPWD جایگزین میشود. یک ∼ که پس از آن {fd} بیاید که در آن fd یک شماره توصیفکننده فایل (File Descriptor) یا نام متغیری است که مقدار آن یک توصیفکننده فایل است، با رشتهای جایگزین میشود که معادل مسیر فایل یا دایرکتوری مربوط به این توصیفکننده فایل است.
علاوه بر این، هنگام گسترش یک انتساب متغیر، جایگزینی مدک (tilde) زمانی که مقدار انتساب با یک ∼ شروع شود، و زمانی که یک ∼ پس از یک : ظاهر شود، انجام میگیرد. نویسه : همچنین پایانبخش یک نام ورود پس از ∼ است.
جایگزینی دستور (Command Substitution)
خروجی استاندارد حاصل از یک لیست دستور محصور در پرانتز که قبل از آن یک علامت دلار قرار دارد ( $(list) )، یا در یک گروه آکولاد که قبل از آن یک علامت دلار قرار دارد ( ${ list;} )، یا در یک جفت نقلقول وارون (``) میتواند به عنوان بخشی از یک کلمه یا کل آن استفاده شود؛ خطوط جدید پایانی حذف میشوند. در حالت دوم، { و } به عنوان کلمات رزروشده در نظر گرفته میشوند به طوری که پس از { باید یک blank (فاصله یا تب) بیاید و } باید در ابتدای خط قرار گیرد یا پس از یک ; بیاید. در حالت سوم (منسوخ)، رشته بین نقلقولها پیش از اجرای دستور برای نویسههای نقلقول ویژه پردازش میشود (بخش نقلقول در زیر را ببینید). جایگزینی دستور $(cat file) را میتوان با معادل سریعتر آن $(<file) جایگزین کرد. جایگزینی دستور $(n<#) به آفست بایت جاری برای توصیفکننده فایل n گسترش مییابد. به جز در حالت دوم، لیست دستورات در یک زیرشل اجرا میشود به طوری که هیچ اثر جانبی (Side Effect) امکانپذیر نیست. در حالت دوم، علامت پایانی } پس از هر توکن به عنوان کلمه رزروشده شناخته خواهد شد.
جایگزینی محاسباتی (Arithmetic Substitution)
یک عبارت محاسباتی محصور در جفتپرانتز که قبل از آن علامت دلار قرار دارد ( $(()) ) با مقدار عبارت محاسباتی درون جفتپرانتز جایگزین میشود.
جایگزینی فرآیند (Process Substitution)
هر آرگومان دستور به فرم <(list) یا >(list) فرآیند list را به صورت ناهمگام متصل به فایلی در /dev/fd (اگر این دایرکتوری وجود داشته باشد) یا یک لوله نامگذاریشده (FIFO) در دایرکتوری موقت اجرا میکند. نام این فایل به عنوان آرگومان به دستور داده میشود. اگر فرم با > انتخاب شود، نوشتن روی این فایل ورودی را برای list فراهم میکند. اگر از < استفاده شود، فایل ارائهشده به عنوان آرگومان، حاوی خروجی فرآیند list خواهد بود. به عنوان مثال،
فیلدهای ۱ و ۳ را به ترتیب از فایلهای file1 و file2 استخراج میکند (cut)، نتایج را با هم ترکیب میکند (paste)، و آن را به فرآیندهای process1 و process2 میفرستد، و همچنین آن را در خروجی استاندارد قرار میدهد. توجه داشته باشید فایلی که به عنوان آرگومان به دستور داده میشود، یک لوله pipe(2) یونیکس است، بنابراین برنامههایی که انتظار دارند روی فایل lseek(2) انجام دهند کار نخواهند کرد.
جایگزینی فرآیند به فرم <(list) میتواند همراه با عملگر تغییر مسیر < نیز استفاده شود که باعث میشود خروجی list به ورودی استاندارد یا ورودی هر توصیفکننده فایل مشخصشده تبدیل شود.
گسترش متغیرها و پارامترها (Parameter Expansion)
یک پارامتر یک متغیر، یک یا چند رقم، یا هر یک از نویسههای *، @، #، ?، -، $ و ! است. یک متغیر با یک vname مشخص میشود. برای ایجاد متغیری که vname آن حاوی یک . باشد، متغیری که vname آن شامل همهچیز قبل از آخرین . است باید از قبل وجود داشته باشد. یک متغیر دارای یک مقدار و صفر یا چند ویژگی(Attribute) است. میتوان با استفاده از دستور توکار ویژه typeset به متغیرها مقدار و ویژگی اختصاص داد. ویژگیهای پشتیبانیشده توسط شل بعداً همراه با دستور توکار ویژه typeset توضیح داده شدهاند. متغیرهای صادرشده (Exported)، مقادیر و ویژگیها را به محیط (Environment) انتقال میدهند.
شل هم از آرایههای اندیسی و هم از آرایههای انجمنی پشتیبانی میکند. یک عنصر از متغیر آرایهای با یک زیرنویس/اندیس(Subscript) مورد ارجاع قرار میگیرد. یک زیرنویس برای آرایه اندیسی با یک عبارت محاسباتی (بخش ارزیابی محاسباتی در زیر را ببینید) بین یک [ و یک ] مشخص میشود. برای انتساب مقادیر به یک آرایه اندیسی، از vname=(value ...) یا set -A vname value ... استفاده کنید. مقدار تمام زیرنویسهای غیرمنفی باید در محدوده 0 تا 4,194,303 باشد. یک زیرنویس منفی به عنوان یک آفست از بیشینه اندیس فعلی + 1 در نظر گرفته میشود به طوری که -1 به آخرین عنصر اشاره دارد. آرایههای اندیسی را میتوان با گزینه -a در typeset اعلان کرد. آرایههای اندیسی نیازی به اعلان ندارند. هرگونه ارجاع به یک متغیر با یک زیرنویس معتبر، مجاز است و در صورت لزوم یک آرایه ایجاد خواهد شد.
یک آرایه انجمنی با گزینه -A در typeset ایجاد میشود. یک زیرنویس برای آرایه انجمنی با یک رشته محصور بین [ و ] مشخص میشود.
ارجاع به هر آرایهای بدون زیرنویس، معادل ارجاع به آن آرایه با زیرنویس 0 است.
مقدار یک متغیر را میتوان به صورت زیر انتساب داد:
یا
ویژگیهای اختصاصیافته توسط دستور توکار ویژه typeset روی تمام عناصر آرایه اعمال میشوند. یک عنصر آرایه میتواند متغیر ساده، متغیر ترکیبی یا متغیر آرایهای باشد. یک عنصر آرایه اندیسی میتواند آرایه اندیسی یا آرایه انجمنی باشد. یک عنصر آرایه انجمنی نیز میتواند هر کدام از اینها باشد. برای ارجاع به یک عنصر آرایه که خود بخشی از یک عنصر آرایه است، زیرنویسها را در براکتها به هم متصل کنید. به عنوان مثال، برای ارجاع به عنصر foobar از یک آرایه انجمنی که به عنوان سومین عنصر آرایه اندیسی تعریف شده است، از ${vname[3][foobar]} استفاده کنید.
یک مرجعنام (nameref) متغیری است که ارجاعی به یک متغیر دیگر است. یک nameref با ویژگی -n در typeset ایجاد میشود. مقدار متغیر در زمان اجرای دستور typeset تبدیل به متغیری میشود که هر زمان متغیر nameref استفاده شود، به آن ارجاع داده خواهد شد. نام یک nameref نمیتواند حاوی . باشد. هنگامی که نام یک متغیر یا تابع حاوی . باشد، و بخشی از نام تا اولین . با نام یک nameref مطابقت داشته باشد، متغیر مورد ارجاع با جایگزین کردن بخش nameref با نام متغیر ارجاعشده توسط nameref به دست میآید. اگر یک nameref به عنوان اندیس یک حلقه for استفاده شود، یک مرجع نام برای هر آیتم در لیست برقرار میشود. یک nameref روشی مناسب برای ارجاع به متغیر داخل تابعی فراهم میکند که نام آن به عنوان آرگومان به تابع ارسال شده است. به عنوان مثال، اگر نام یک متغیر به عنوان اولین آرگومان به یک تابع ارسال شود، دستور
درون تابع باعث میشود که ارجاعات و انتسابها به var همان ارجاعات و انتسابها به متغیری باشد که نام آن به تابع ارسال شده است.
اگر هر یک از ویژگیهای ممیز شناور، -E، -F یا -X، یا ویژگی عدد صحیح، -i، برای vname تنظیم شده باشد، آنگاه مقدار مشمول ارزیابی محاسباتی به شرح زیر میشود.
پارامترهای موضعی (Positional Parameters)، پارامترهایی که با یک عدد مشخص میشوند، میتوانند با دستور توکار ویژه set مقداردهی شوند. پارامتر $0 هنگام فراخوانی شل از روی آرگومان صفر تنظیم میشود.
نویسه $ برای معرفی پارامترهای قابل جایگزینی به کار میرود.
- ${parameter}
- شل تمام نویسهها را از ${ تا } منطبق به عنوان بخشی از همان کلمه میخواند حتی اگر حاوی آکولادها یا فرانویسهها باشد. مقدار پارامتر (در صورت وجود) جایگزین میشود. استفاده از آکولادها زمانی الزامی است که پس از parameter یک حرف، رقم یا زیرخط (underscore) بیاید که نباید به عنوان بخشی از نام آن تفسیر شود، یا زمانی که نام متغیر حاوی یک . باشد. همچنین آکولادها زمانی که یک متغیر دارای زیرنویس است الزامی هستند، مگر اینکه بخشی از یک عبارت محاسباتی یا عبارت شرطی باشد. اگر parameter یک یا چند رقم باشد، یک پارامتر موضعی است. یک پارامتر موضعی با بیش از یک رقم باید درون آکولاد قرار گیرد. اگر parameter برابر با * یا @ باشد، تمام پارامترهای موضعی با شروع از $1 جایگزین میشوند (که با یک نویسه جداکننده فیلد از هم جدا میشوند). اگر یک متغیر آرایهای vname با آخرین زیرنویس *، @ یا برای آرایههای اندیسی به فرم sub1 .. sub2 استفاده شود، آنگاه مقدار هر یک از عناصر بین sub1 و sub2 شامل خود آنها (یا تمام عناصر برای * و @) جایگزین میشود، که با اولین نویسه از مقدار IFS از یکدیگر جدا میشوند.
- ${#parameter}
- اگر parameter برابر با * یا @ باشد، تعداد پارامترهای موضعی جایگزین میشود. در غیر این صورت، طول مقدار parameter جایگزین میشود.
- ${#vname[*]}
- ${#vname[@]}
- تعداد عناصر موجود در آرایه vname جایگزین میشود.
- ${@vname}
- به نام نوع داده (بخش متغیرهای نوع داده (Type Variables) در زیر را ببینید) یا ویژگیهای متغیر ارجاعشده توسط vname گسترش مییابد.
- ${$parameter}
- اگر $parameter به نام یک متغیر گسترش یابد، این عبارت به مقدار آن متغیر گسترش مییابد. در غیر این صورت، به رشته خالی گسترش مییابد. این مورد برای پارامترهای ویژه تعریف نشده است.
- ${!vname}
- به نام متغیر ارجاعشده توسط vname گسترش مییابد. این مقدار برابر با vname خواهد بود به جز زمانی که vname یک ارجاع به نام (nameref) باشد.
- ${!vname[subscript]}
- به نام اندیس گسترش مییابد مگر اینکه subscript برابر با *، @ یا به فرم sub1 .. sub2 باشد. هنگامی که subscript برابر * باشد، فهرست اندیسهای آرایه برای vname تولید میشود. برای متغیری که آرایه نیست، در صورت مقداردهی بودن متغیر، مقدار 0 خواهد بود؛ در غیر این صورت تهی (null) است. هنگامی که subscript برابر @ باشد، همانند بالا عمل میکند، با این تفاوت که هنگام استفاده در نقلقول دوگانه (double quotes)، هر اندیس آرایه به عنوان یک آرگومان مجزا تولید میشود. هنگامی که subscript به فرم sub1 .. sub2 باشد، به فهرست اندیسهای بین sub1 تا sub2 (شامل هر دو) با استفاده از همان قوانین نقلقول @ گسترش مییابد.
- ${!prefix*}
- به نامهای متغیرهایی که نام آنها با prefix آغاز میشود گسترش مییابد.
- ${parameter:-word}
- اگر parameter مقداردهی شده و غیرتهی باشد، مقدار آن جایگزین میشود؛ در غیر این صورت word جایگزین میگردد.
- ${parameter:=word}
- اگر parameter مقداردهی نشده یا تهی باشد، مقدار آن برابر word تنظیم میشود؛ سپس مقدار پارامتر جایگزین میگردد. پارامترهای موضعی (Positional parameters) را نمیتوان از این طریق مقداردهی کرد.
- ${parameter:?word}
- اگر parameter مقداردهی شده و غیرتهی باشد، مقدار آن جایگزین میشود؛ در غیر این صورت، word چاپ شده و شل خاتمه مییابد (در صورتی که غیرتعاملی باشد). اگر word حذف شود، یک پیام استاندارد چاپ میشود.
- ${parameter:+word}
- اگر parameter مقداردهی شده و غیرتهی باشد، word جایگزین میشود؛ در غیر این صورت هیچ چیز جایگزین نمیگردد.
در موارد بالا، word ارزیابی نمیشود مگر آنکه قرار باشد به عنوان رشته جایگزین استفاده شود؛ به طوری که در مثال زیر، pwd تنها در صورتی اجرا میشود که d مقداردهی نشده یا تهی باشد:
اگر دونقطه ( : ) از عبارات فوق حذف شود، شل فقط مقداردهی بودن یا نبودن parameter را بررسی میکند.
- ${parameter:offset:length}
- ${parameter:offset}
- به بخشی از مقدار parameter گسترش مییابد که از کاراکتری (شمارش از 0 ) مشخصشده با ارزیابی offset به عنوان یک عبارت حسابی آغاز شده و شامل تعداد کاراکترهایی است که با عبارت حسابی تعریفشده توسط length مشخص میشود. در حالت دوم، باقیمانده مقدار استفاده میشود. مقدار منفی برای offset از انتهای parameter به سمت عقب شمارش میشود. توجه داشته باشید که قرار دادن یک یا چند فاصله (blank) قبل از علامت منفی الزامی است تا از تفسیر عملگر به عنوان :- توسط شل جلوگیری شود. اگر parameter برابر * یا @ باشد، یا نام یک آرایه با اندیس * یا @ باشد، آنگاه offset و length به ترتیب به اندیس آرایه و تعداد عناصر اشاره دارند. مقدار منفی offset برای آرایههای اندیسی نسبت به یک واحد بیشتر از بالاترین اندیس در نظر گرفته میشود. ترتیب در آرایههای انجمنی (associative arrays) نامشخص است.
- ${parameter#pattern}
- ${parameter##pattern}
- اگر الگوی شل ( pattern ) با ابتدای مقدار parameter تطابق داشته باشد، مقدار این گسترش همان مقدار parameter با حذف بخش منطبقشده خواهد بود؛ در غیر این صورت مقدار parameter جایگزین میشود. در حالت اول کوچکترین الگوی منطبق و در حالت دوم بزرگترین الگوی منطبق حذف میشود. هنگامی که parameter برابر @، * یا یک متغیر آرایهای با اندیس @ یا * باشد، عملیات زیررشته به نوبت روی تکتک عناصر اعمال میشود.
- ${parameter%pattern}
- ${parameter%%pattern}
- اگر الگوی شل ( pattern ) با انتهای مقدار parameter تطابق داشته باشد، مقدار این گسترش همان مقدار parameter با حذف بخش منطبقشده خواهد بود؛ در غیر این صورت مقدار parameter جایگزین میشود. در حالت اول کوچکترین الگوی منطبق و در حالت دوم بزرگترین الگوی منطبق حذف میشود. هنگامی که parameter برابر @، * یا یک متغیر آرایهای با اندیس @ یا * باشد، عملیات زیررشته به نوبت روی تکتک عناصر اعمال میشود.
- ${parameter/pattern/string}
- ${parameter//pattern/string}
- ${parameter/#pattern/string}
- ${parameter/%pattern/string}
- مقدار parameter را گسترش داده و طولانیترین تطابق pattern را با string دادهشده جایگزین میکند. هر رخداد \n در string با بخشی از parameter که با n-امین زیرالگو تطابق دارد جایگزین میشود. در حالت اول، تنها اولین رخداد pattern جایگزین میشود. در حالت دوم، تمام تطابقهای pattern با string دادهشده جایگزین میگردند. حالت سوم تطابق الگو را به ابتدای رشته محدود میکند، در حالی که حالت چهارم تطابق الگو را به انتهای رشته محدود میسازد. هنگامی که string تهی باشد، pattern حذف خواهد شد و / قبل از string میتواند حذف شود. هنگامی که parameter برابر @، * یا یک متغیر آرایهای با اندیس @ یا * باشد، عملیات جایگزینی به نوبت روی هر عنصر اعمال میشود. در این حالت، بخش string از word برای هر عنصر مجدداً ارزیابی خواهد شد.
- ${parameter^pattern}
- ${parameter^^pattern}
- ${parameter,pattern}
- ${parameter,,pattern}
- تغییر بزرگی و کوچکی حروف (Case modification). این گسترش بزرگی و کوچکی حروف الفبایی را در پارامتر تغییر میدهد. pattern درست مانند گسترش نام مسیر برای تولید الگو گسترش مییابد. عملگر ^ حروف کوچک منطبق با pattern را به حروف بزرگ تبدیل میکند. عملگر , حروف بزرگ منطبق را به حروف کوچک تبدیل میکند. گسترشهای ^^ و ,, تمام کاراکترهای منطبق را در مقدار گسترشیافته تبدیل میکنند. گسترشهای ^ و , تنها اولین کاراکتر در مقدار گسترشیافته را تطابق داده و تبدیل میکنند. اگر الگو حذف شود، همانند ? رفتار میشود که با هر کاراکتری تطابق دارد. اگر parameter برابر @ یا * باشد، یا یک آرایه با اندیس @ یا * باشد، عملیات تغییر حالت حروف روی تکتک عناصر اعمال میشود.
پارامترهای زیر به طور خودکار توسط شل تنظیم میشوند:
- #
- تعداد پارامترهای موضعی در مبنای ده.
- -
- گزینههای ارائهشده به شل هنگام فراخوانی یا توسط دستور set.
- ?
- مقدار دهدهی بازگرداندهشده توسط آخرین دستور اجراشده.
- $
- شماره پردازه (PID) این شل.
- _
- در ابتدا، مقدار _ مسیر مطلق شل یا اسکریپت در حال اجراست که در محیط (environment) ارسال شده است. سپس آخرین آرگومان دستور قبلی به آن اختصاص مییابد. این پارامتر برای دستوراتی که ناهمگام (asynchronous) هستند تنظیم نمیشود. همچنین این پارامتر برای نگهداری نام فایل منطبقشده MAIL هنگام بررسی نامهها استفاده میشود. هنگام تعریف یک متغیر مرکب (compound variable) یا یک نوع (type)، _ به عنوان ارجاعی به آن متغیر مرکب یا نوع مقداردهی اولیه میشود. هنگامی که یک تابع دیسیپلین (discipline function) فراخوانی میشود، _ به عنوان ارجاعی به متغیر مرتبط با فراخوانی این تابع مقداردهی اولیه میشود. در نهایت هنگامی که _ به عنوان نام اولین متغیر در تعریف یک نوع استفاده شود، نوع جدید از نوع اولین متغیر مشتق میشود (بخش Type Variables در ادامه را ببینید).
- !
- شناسه پردازه (PID) یا نام استخر (pool) و شماره کار آخرین دستور پسزمینه فراخوانیشده، یا جدیدترین کاری که با دستور توکار bg به پسزمینه فرستاده شده است. کارهای پسزمینه که در یک استخر نامگذاریشده شروع شدهاند به فرم pool.number خواهند بود که در آن pool نام استخر و number شماره کار در آن استخر است.
- .sh.command
- هنگام پردازش تله (trap) DEBUG این متغیر شامل خط فرمان فعلی است که در آستانه اجرا قرار دارد.
- .sh.edchar
- این متغیر شامل مقدار کاراکتر صفحهکلید (یا توالی کاراکترها در صورتی که اولین کاراکتر یک ESC با کد اسکی 033 باشد) است که هنگام پردازش تله KEYBD وارد شده است (بخش Key Bindings در ادامه را ببینید). اگر مقدار به عنوان بخشی از کنش تله تغییر داده شود، مقدار جدید جایگزین کلید (یا توالی کلیدها) که باعث ایجاد تله شده بود میشود.
- .sh.edcol
- موقعیت کاراکتری مکاننما در زمان وقوع جدیدترین تله KEYBD
- .sh.edmode
- هنگام پردازش تله KEYBD در حالت درج ویرایشگر vi، مقدار آن برابر ESC تنظیم میشود (بخش Vi Editing Mode در ادامه را ببینید). در غیر این صورت، .sh.edmode هنگام پردازش تله KEYBD تهی (null) است.
- .sh.edtext
- کاراکترهای موجود در بافر ورودی در زمان وقوع جدیدترین تله KEYBD هنگامی که تله KEYBD در حال پردازش نباشد، مقدار آن تهی است.
- .sh.file
- نام مسیر فایلی که شامل دستور فعلی است.
- .sh.fun
- نام تابع فعلی که در حال اجراست.
- .sh.level
- عمق تابع فعلی. این متغیر را میتوان درون یک تله DEBUG تغییر داد و با این کار بافتار (context) روی سطح مشخصشده تنظیم میشود.
- .sh.lineno
- در طول یک تله DEBUG روی شماره خط فراخواننده هر تابع تنظیم میشود.
- .sh.match
- یک آرایه اندیسی که جدیدترین تطابق و تطابقهای زیرالگو را پس از تطابقهای شرطی الگو و پس از گسترشهای متغیر با استفاده از عملگرهای #، % یا / ذخیره میکند. عنصر 0-ام تطابق کامل و عنصر i-ام i-امین زیرتطابق را ذخیره میکند. برای // آرایه دوبعدی است که در آن اندیس اول نشاندهنده جدیدترین تطابق و تطابق زیرالگو است و اندیس دوم نشان میدهد کدام تطابق مد نظر است که 0 نمایانگر اولین تطابق است. متغیر .sh.match هنگامی که به متغیر گسترشیافته مقدار جدیدی اختصاص یابد، حذف (unset) میشود.
- .sh.math
- برای تعریف توابع حسابی استفاده میشود (بخش Arithmetic evaluation در ادامه را ببینید) و فهرست توابع حسابی تعریفشده توسط کاربر را ذخیره میکند.
- .sh.name
- در زمان فراخوانی یک تابع دیسیپلین، روی نام متغیر تنظیم میشود.
- .sh.op_astbin
- دایرکتوری که چندین دستور توکار شل به آن متصل (bound) شدهاند. پیشفرض /opt/ast/bin است. هنگامی که مقدار آن /bin باشد، دستورات توکار بسته به اینکه فایل اجرایی در کجا پیدا شود به /bin یا /usr/bin متصل خواهند شد. این متغیر را میتوان با گنجاندن آن در متغیر SH_OPTIONS تنظیم کرد.
- .sh.pgrp
- گروه پردازه (process group) فعلی این شل.
- .sh.pwdfd
- شماره توصیفکننده فایل (file descriptor) برای دایرکتوری کاری جاری.
- .sh.sig
- هنگام اجرای یک تله، روی اطلاعات موجود در ساختار siginfo_t تنظیم میشود (برای توضیحات این ساختار به siginfo(2) مراجعه کنید).
- .sh.subscript
- در زمان فراخوانی یک تابع دیسیپلین، روی نام اندیس متغیر تنظیم میشود.
- .sh.subshell
- عمق فعلی برای زیرشلها و جایگزینی دستور.
- .sh.value
- در زمان فراخوانی تابع دیسیپلین set یا append، روی مقدار متغیر تنظیم میشود. هنگامی که یک تابع حسابی تعریفشده توسط کاربر فراخوانی میشود، مقدار .sh.value ذخیره شده و .sh.value روی ممیز شناور با دقت مضاعف طولانی (long double precision) تنظیم میشود. با بازگشت تابع، .sh.value به حالت قبل بازگردانده میشود.
- .sh.version
- روی مقداری تنظیم میشود که نسخه این شل را مشخص میکند.
- KSH_VERSION
- یک ارجاع نامی (name reference) به .sh.version.
- LINENO
- شماره خط جاری در اسکریپت یا تابع در حال اجرا.
- OLDPWD
- دایرکتوری کاری قبلی که توسط دستور cd تنظیم شده است.
- OPTARG
- مقدار آخرین آرگومان گزینه که توسط دستور توکار getopts پردازش شده است.
- OPTIND
- اندیس آخرین آرگومان گزینه که توسط دستور توکار getopts پردازش شده است.
- PPID
- شماره پردازه والد شل.
- PWD
- دایرکتوری کاری جاری که توسط دستور cd تنظیم شده است.
- RANDOM
- هر بار که به این متغیر ارجاع داده شود، یک عدد صحیح تصادفی با توزیع یکنواخت بین 0 و 32767 تولید میشود. توالی اعداد تصادفی را میتوان با انتساب یک مقدار عددی به RANDOM مقداردهی اولیه کرد.
- REPLY
- این متغیر توسط عبارت select و توسط دستور توکار read در صورتی که هیچ آرگومانی ارائه نشده باشد تنظیم میشود.
- SECONDS
- هر بار که به این متغیر ارجاع داده شود، تعداد ثانیههای سپریشده از زمان فراخوانی شل بازگردانده میشود. اگر به این متغیر مقداری اختصاص یابد، مقدار بازگرداندهشده در هنگام ارجاع برابر با مقدار اختصاصیافته به علاوه تعداد ثانیههای سپریشده از زمان انتساب خواهد بود.
- SHLVL
- یک متغیر عدد صحیح که با هر بار فراخوانی شل افزایش یافته و صادر (export) میشود. اگر هنگام فراخوانی شل، SHLVL در محیط وجود نداشته باشد، روی 1 تنظیم میشود.
متغیرهای زیر توسط شل استفاده میشوند:
- CDPATH
- مسیر جستجو برای دستور cd.
- COLUMNS
- در صورت تنظیم بودن این متغیر، مقدار آن برای تعیین عرض پنجره ویرایش در حالتهای ویرایش شل و برای چاپ فهرستهای select استفاده میشود.
- EDITOR
- اگر متغیر VISUAL تنظیم نشده باشد، مقدار این متغیر بر اساس الگوهای شرحدادهشده در VISUAL در زیر بررسی میشود و گزینه ویرایشی متناظر (بخش دستور ویژه set در ادامه را ببینید) فعال خواهد شد.
- ENV
- اگر این متغیر تنظیم شده باشد، گسترش پارامتر، جایگزینی دستور و جایگزینی حسابی روی مقدار آن انجام میشود تا نام مسیر اسکریپتی تولید شود که در هنگام فراخوانی تعاملی شل اجرا خواهد شد (بخش Invocation در ادامه را ببینید). این فایل معمولاً برای تعریف alias و function استفاده میشود. مقدار پیشفرض $HOME/.kshrc است. در سیستمهایی که از فایل راهاندازی سراسری سیستم /etc/ksh.kshrc پشتیبانی میکنند، اگر نام فایل تولیدشده از گسترش ENV با /./ یا ././ آغاز شود، فایل راهاندازی سراسری سیستم اجرا نخواهد شد.
- FCEDIT
- نام منسوخشده برای نام ویرایشگر پیشفرض در دستور hist. در صورت تنظیم بودن HISTEDIT از FCEDIT استفاده نمیشود.
- FIGNORE
- الگویی که مجموعهای از نامهای فایل را تعریف میکند که هنگام تطابق نام فایل نادیده گرفته میشوند.
- FPATH
- مسیر جستجو برای تعاریف توابع. هنگامی که به تابعی با ویژگی -u ارجاع داده شود و هنگامی که دستوری پیدا نشود، دایرکتوریهای موجود در این مسیر برای یافتن فایلی همنام با تابع یا دستور جستجو میشوند. اگر یک فایل اجرایی با نام آن دستور پیدا شود، خوانده شده و در محیط جاری اجرا میگردد. برخلاف PATH، دایرکتوری جاری باید به صورت صریح با . نشان داده شود، نه با کاراکترهای : مجاور یا : در ابتدا یا انتها.
- HISTCMD
- شماره دستور جاری در فایل تاریخچه.
- HISTEDIT
- نام ویرایشگر پیشفرض برای دستور hist.
- HISTFILE
- اگر این متغیر هنگام فراخوانی شل تنظیم شده باشد، مقدار آن نام مسیر فایلی است که برای ذخیره تاریخچه دستورات استفاده خواهد شد (بخش Command Re-entry در ادامه را ببینید).
- HISTSIZE
- اگر این متغیر هنگام فراخوانی شل تنظیم شده باشد، تعداد دستورات واردشده قبلی که برای این شل قابل دسترس هستند، بزرگتر یا مساوی این عدد خواهد بود. پیشفرض 512 است.
- HOME
- آرگومان پیشفرض (دایرکتوری خانگی) برای دستور cd.
- IFS
- جداکنندههای فیلد داخلی (Internal field separators)، معمولاً space، tab و new-line که برای جداسازی نتایج جایگزینی دستور یا گسترش پارامتر و جداسازی فیلدها با دستور توکار read استفاده میشوند. اولین کاراکتر متغیر IFS برای جداسازی آرگومانها در جایگزینی "$*" استفاده میشود (بخش Quoting در ادامه را ببینید). هر رخداد تکی از یک کاراکتر IFS در رشتهای که باید تفکیک شود، که در کلاس کاراکتری isspace نباشد، و هر کاراکتر مجاور در IFS که در کلاس کاراکتری isspace باشد، مرز یک فیلد را مشخص میکند. یک یا چند کاراکتر در IFS که متعلق به کلاس کاراکتری isspace باشند، مرز یک فیلد را تعیین میکنند. علاوه بر این، اگر همان کاراکتر isspace به طور متوالی درون IFS، ظاهر شود، با این کاراکتر به گونهای رفتار میشود که گویی در کلاس isspace نیست؛ بنابراین اگر IFS شامل دو کاراکتر tab باشد، دو کاراکتر مجاور tab مرز یک فیلد تهی (null) را تعیین میکنند.
- JOBMAX
- این متغیر حداکثر تعداد کارهای پسزمینه در حال اجرا را تعریف میکند که میتوانند همزمان اجرا شوند. هنگامی که این محدودیت حاصل شود، شل قبل از شروع یک کار جدید منتظر تکمیل یک کار میماند.
- LANG
- این متغیر دسته محلی (locale category) را برای هر دستهای که به طور خاص با متغیری که با LC_ یا LANG آغاز میشود انتخاب نشده باشد، تعیین میکند.
- LC_ALL
- این متغیر مقدار متغیر LANG و هر متغیر دیگر LC_ را لغو (override) میکند.
- LC_COLLATE
- این متغیر دسته محلی را برای اطلاعات تطبیق و مرتبسازی کاراکترها (collation) تعیین میکند.
- LC_CTYPE
- این متغیر دسته محلی را برای توابع مدیریت کاراکتر تعیین میکند. این متغیر کلاسهای کاراکتری را برای تطابق الگو تعیین مینماید (بخش File Name Generation در ادامه را ببینید).
- LC_NUMERIC
- این متغیر دسته محلی را برای کاراکتر ممیز اعشاری تعیین میکند.
- LINES
- در صورت تنظیم بودن این متغیر، مقدار آن برای تعیین طول ستون در چاپ فهرستهای select استفاده میشود. فهرستهای انتخابی به صورت عمودی چاپ میشوند تا حدود دو سوم خطوط LINES پر شود.
- اگر این متغیر روی نام یک فایل نامه تنظیم شده باشد و متغیر MAILPATH تنظیم نشده باشد، شل کاربر را از رسیدن نامه در فایل مشخصشده مطلع میسازد.
- MAILCHECK
- این متغیر مشخص میکند که شل هر چند وقت یکبار (به ثانیه) تغییرات زمان ویرایش هر یک از فایلهای مشخصشده توسط متغیرهای MAILPATH یا MAIL را بررسی کند. مقدار پیشفرض 600 ثانیه است. هنگامی که زمان سپری شد، شل قبل از صدور اعلان (prompt) بعدی بررسی را انجام میدهد.
- MAILPATH
- فهرستی از نامهای فایل که با دونقطه ( : ) جدا شدهاند. اگر این متغیر تنظیم شده باشد، شل کاربر را از هرگونه تغییری در فایلهای مشخصشده که در طول آخرین MAILCHECK ثانیه رخ داده باشد مطلع میکند. پس از هر نام فایل میتواند یک ? و پیامی که باید چاپ شود قرار گیرد. روی پیام گسترش پارامتر، جایگزینی دستور و جایگزینی حسابی انجام خواهد شد که در آن متغیر $_ به عنوان نام فایلی که تغییر کرده است تعریف میشود. پیام پیشفرض you have mail in $_ است.
- PATH
- مسیر جستجو برای دستورات (بخش Execution در ادامه را ببینید). کاربر نمیتواند PATH را در صورت اجرا تحت rksh تغییر دهد (به جز در .profile).
- PS1
- مقدار این متغیر برای گسترش پارامتر، جایگزینی دستور و جایگزینی حسابی گسترش مییابد تا رشته اعلان اصلی (primary prompt string) را تعریف کند که به طور پیشفرض ``$ '' است. کاراکتر ! در رشته اعلان اصلی با شماره command جایگزین میشود (بخش Command Re-entry در ادامه را ببینید). دو رخداد پیاپی از ! یک علامت ! منفرد را هنگام چاپ رشته اعلان تولید میکند.
- PS2
- رشته اعلان ثانویه، به طور پیشفرض ``> ''.
- PS3
- رشته اعلان انتخاب که درون یک حلقه select استفاده میشود، به طور پیشفرض ``#? ''.
- PS4
- مقدار این متغیر برای ارزیابی پارامتر، جایگزینی دستور و جایگزینی حسابی گسترش مییابد و پیش از هر خط از ردگیری اجرا (execution trace) قرار میگیرد. به طور پیشفرض، PS4 برابر ``+ '' است. علاوه بر این هنگامی که PS4 تنظیم نشده باشد، اعلان ردگیری اجرا نیز ``+ '' خواهد بود.
- SH_OPTIONS
- مقدار آن شامل کلمات name=value است که با فاصله جدا شدهاند. به ازای هر name که نام یک گزینه شناختهشده باشد، به متغیر .sh.opt_name مقدار value اختصاص داده میشود. در حال حاضر تنها نام گزینه معتبر astbin است.
- SHELL
- نام مسیر shell در محیط نگهداری میشود. در هنگام فراخوانی، اگر نام پایه (basename) این متغیر rsh، rksh یا krsh باشد، شل به حالت محدود (restricted) درمیآید. اگر pfsh یا pfksh باشد، شل به یک شل پروفایل تبدیل میشود (به pfexec(1) مراجعه کنید).
- TIMEFORMAT
- مقدار این پارامتر به عنوان یک رشته فرمت استفاده میشود که مشخص میکند اطلاعات زمانبندی برای خطوط لولهای (pipelines) که با کلمه کلیدی رزروشده time پیشوند شدهاند چگونه باید نمایش داده شود. کاراکتر % یک توالی فرمت را معرفی میکند که به مقدار زمان یا سایر اطلاعات گسترش مییابد. توالیهای فرمت و معانی آنها به شرح زیر است:
- %%
- یک کاراکتر لفظی %.
- %[p][l]R
- زمان سپریشده به ثانیه.
- %[p][l]U
- تعداد ثانیههای CPU سپریشده در حالت کاربر (user mode).
- %[p][l]S
- تعداد ثانیههای CPU سپریشده در حالت سیستم (system mode).
- %[p][l]C
- تعداد کل ثانیههای CPU؛ یعنی مجموع زمان سپریشده در حالت کاربر به علاوه حالت سیستم.
- %P
- درصد CPU (یعنی میزان استفاده از پردازنده)، محاسبهشده به صورت C / R.
- براکتها نشاندهنده بخشهای اختیاری هستند. مقدار اختیاری p یک رقم است که دقت (تعداد ارقام اعشاری بعد از نقطه اعشار) را مشخص میکند. مقدار 0 باعث میشود هیچ ممیز یا بخش اعشاری خروجی داده نشود. حداکثر سه رقم بعد از ممیز قابل نمایش است؛ مقادیر p بزرگتر از 3 به عنوان 3 در نظر گرفته میشوند. اگر p مشخص نشود، مقدار 3 استفاده میشود.
- گزینه اختیاری l یک فرمت طولانیتر را مشخص میکند، شامل ساعت در صورت بزرگتر بودن از صفر، دقیقه و ثانیه به فرم HHhMMmSS.FFs. مقدار p مشخص میکند که آیا بخش اعشاری گنجانده شود یا خیر.
- سایر کاراکترها بدون تغییر خروجی داده شده و یک خط جدید به انتها اضافه میشود. در صورت عدم تنظیم، مقدار پیشفرض، $'\nreal\t%2lR\nuser\t%2lU\nsys%2lS'، استفاده میشود. اگر مقدار تهی باشد، هیچ اطلاعات زمانبندی نمایش داده نمیشود.
- TMOUT
- اگر روی مقداری بزرگتر از صفر تنظیم شود، TMOUT مقدار مهلت زمانی (timeout) پیشفرض برای دستور توکار read خواهد بود. دستور مرکب select هنگامی که ورودی از ترمینال باشد پس از TMOUT ثانیه خاتمه مییابد. در غیر این صورت، اگر خطی در مدت ثانیههای تعیینشده در حین خواندن از ترمینال وارد نشود، شل خاتمه مییابد. (توجه داشته باشید که شل را میتوان با یک حد بالا برای این مقدار کامپایل کرد که نمیتوان از آن فراتر رفت).
- VISUAL
- اگر مقدار این متغیر با الگوی *[Vv][Ii]* تطابق داشته باشد، گزینه vi (بخش دستور ویژه set در ادامه را ببینید) فعال میشود. اگر مقدار با الگوی *gmacs* تطابق داشته باشد، گزینه gmacs فعال میگردد. اگر مقدار با الگوی *macs* تطابق داشته باشد، گزینه emacs فعال خواهد شد. مقدار VISUAL بر مقدار EDITOR اولویت دارد.
شل مقادیر پیشفرضی به متغیرهای PATH، PS1، PS2، PS3، PS4، MAILCHECK، FCEDIT، TMOUT و IFS میدهد، در حالی که متغیرهای HOME، SHELL، ENV و MAIL اصلاً توسط شل مقداردهی نمیشوند (اگرچه HOME توسط login(1) تنظیم میشود). در برخی سیستمها MAIL و SHELL نیز توسط login(1) تنظیم میشوند..SS "تفکیک فیلدها (Field Splitting)" پس از گسترش پارامتر و جایگزینی دستور، نتایج جایگزینیها برای یافتن نویسههای جداکننده فیلد (نویسههای موجود در IFS) بررسی شده و در محل این نویسهها به فیلدهای مجزا تفکیک میشوند. فیلدهای تهی صریح ("" یا ′′) حفظ میشوند. فیلدهای تهی ضمنی (آنهایی که از پارامترهای فاقد مقدار یا جایگزینیهای دستور بدون خروجی حاصل میشوند) حذف میگردند.
اگر گزینه braceexpand (-B) تنظیم شده باشد، آنگاه هر یک از فیلدهای حاصل از IFS بررسی میشوند تا مشخص شود آیا حاوی یک یا چند الگو از الگوهای آکولاد {*,*}، {l1..l2} ، {n1..n2} ، {n1..n2% fmt} ، {n1..n2 ..n3} ، یا {n1..n2 ..n3%fmt} هستند یا خیر؛ که در آن * نشاندهنده هر نویسهای است، l1،l2 حروف الفبا هستند، n1،n2،n3 اعدادی دارای علامت هستند و fmt یک قالب مشخصشده مطابق با کاربرد printf است. در هر مورد، فیلدها با پیشوند کردن نویسههای قبل از { و پسوند کردن نویسههای بعد از } به هر یک از رشتههای تولیدشده توسط نویسههای میان { و } ایجاد میشوند. فیلدهای حاصل مجدداً بررسی میشوند تا در صورت وجود الگوهای آکولادی دیگر پردازش شوند.
در حالت اول، یک فیلد برای هر رشته میان { و ,، میان , و ,، و میان , و } ایجاد میشود. رشته نشاندادهشده با * میتواند شامل { و } متناظر درونسازیشده بدون نیاز به نقلقول باشد. در غیر این صورت، هر { و } همراه با * باید نقلقول شود.
در حالت دوم، l1 و l2 هر دو باید یا نویسههای بزرگ باشند یا هر دو نویسههای کوچک در لوکال C باشند. در این حالت یک فیلد برای هر نویسه از l1 تا l2 ایجاد میشود.
در حالتهای باقیمانده، یک فیلد برای هر عدد با شروع از n1 و ادامهیافتن تا رسیدن به n2 با افزایش n1 به اندازه n3 ایجاد میشود. در مواردی که n3 مشخص نشده باشد، رفتار بهگونهای است که گویی n3 برابر با 1 است اگر n1<=n2 باشد، و در غیر این صورت -1 خواهد بود. در حالتهایی که %fmt را مشخص میکنند، میتوان هرگونه فلگهای قالب، عرض و دقت را تعیین کرد و fmt میتواند به هر یک از مشخصکنندههای cdiouxX ختم شود. برای مثال، {a,z}{1..5..3%02d}{b..c}x به ۸ فیلد زیر گسترش مییابد: a01bx، a01cx، a04bx، a04cx، z01bx، z01cx، z04bx و z4cx.
تولید نام فایل (File Name Generation)
پس از تفکیک، هر فیلد برای یافتن نویسههای *، ?، (، و [ بررسی میشود، مگر اینکه گزینه -f تنظیم شده باشد. اگر یکی از این نویسهها وجود داشته باشد، آنگاه آن کلمه به عنوان یک الگو در نظر گرفته میشود. هر بخش از نام فایل که شامل هر نویسه الگویی باشد، با مجموعهای از نامهای مرتبشده بر اساس حروف الفبا (واژهنگاری) که با الگو مطابقت دارند از آن دایرکتوری جایگزین میشود. اگر هیچ نام فایلی که با الگو مطابقت داشته باشد پیدا نشود، آن بخش از نام فایل دستنخورده باقی میماند مگر اینکه الگو با پیشوند ∼(N) همراه باشد که در این صورت مطابق توضیحات زیر حذف میگردد. اگر FIGNORE تنظیم شده باشد، هر جزء از نام فایل که با الگوی تعریفشده توسط مقدار FIGNORE مطابقت داشته باشد، هنگام تولید نام فایلهای منطبق نادیده گرفته میشود. نامهای . و .. نیز نادیده گرفته میشوند. اگر FIGNORE تنظیم نشده باشد، نویسه . در ابتدای هر بخش از نام فایل نادیده گرفته خواهد شد، مگر اینکه اولین نویسه الگوی مربوط به این بخش، خود نویسه . باشد. توجه داشته باشید که در سایر کاربردهای تطبیق الگو، با / و . بهطور ویژه برخورد نمیشود.
- *
- با هر رشتهای، از جمله رشته تهی، مطابقت دارد. هنگام استفاده برای گسترش نام فایل، اگر گزینه globstar روشن باشد، یک الگوی مجزا از دو * مجاور با تمام فایلها و صفر یا چند دایرکتوری و زیردایرکتوری مطابقت خواهد داشت. اگر پس از آن یک / بیاید، فقط دایرکتوریها و زیردایرکتوریها مطابقت خواهند داشت.
- ?
- با هر تکنویسهای مطابقت دارد.
- [...]
- با هر یک از
نویسههای
محصورشده
مطابقت
دارد. یک
جفت نویسه
که با - از
هم جدا
شدهاند،
با هر
نویسهای
که از نظر
واژهنگاری
میان این
جفت قرار
دارد (شامل
خود آنها)
مطابقت
دارد. اگر
نخستین
نویسه پس از
[ ابتدایی
یک ! یا ^
باشد،
آنگاه با
هر
نویسهای
که درون
براکت
نباشد
مطابقت
داده
میشود. یک
- میتواند
با قرار
گرفتن به
عنوان
نخستین یا
آخرین
نویسه، در
مجموعه
نویسهها
گنجانده
شود.
درون [ و ]، کلاسهای نویسه را میتوان با ساختار [:class:] مشخص کرد که در آن class یکی از کلاسهای زیر تعریفشده در استاندارد ANSI-C است: (توجه داشته باشید که word معادل alnum به علاوه نویسه _ است.)
alnum alpha blank cntrl digit graph lower print punct space upper word xdigit
درون [ و ]، یک کلاس همارزی را میتوان با ساختار [=c=] مشخص کرد که با تمامی نویسههای دارای وزن مرتبسازی اولیه یکسان (بر اساس تعریف لوکال فعلی) با نویسه c مطابقت دارد. درون [ و ]، [.symbol.] با نماد مرتبسازی symbol مطابقت دارد.
- ?(pattern-list)
- بهصورت اختیاری با هر یک از الگوهای ارائهشده مطابقت دارد.
- *(pattern-list)
- با صفر یا چند بار تکرار الگوهای دادهشده مطابقت دارد.
- +(pattern-list)
- با یک یا چند بار تکرار الگوهای دادهشده مطابقت دارد.
- {n}(pattern-list)
- با n بار تکرار الگوهای دادهشده مطابقت دارد.
- {m,n}(pattern-list)
- از m تا n بار تکرار الگوهای دادهشده را مطابقت میدهد. اگر m حذف شود، از 0 استفاده خواهد شد. اگر n حذف شود، حداقل m بار تکرار مطابقت داده میشود.
- @(pattern-list)
- دقیقاً با
یکی از
الگوهای
دادهشده
مطابقت
دارد.
- !(pattern-list)
- با هر چیزی به جز یکی از الگوهای دادهشده مطابقت دارد.
هنگامی که pattern-list درون پرانتز قرار گیرد، نویسه بکاسلش \ حتی در داخل یک کلاس نویسه نیز به صورت ویژه پردازش میشود. تمام توالیهای گریز نویسه ANSI-C شناخته میشوند و با نویسه مشخصشده مطابقت دارند. علاوه بر این، توالیهای گریز زیر نیز شناسایی میشوند:
الگویی به شکل %(pattern-pair(s)) یک زیرالگو است که میتواند برای مطابقت با عبارات نویسهای تودرتو استفاده شود. هر pattern-pair یک توالی دونویسهای است که نمیتواند شامل & یا ⎪ باشد. نخستین pattern-pair نویسههای شروع و پایان را برای تطابق مشخص میکند. هر pattern-pair بعدی نشاندهنده نویسههای شروع و پایان یک گروه تودرتو است که هنگام شمارش تطابقهای نویسه شروع و پایان نادیده گرفته (رد) میشود. رفتار زمانی که نخستین نویسه یک pattern-pair حرفیعددی باشد نامشخص است، به جز در موارد زیر:
- D
- باعث میشود نویسه پایانی، جستجو برای این الگو را بدون یافتن تطابق خاتمه دهد.
- E
- باعث میشود نویسه پایانی به عنوان یک نویسه گریز (escape) تفسیر شود.
- L
- باعث میشود نویسه پایانی به عنوان یک نویسه نقلقول تفسیر شود و موجب شود تمام نویسهها هنگام جستجو برای تطابق نادیده گرفته شوند.
- Q
- باعث میشود نویسه پایانی به عنوان یک نویسه نقلقول تفسیر شود و موجب شود تمام نویسهها به جز هر نویسه گریز هنگام جستجو برای تطابق نادیده گرفته شوند.
هر زیرالگو در یک الگوی ترکیبی، با شروع از ۱، بر اساس مکان ( درون الگو شمارهگذاری میشود. توالی \n، که در آن n یک تکرقم است و \n پس از زیرالگوی n-ام میآید، با همان رشتهای که خود زیرالگو مطابقت داده بود، مطابقت مییابد.
در نهایت یک الگو میتواند شامل زیرالگوهایی به شکل ∼(options:pattern-list) باشد که در آن هر یک از options یا :pattern-list میتوانند حذف شوند. برخلاف سایر الگوهای ترکیبی، این زیرالگوها در شمارش زیرالگوهای شمارهگذاریشده محاسبه نمیشوند. بخش :pattern-list برای گزینههای F، G، N و V در زیر باید حذف شود. اگر options وجود داشته باشد، میتواند شامل یک یا چند مورد از گزینههای زیر باشد:
- +
- فعالسازی گزینههای زیر. این حالت پیشفرض است.
- -
- غیرفعالسازی گزینههای زیر.
- E
- باقیمانده الگو از ساختار عبارات منظم گسترشیافته (Extended Regular Expression) مشابه دستور egrep(1) استفاده میکند.
- F
- باقیمانده الگو از ساختار عبارات fgrep(1) استفاده میکند.
- G
- باقیمانده الگو از ساختار عبارات منظم پایه (Basic Regular Expression) مشابه دستور grep(1) استفاده میکند.
- K
- باقیمانده الگو از ساختار الگوی پوسته استفاده میکند. این حالت پیشفرض است.
- N
- این گزینه نادیده گرفته میشود. با این حال، هنگامی که نخستین حرف باشد و همراه با تولید نام فایل به کار رود، و هیچ تطابقی رخ ندهد، الگوی فایل به رشته تهی گسترش مییابد.
- X
- باقیمانده الگو از ساختار عبارات منظم افزوده مشابه دستور xgrep(1) استفاده میکند.
- P
- باقیمانده الگو از ساختار عبارات منظم perl(1) استفاده میکند. در حال حاضر تمام ساختارهای عبارات منظم پرل پیادهسازی نشدهاند.
- V
- باقیمانده الگو از ساختار عبارات منظم System V استفاده میکند.
- i
- تطابق الگو را بدون حساسیت به حروف بزرگ و کوچک در نظر میگیرد.
- g
- طولانیترین تطابق ممکن را پیدا میکند (حریصانه یا greedy). این حالت پیشفرض است.
- l
- الگو را از سمت چپ مهار (anchor) میکند. این حالت پیشفرض برای الگوهای به سبک K است.
- r
- الگو را از سمت راست مهار (anchor) میکند. این حالت پیشفرض برای الگوهای به سبک K است.
نقلقول (Quoting)
هر یک از فرانویسهها (metacharacters) که پیشتر فهرست شدند (بخش تعاریف (Definitions) در بالا را ببینید) برای پوسته معنای ویژهای دارند و باعث خاتمه یافتن یک کلمه میشوند مگر اینکه نقلقول شوند. یک نویسه میتواند با قرار گرفتن یک \ پیش از آن نقلقول شود (یعنی نمایانگر خود نویسه باشد). جفت \new-line (بکاسلش و خط جدید) حذف میشود. تمام نویسههای محصور میان یک جفت علامت نقلقول تکی (تککوتیشن) (′′) که قبل از آن یک $ نیامده باشد، نقلقول میشوند. علامت تککوتیشن نمیتواند درون تککوتیشنها ظاهر شود. یک رشته نقلقولشده تکی که قبل از آن یک $ بدون نقلقول آمده باشد، به عنوان یک رشته ANSI-C پردازش میشود، به استثنای موارد زیر:
- \0
- باعث میشود باقیمانده رشته نادیده گرفته شود.
- \E
- معادل نویسه گریز یا escape (اسکی 033)،
- \e
- معادل نویسه گریز یا escape (اسکی 033)،
- \cx
- به نویسه کنترل-x گسترش مییابد.
- \C[.name.]
- به عنصر مرتبسازی name گسترش مییابد.
درون علامتهای نقلقول دوتایی (دابلکوتیشن) ("")، گسترش پارامتر و جایگزینی دستور انجام میشود و \ نویسههای \، `، " و $ را نقلقول میکند. یک $ در جلوی یک رشته با نقلقول دوتایی، در لوکال "C" یا "POSIX" نادیده گرفته میشود، و در غیر این صورت ممکن است باعث جایگزینی رشته با یک رشته مخصوص لوکال گردد. معنای $* و $@ هنگامی که نقلقول نشده باشند یا زمانی که به عنوان مقدار انتساب متغیر یا به عنوان نام فایل به کار روند یکسان است. با این حال، هنگام استفاده به عنوان آرگومان دستور، "$*" معادل است با "$1d$2d..."، که در آن d نخستین نویسه متغیر IFS است، در حالی که "$@" معادل است با "$1" "$2" .... درون علامتهای بکتیک (grave quote) (``)، \ نویسههای \، ` و $ را نقلقول میکند. اگر بکتیکها درون نقلقول دوتایی قرار گیرند، آنگاه \ نویسه " را نیز نقلقول میکند.
معنای ویژه کلمات کلیدی رزروشده یا نامهای مستعار را میتوان با نقلقول کردن هر نویسهای از آن کلمه رزروشده حذف کرد. تشخیص نامهای توابع یا نام دستورات داخلی فهرستشده در زیر با نقلقول کردن آنها تغییر نمیکند.
ارزیابی محاسباتی (Arithmetic Evaluation)
پوسته، ارزیابی محاسباتی را برای جایگزینی محاسباتی، ارزیابی یک دستور محاسباتی، ارزیابی زیرنویس آرایه اندیسدار، و ارزیابی آرگومانهای دستورات داخلی shift و let انجام میدهد. ارزیابیها با استفاده از محاسبات ممیز شناور با دقت مضاعف (double precision) یا ممیز شناور با دقت مضاعف طولانی (long double) برای سیستمهایی که این نوع داده را ارائه میدهند انجام میشود. ثابتهای ممیز شناور از قواعد ممیز شناور زبان برنامهنویسی ANSI-C پیروی میکنند. ثابتهای ممیز شناور Nan و Inf میتوانند به ترتیب برای نشان دادن "غیر عدد" (not a number) و بینهایت استفاده شوند. ثابتهای عدد صحیح از قواعد ثابتهای عدد صحیح زبان برنامهنویسی ANSI-C پیروی میکنند، اگرچه تنها ثابتهای نویسهای تکبایتی شناسایی میشوند و تبدیل نوع (cast) نویسهای پشتیبانی نمیشود. علاوه بر این، ثابتها میتوانند به شکل [base#]n باشند که در آن base یک عدد دهدهی میان ۲ تا ۶۴ است که مبنای محاسباتی را نشان میدهد و n عددی در آن مبنا است. ارقام بالاتر از ۹ به ترتیب با حروف کوچک، حروف بزرگ، @ و _ نشان داده میشوند. برای مبناهای کمتر یا مساوی ۳۶، نویسههای بزرگ و کوچک را میتوان به جای یکدیگر استفاده کرد.
یک عبارت محاسباتی از همان ساختار، اولویت و شرکتپذیری عبارات در زبان C استفاده میکند. تمام عملگرهای زبان C که برای مقادیر ممیز شناور به کار میروند قابل استفاده هستند. علاوه بر این، عملگر ** میتواند برای توانرسانی استفاده شود. این عملگر اولویت بالاتری نسبت به ضرب دارد و شرکتپذیر از چپ است. همچنین هنگامی که مقدار یک متغیر محاسباتی یا زیرعبارت بتواند به عنوان یک عدد صحیح بلند (long integer) نمایش داده شود، تمام عملیات محاسباتی عدد صحیح زبان C قابل انجام است. متغیرها را میتوان با نام آنها در یک عبارت محاسباتی بدون استفاده از ساختار گسترش پارامتر ارجاع داد. هنگامی که به یک متغیر ارجاع داده میشود، مقدار آن به عنوان یک عبارت محاسباتی ارزیابی میگردد.
هر یک از توابع ریاضی زیر که در کتابخانه ریاضی C موجود هستند میتوانند درون یک عبارت محاسباتی استفاده شوند:
abs acos acosh asin asinh atan atan2 atanh cbrt ceil copysign cos cosh erf erfc exp exp2 expm1 fabs fdim finite floor fma fmax fmin fmod hypot ilogb int isfinite sinf isnan isnormal issubnormal issubordered iszero j0 j1 jn lgamma log log10 log2 logb nearbyint pow remainder rint round scanb signbit sin sinh sqrt tan tanh tgamma trunc y0 y1 yn علاوه بر این، توابع محاسباتی را میتوان به عنوان توابع پوسته با گونهای از ساختار function name تعریف کرد:
- function .sh.math.name ident ... { list ;}
- که در آن name نام تابع مورد استفاده در عبارت محاسباتی است. اگر آرگومان فراخوانی متناظر با ident نام یک متغیر آرایهای باشد، آنگاه ident یک ارجاع نامی (name reference) به این آرایه است. در غیر این صورت، ident یک ارجاع به متغیر ممیز شناور با دقت مضاعف طولانی (long double) حاوی مقدار دریافتی از فراخواننده است. مقدار .sh.value هنگام بازگشت تابع، مقدار این تابع خواهد بود. توابع تعریفشده توسط کاربر میتوانند حداکثر ۳ آرگومان دریافت کرده و جایگزین توابع کتابخانه ریاضی C شوند.
یک نمایش داخلی از یک متغیر به عنوان ممیز شناور با دقت مضاعف را میتوان با گزینه -E [n]، -F [n]، یا -X [n] از دستور داخلی ویژه typeset تعیین کرد. گزینه -E باعث میشود که هنگام گسترش مقدار، با نمادگذاری علمی نمایش داده شود. آرگومان اختیاری گزینه n تعداد ارقام بامعنی را مشخص میکند. گزینه -F باعث میشود که هنگام گسترش مقدار، به عنوان یک عدد دهدهی ممیز شناور نمایش داده شود. گزینه -X باعث میشود که گسترش با استفاده از قالب %a تعریفشده در ISO C-99 نمایش داده شود. آرگومان اختیاری گزینه n در این حالت تعداد ارقام بعد از ممیز (یا نقطه مبنا) را مشخص میکند.
یک نمایش داخلی عدد صحیح از یک متغیر را میتوان با گزینه -i [n] از دستور داخلی ویژه typeset تعیین کرد. آرگومان اختیاری گزینه n مبنای محاسباتی مورد استفاده هنگام گسترش متغیر را مشخص میکند. اگر مبنای محاسباتی را تعیین نکنید، مبنای ۱۰ استفاده خواهد شد.
ارزیابی محاسباتی روی مقدار هر انتساب به یک متغیر دارای ویژگی -E، -F، -X یا -i انجام میشود. انتساب یک عدد ممیز شناور به متغیری که نوع آن عدد صحیح است باعث حذف بخش اعشاری (قطع شدن) میشود.
درون یک عبارت محاسباتی، تمام متغیرهای عدد صحیح و ممیز شناور میتوانند با .MIN، .MAX یا .DIG دنبال شوند تا بیشترین مقدار، کمترین مقدار یا تعداد ارقام بامعنی برای متغیرهای آن نوع را ارائه دهند.
متغیرهای ممیز شناور همچنین میتوانند با .INT_MAX یا .INT_MIN دنبال شوند تا بزرگترین یا کوچکترین اعداد صحیح قابلنمایش توسط آن نوع را ارائه دهند.
متغیرهای ممیز شناور همچنین میتوانند با .EPSILON دنبال شوند تا فاصله تا عدد ممیز شناور بعدی از آن نوع را ارائه دهند. متغیرهای ممیز شناور میتوانند با MAX_10_EXP دنبال شوند تا بیشترین توان مبنای ۱۰ را که میتواند توسط آن نوع نمایش داده شود ارائه دهند.
درون یک عبارت محاسباتی، ثابتهای زیر شناخته میشوند و از نوع typeset-lE هستند:
مرتبسازی آرایهها (Array Sorting)
گزینه -s در دستور توکار set میتواند برای مرتبسازی آرگومانهای آن یا مرتبسازی آرایههای شاخصدار، آرایههای شاخصدار از متغیرهای ترکیبی و آرایههای شاخصدار از نوعها استفاده شود (بخش «متغیرهای نوع» در زیر را ببینید). بهطور پیشفرض، ترتیب مرتبسازی بر اساس محلیسازی (locale) جاری تعریف میشود. برای متغیرهای ترکیبی و برای نوعها، گزینه -K برای set میتواند با فهرستی از زیرفیلدها که با کاما از هم جدا شدهاند برای مرتبسازی دنبال شود. هر فیلد میتواند با یک : و حرف n برای مرتبسازی عددی و/یا r برای مرتبسازی معکوس دنبال شود. برای یک آرایه شاخصدار ساده، گزینه -K میتواند با :n و :r برای مرتبسازی عددی یا معکوس دنبال شود.
اعلان خط فرمان (Prompting)
هنگامی که پوسته به صورت تعاملی استفاده شود، پیش از خواندن یک دستور، با مقدار PS1 پس از بسط آن برای بسط پارامتر، جایگزینی دستور و جایگزینی حسابی، اعلان خط فرمان داده میشود. علاوه بر این، هر ! منفرد در اعلان با شماره دستور جایگزین میشود. یک !! برای قرار دادن ! در اعلان مورد نیاز است. اگر در هر زمان یک خط جدید تایپ شود و برای تکمیل یک دستور به ورودی بیشتری نیاز باشد، اعلان ثانویه (یعنی مقدار PS2) صادر میشود.
عبارات شرطی (Conditional Expressions)
یک عبارت شرطی با دستور ترکیبی [[ برای آزمودن ویژگیهای فایلها و مقایسه رشتهها استفاده میشود. تفکیک فیلد و تولید نام فایل روی کلمات بین [[ و ]] انجام نمیشود. هر عبارت میتواند از یک یا چند مورد از عبارات یکانی یا دوگانی زیر ساخته شود:
- string
- درست است اگر string تهی نباشد.
- -a file
- مشابه -e در زیر است. این گزینه منسوخ شده است.
- -b file
- درست است اگر file وجود داشته باشد و یک فایل ویژه بلوکی باشد.
- -c file
- درست است اگر file وجود داشته باشد و یک فایل ویژه کاراکتری باشد.
- -d file
- درست است اگر file وجود داشته باشد و یک دایرکتوری باشد.
- -e file
- درست است اگر file وجود داشته باشد.
- -f file
- درست است اگر file وجود داشته باشد و یک فایل معمولی باشد.
- -g file
- درست است اگر file وجود داشته باشد و بیت setgid آن تنظیم شده باشد.
- -k file
- درست است اگر file وجود داشته باشد و بیت چسبنده (sticky bit) آن تنظیم شده باشد.
- -n string
- درست است اگر طول string غیرصفر باشد.
- -o ?option
- درست است اگر گزینه با نام option یک نام گزینه معتبر باشد.
- -o option
- درست است اگر گزینه با نام option روشن باشد.
- -p file
- درست است اگر file وجود داشته باشد و یک فایل ویژه fifo یا یک لوله (pipe) باشد.
- -r file
- درست است اگر file وجود داشته باشد و توسط فرآیند جاری قابل خواندن باشد.
- -s file
- درست است اگر file وجود داشته باشد و اندازه آن بزرگتر از صفر باشد.
- -t fildes
- درست است اگر توصیفگر فایل شماره fildes باز بوده و مرتبط با یک دستگاه ترمینال باشد.
- -u file
- درست است اگر file وجود داشته باشد و بیت setuid آن تنظیم شده باشد.
- -v name
- درست است اگر متغیر name یک نام متغیر معتبر باشد و مقداردهی شده باشد.
- -w file
- درست است اگر file وجود داشته باشد و توسط فرآیند جاری قابل نوشتن باشد.
- -x file
- درست است اگر file وجود داشته باشد و توسط فرآیند جاری قابل اجرا باشد. اگر file وجود داشته باشد و یک دایرکتوری باشد، در صورتی درست است که فرآیند جاری مجوز جستجو در دایرکتوری را داشته باشد.
- -z string
- درست است اگر طول string صفر باشد.
- -L file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین باشد.
- -h file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین باشد.
- -N file
- درست است اگر file وجود داشته باشد و زمان آخرین تغییر آن بزرگتر از زمان آخرین دسترسی باشد.
- -O file
- درست است اگر file وجود داشته باشد و مالک آن شناسه کاربری مؤثر این فرآیند باشد.
- -G file
- درست است اگر file وجود داشته باشد و گروه آن با شناسه گروه مؤثر این فرآیند مطابقت داشته باشد.
- -R name
- درست است اگر متغیر name یک ارجاع نام (name reference) باشد.
- -S file
- درست است اگر file وجود داشته باشد و یک سوکت باشد.
- file1 -nt file2
- درست است اگر file1 وجود داشته باشد و file2 وجود نداشته باشد، یا file1 جدیدتر از file2 باشد.
- file1 -ot file2
- درست است اگر file2 وجود داشته باشد و file1 وجود نداشته باشد، یا file1 قدیمیتر از file2 باشد.
- file1 -ef file2
- درست است اگر file1 و file2 وجود داشته باشند و به یک فایل یکسان اشاره کنند.
- string == pattern
- درست است اگر string با pattern مطابقت داشته باشد. هر بخشی از pattern میتواند نقلقول شود تا به عنوان یک رشته مطابقت داده شود. با یک تطابق موفق با الگو، متغیر آرایهای .sh.match شامل تطابق و زیرتطابقهای الگو خواهد بود.
- string = pattern
- مشابه == در بالا است، اما منسوخ شده است.
- string != pattern
- درست است اگر string با pattern مطابقت نداشته باشد. هنگامی که string با pattern مطابقت داشته باشد، متغیر آرایهای .sh.match شامل تطابق و زیرتطابقهای الگو خواهد بود.
- string =∼ ere
- درست است اگر string با الگوی ∼(E)ere مطابقت داشته باشد که در آن ere یک عبارت باقاعده گسترشیافته است.
- string1 < string2
- درست است اگر string1 بر اساس محلیسازی (locale) جاری پیش از string2 بیاید.
- string1 > string2
- درست است اگر string1 بر اساس محلیسازی (locale) جاری پس از string2 بیاید.
مقایسههای حسابی منسوخ زیر نیز مجاز هستند:
- exp1 -eq exp2
- درست است اگر exp1 برابر با exp2 باشد.
- exp1 -ne exp2
- درست است اگر exp1 برابر با exp2 نباشد.
- exp1 -lt exp2
- درست است اگر exp1 کوچکتر از exp2 باشد.
- exp1 -gt exp2
- درست است اگر exp1 بزرگتر از exp2 باشد.
- exp1 -le exp2
- درست است اگر exp1 کوچکتر یا مساوی exp2 باشد.
- exp1 -ge exp2
- درست است اگر exp1 بزرگتر یا مساوی exp2 باشد.
در هر یک از عبارات بالا، اگر file به فرم /dev/fd/n باشد که در آن n یک عدد صحیح است، آزمایش روی فایل بازی که توصیفگر فایل آن n است اعمال میشود.
یک عبارت ترکیبی میتواند از این عناصر اولیه با استفاده از هر یک از موارد زیر که به ترتیب اولویت نزولی فهرست شدهاند ساخته شود:
- (expression)
- درست است اگر expression درست باشد. برای گروهبندی عبارات استفاده میشود.
- ! expression
- درست است اگر expression نادرست باشد.
- expression1 && expression2
- درست است اگر هر دو عبارت expression1 و expression2 درست باشند.
- expression1 ⎪⎪ expression2
- درست است اگر حداقل یکی از expression1 یا expression2 درست باشد.
ورودی/خروجی (Input/Output)
پیش از اجرای یک دستور، ورودی و خروجی آن ممکن است با استفاده از یک نمادگذاری ویژه که توسط پوسته تفسیر میشود، تغییر مسیر داده شوند. موارد زیر ممکن است در هر کجای یک دستور ساده ظاهر شوند یا قبل و بعد از یک command قرار گیرند و به دستور فراخوانیشده ارسال نمیشوند . جایگزینی دستور، بسط پارامتر و جایگزینی حسابی پیش از استفاده از word یا digit رخ میدهند، مگر در مواردی که در زیر ذکر شده است. تولید نام فایل تنها در صورتی انجام میشود که پوسته تعاملی باشد و الگو فقط با یک فایل مطابقت داشته باشد. تفکیک فیلد انجام نمیشود.
در هر یک از تغییر مسیرهای زیر، اگر file به فرم /dev/sctp/host/port ، /dev/tcp/host/port یا /dev/udp/host/port باشد، که در آن host یک نام میزبان یا نشانی میزبان است و port یک سرویس با نام یا یک شماره پورت صحیح است، آنگاه تغییر مسیر تلاش میکند یک اتصال tcp ، sctp یا udp به سوکت متناظر برقرار کند.
هیچ فاصلهای بین کاراکترهای عملگرهای تغییر مسیر مجاز نیست.
- <word
- استفاده از فایل word به عنوان ورودی استاندارد (توصیفگر فایل 0).
- >word
- استفاده از فایل word به عنوان خروجی استاندارد (توصیفگر فایل 1). اگر فایل وجود نداشته باشد، ایجاد میشود. اگر فایل وجود داشته باشد و گزینه noclobber روشن باشد، این امر موجب خطا میشود؛ در غیر این صورت، طول آن به صفر کاهش مییابد (خالی میشود).
- >|word
- مشابه > است، با این تفاوت که بر گزینه noclobber غلبه میکند.
- >;word
- نوشتن خروجی در یک فایل موقت. اگر دستور با موفقیت به پایان برسد، نام آن به word تغییر مییابد، در غیر این صورت، فایل موقت حذف میشود. >;word نمیتواند با دستور توکار exec(2) استفاده شود.
- >>word
- استفاده از فایل word به عنوان خروجی استاندارد. اگر فایل وجود داشته باشد، خروجی به آن ضمیمه میشود (با رفتن اولیه به انتهای فایل)؛ در غیر این صورت، فایل ایجاد میشود.
- <>word
- باز کردن فایل word برای خواندن و نوشتن به عنوان ورودی استاندارد.
- <>;word
- مشابه <>word است، با این تفاوت که اگر دستور با موفقیت پایان یابد، اندازه word به آفست پایان دستور کوتاه میشود. <>;word نمیتواند با دستور توکار exec(2) استفاده شود.
- <<[-]word
- ورودی پوسته تا خطی خوانده میشود که پس از حذف نقلقولها همانند word باشد، یا تا انتهای فایل. هیچ جایگزینی پارامتر، جایگزینی دستور، جایگزینی حسابی یا تولید نام فایل روی word انجام نمیشود. سند حاصل که here-document نامیده میشود، به ورودی استاندارد تبدیل میشود. اگر هر کاراکتری از word نقلقول شده باشد، هیچ تفسیری روی کاراکترهای سند صورت نمیگیرد؛ در غیر این صورت، بسط پارامتر، جایگزینی دستور و جایگزینی حسابی رخ میدهند، \new-line نادیده گرفته میشود و \ باید برای نقلقول کردن کاراکترهای \، $ و ` استفاده شود. اگر - به << ضمیمه شود، تمام تبهای ابتدایی از word و از سند حذف میشوند. اگر # به << ضمیمه شود، فاصلهها و تبهای ابتدایی از خط اول سند حذف میشوند و تا میزان معادل فرورفتگی از خطوط باقیمانده و از word حذف خواهد شد. برای اهداف تعیین فرورفتگی، فرض میشود که در هر ۸ ستون یک توقف تب (tab stop) رخ میدهد.
- <<<word
- شکل کوتاهی از here-document که در آن word پس از انجام هرگونه بسط پارامتر، جایگزینی دستور و جایگزینی حسابی، به محتوای here-document تبدیل میشود.
- <&digit
- ورودی استاندارد از توصیفگر فایل digit تکثیر میشود (نگاه کنید به dup(2)). به طور مشابه برای خروجی استاندارد با استفاده از >&digit.
- <&digit-
- توصیفگر فایل ارائهشده توسط digit به ورودی استاندارد منتقل میشود. به طور مشابه برای خروجی استاندارد با استفاده از >&digit-.
- <&-
- ورودی استاندارد بسته میشود. به طور مشابه برای خروجی استاندارد با استفاده از >&-.
- <&p
- ورودی از همپوشه (co-process) به ورودی استاندارد منتقل میشود.
- >&p
- خروجی به همپوشه (co-process) به خروجی استاندارد منتقل میشود.
- <#((expr))
- ارزیابی عبارت حسابی expr و تنظیم موقعیت توصیفگر فایل 0 به اندازه مقدار حاصل به بایت از ابتدای فایل. متغیرهای CUR و EOF هنگام ارزیابی expr به ترتیب به آفست جاری و آفست پایان فایل ارزیابی میشوند.
- >#((offset))
- مشابه <# است، با این تفاوت که روی توصیفگر فایل 1 اعمال میشود.
- <#pattern
- پیمایش به جلو تا ابتدای خط بعدی حاوی pattern.
- <##pattern
- مشابه <# است، با این تفاوت که بخشی از فایل که رد میشود در خروجی استاندارد کپی میگردد.
اگر یکی از موارد بالا بدون فاصله با یک رقم همراه باشد، شماره توصیفگر فایل ارجاع داده شده همان رقمی است که مشخص شده است (به جای 0 یا 1 پیشفرض). اگر یکی از موارد بالا به جز >&- و شکلهای ># و <# ، بدون فاصله با {varname} همراه باشد، یک شماره توصیفگر فایل > 10 توسط پوسته انتخاب شده و در متغیر varname ذخیره خواهد شد. اگر >&- یا هر یک از شکلهای ># و <# با {varname} همراه باشد، مقدار varname توصیفگر فایلی را مشخص میکند که باید بسته شود یا موقعیت آن تنظیم گردد. به عنوان مثال:
به این معنی است که توصیفگر فایل 2 برای نوشتن به عنوان یک نسخه تکراری از توصیفگر فایل 1 باز شود و
به این معنی است که فایل با نام file برای خواندن باز شود و شماره توصیفگر فایل در متغیر n ذخیره گردد.
ترتیبی که تغییر مسیرها مشخص میشوند مهم است. پوسته هر تغییر مسیر را بر حسب ارتباط (توصیفگر فایل, فایل) در زمان ارزیابی بررسی میکند. به عنوان مثال:
ابتدا توصیفگر فایل 1 را با فایل fname مرتبط میکند. سپس توصیفگر فایل 2 را با فایلی که با توصیفگر فایل 1 مرتبط است (یعنی fname) مرتبط میسازد. اگر ترتیب تغییر مسیرها معکوس بود، توصیفگر فایل 2 با ترمینال مرتبط میشد (با فرض اینکه توصیفگر فایل 1 با آن مرتبط بوده باشد) و سپس توصیفگر فایل 1 با فایل fname مرتبط میشد.
اگر پس از یک دستور & بیاید و کنترل کار (job control) فعال نباشد، ورودی استاندارد پیشفرض برای دستور، فایل خالی /dev/null خواهد بود. در غیر این صورت، محیط اجرای یک دستور شامل توصیفگرهای فایل پوسته فراخوان به همان صورتی است که توسط مشخصات ورودی/خروجی اصلاح شده است.
محیط (Environment)
محیط (نگاه کنید به environ(7)) فهرستی از جفتهای نام-مقدار است که به همان روش یک فهرست آرگومان معمولی به یک برنامه در حال اجرا ارسال میشود. نامها باید شناسهها (identifiers) باشند و مقادیر رشتههای کاراکتری هستند. پوسته به روشهای گوناگونی با محیط تعامل دارد. در زمان فراخوانی، پوسته محیط را پویش کرده و برای هر نام یافتشده یک متغیر ایجاد میکند، مقدار و ویژگیهای مربوطه را به آن اختصاص میدهد و آن را به عنوان export علامتگذاری میکند. دستورات اجرا شده محیط را به ارث میبرند. اگر کاربر مقادیر این متغیرها را تغییر دهد یا متغیرهای جدیدی ایجاد کند، با استفاده از دستورات export یا typeset -x آنها بخشی از محیط میشوند. محیطی که توسط هر دستور اجرا شده دیده میشود، بدین ترتیب از هر جفت نام-مقداری تشکیل میشود که در ابتدا توسط پوسته به ارث برده شده و ممکن است مقادیر آنها توسط پوسته جاری تغییر یافته باشد، به علاوه هر مورد اضافهشدهای که باید در دستورات export یا typeset -x مشخص شود.
محیط برای هر simple-command یا تابع ممکن است با پیشوند قرار دادن یک یا چند انتساب متغیر تقویت شود. یک آرگومان انتساب متغیر کلمهای به فرم identifier=value است. بنابراین:
(export TERM; TERM=450; cmd args)
معادل هستند (تا جایی که به اجرای cmd در بالا مربوط میشود، به جز دستورات توکار ویژهای که در زیر فهرست شدهاند - مواردی که یک خنجر (dagger) قبل از آنها آمده است).
اگر گزینه منسوخشده -k تنظیم شده باشد، تمام آرگومانهای انتساب متغیر در محیط قرار میگیرند، حتی اگر پس از نام دستور بیایند. دستورات زیر ابتدا a=b c و سپس c را چاپ میکنند:
echo a=b c set -k echo a=b c
توابع (Functions)
به دلایل تاریخی، دو روش برای تعریف توابع وجود دارد: نحو name() و نحو function name که در بخش دستورات (Commands) در بالا توضیح داده شدهاند. توابع پوسته خوانده شده و به صورت داخلی ذخیره میشوند. نامهای ناممستعار هنگام خوانده شدن تابع تفکیک میشوند. توابع همانند دستورات اجرا میشوند و آرگومانها به عنوان پارامترهای مکانی به آنها ارسال میگردند. (بخش اجرا (Execution) در ادامه را ببینید.)
توابعی که با نحو function name تعریف شده و با نام فراخوانی میشوند، در همان پردازش فراخواننده اجرا میگردند و تمام فایلها و دایرکتوری کاری جاری را با فراخواننده به اشتراک میگذارند. تلههای (traps) دریافتشده توسط فراخواننده، درون تابع به رفتار پیشفرض خود بازنشانی میشوند. یک شرط تله که توسط تابع دریافت یا نادیده گرفته نشود، باعث خاتمه تابع و ارسال شرط به فراخواننده میگردد. یک تله روی EXIT که درون یک تابع تنظیم شده باشد، پس از اتمام تابع در محیط فراخواننده اجرا میشود. به طور معمول، متغیرها میان برنامه فراخواننده و تابع به اشتراک گذاشته میشوند. با این حال، دستور داخلی ویژه typeset که درون یک تابع استفاده شود، متغیرهای محلی تعریف میکند که حوزه دید آنها شامل تابع جاری است. این متغیرها را میتوان در فهرست انتساب متغیر پیش از فراخوانی یا به عنوان آرگومانهای ارجاع نامی، به توابعی که فراخوانی میکنند ارسال کرد. خطاهای درون توابع، کنترل را به فراخواننده بازمیگردانند.
توابع تعریفشده با نحو name() و توابع تعریفشده با نحو function name که با دستور داخلی ویژه . فراخوانی میشوند، در محیط فراخواننده اجرا شده و تمام متغیرها و تلهها را با فراخواننده به اشتراک میگذارند. خطاهای درون اجرای این توابع باعث توقف اسکریپت حاوی آنها میشود.
دستور داخلی ویژه return برای بازگشت از فراخوانیهای تابع استفاده میشود.
نامهای توابع را میتوان با گزینه -f یا +f از دستور داخلی ویژه typeset فهرست کرد. متن توابع نیز در صورت در دسترس بودن با -f فهرست خواهد شد. توابع را میتوان با گزینه -f از دستور داخلی ویژه unset لغو تعریف (undefined) کرد.
به طور معمول، هنگامی که پوسته یک اسکریپت را اجرا میکند، توابع لغو میشوند. توابعی که نیاز است در میان فراخوانیهای مجزای پوسته تعریفشده باقی بمانند، باید در یک دایرکتوری قرار گیرند و متغیر FPATH باید حاوی نام این دایرکتوری باشد. آنها همچنین میتوانند در فایل ENV مشخص شوند.
توابع انضباطی (Discipline Functions)
هر متغیر میتواند صفر یا چند تابع انضباطی مرتبط با خود داشته باشد. پوسته در ابتدا نامهای انضباطی get، set، append و unset را میشناسد، اما هنگام تعریف انواع جدید میتوان به آنها افزود. در بیشتر سیستمها، سایر موارد را میتوان در زمان اجرا از طریق افزونه رابط برنامهنویسی C ارائهشده توسط ابزار داخلی builtin اضافه کرد. اگر تابع انضباطی get برای یک متغیر تعریف شده باشد، هر زمان که به متغیر دادهشده ارجاع شود، فراخوانی میگردد. اگر درون تابع انضباطی به متغیر .sh.value مقداری انتساب داده شود، متغیر مورد ارجاع به جای مقدار خود، این مقدار را ارزیابی میکند. اگر تابع انضباطی set برای یک متغیر تعریف شده باشد، هر زمان که مقداری به متغیر انتساب داده شود، فراخوانی میگردد. اگر تابع انضباطی append برای یک متغیر تعریف شده باشد، هر زمان که مقداری به متغیر دادهشده الصاق شود، فراخوانی میگردد. به متغیر .sh.value مقدار متغیر پیش از فراخوانی تابع انضباطی داده میشود، و پس از اتمام تابع انضباطی، مقدار .sh.value به متغیر انتساب داده خواهد شد. اگر .sh.value درون تابع انضباطی لغو شود (unset)، آن مقدار بدون تغییر باقی میماند. اگر تابع انضباطی unset برای یک متغیر تعریف شده باشد، هر زمان که متغیر دادهشده لغو شود، فراخوانی میگردد. متغیر لغو نخواهد شد مگر اینکه صریحاً از درون این تابع انضباطی لغو شود.
متغیر .sh.name حاوی نام متغیری است که تابع انضباطی برای آن فراخوانی شده است، .sh.subscript اندیس (subscript) متغیر است، و .sh.value حاوی مقداری خواهد بود که درون تابع انضباطی set انتساب داده میشود. متغیر _ ارجاعی به متغیر شامل اندیس آن (در صورت وجود) است. برای تابع انضباطی set، تغییر دادن .sh.value مقداری را که انتساب داده میشود تغییر خواهد داد. در نهایت، بسط ${var.name}، هنگامی که name نام یک تابع انضباطی است و هیچ متغیری با این نام وجود ندارد، معادل جایگزینی دستور ${ var.name;} است.
فضاهای نام (Name Spaces)
دستورات و توابعی که به عنوان بخشی از list یک دستور namespace اجرا میشوند و متغیرها را تغییر میدهند یا متغیرهای جدید ایجاد میکنند، متغیر جدیدی ایجاد مینمایند که نام آن برابر با نام فضای نام مشخصشده توسط identifier به همراه پیشوند . است. هنگامی که به متغیری با نام name ارجاع میشود، ابتدا با استفاده از .identifier.name جستجو میگردد. به طور مشابه، تابعی که توسط دستوری در list دستور namespace تعریف شود، با استفاده از نام فضای نام به همراه پیشوند . ایجاد میگردد.
هنگامی که list یک دستور namespace حاوی یک دستور namespace دیگر باشد، نامهای متغیرها و توابعی که ایجاد میشوند شامل نام متغیر یا تابع به همراه پیشوند فهرست identifierها است که پیش از هر کدام . قرار دارد.
خارج از یک فضای نام، به متغیر یا تابعی که درون یک فضای نام ایجاد شده است میتوان با قرار دادن نام فضای نام در ابتدای آن ارجاع داد.
به طور پیشفرض، متغیرهایی که با .sh شروع میشوند در فضای نام sh قرار دارند.
متغیرهای نوع (Type Variables)
متغیرهای دارای نوع (Typed variables) روشی برای ایجاد ساختار دادهها و اشیاء فراهم میکنند. یک نوع میتواند توسط یک کتابخانه مشترک، توسط دستور داخلی enum که در ادامه توضیح داده شده، یا با استفاده از گزینه جدید -T از دستور داخلی typeset تعریف شود. با گزینه -T از typeset، نام نوع که به عنوان آرگومان گزینه به -T مشخص میشود، با یک انتساب متغیر مرکب که نوع را تعریف میکند تنظیم میگردد. تعاریف توابع میتوانند درون انتساب متغیر مرکب ظاهر شوند و این توابع به توابع انضباطی برای این نوع تبدیل شده و میتوانند توسط هر نمونه (instance) از آن نوع فراخوانی یا بازتعریف شوند. نام تابع create به صورت ویژه مدیریت میشود. این تابع برای هر نمونه از نوع که ایجاد میشود فراخوانی میگردد اما به ارث برده نمیشود و نمیتواند برای هر نمونه بازتعریف شود.
هنگامی که یک نوع تعریف میشود، یک دستور داخلی ویژه با همان نام اضافه میگردد. این دستورات داخلی، دستورات اعلانی هستند و از همان قوانین بسط تمام دستورات داخلی ویژه تعریفشده در ادامه که با †† مشخص شدهاند پیروی میکنند. این دستورات متعاقباً میتوانند درون تعاریف انواع بعدی استفاده شوند. صفحه راهنما برای این دستورات را میتوان با استفاده از گزینه --man یا هر یک از گزینههای دیگر -- که همراه با getopts توضیح داده شدهاند ایجاد کرد. گزینههای -r، -a، -A، -h و -S از typeset همراه با هر یک از این دستورات داخلی جدید مجاز هستند.
یک نمونه از یک نوع با فراخوانی نام نوع به همراه یک یا چند نام نمونه ایجاد میشود. هر نمونه از نوع با یک کپی از زیرمتغیرها مقداردهی اولیه میشود، به جز زیرمتغیرهایی که با گزینه -S تعریف شدهاند. متغیرهای تعریفشده با -S بین تمام نمونههای آن نوع به اشتراک گذاشته میشوند. هر نمونه میتواند مقدار هر زیرمتغیری را تغییر دهد و همچنین میتواند توابع انضباطی جدیدی با همان نامهای تعریفشده توسط تعریف نوع و نیز هر نام انضباطی استاندارد تعریف کند. هیچ زیرمتغیر اضافی را نمیتوان برای هیچ نمونهای تعریف کرد.
هنگام تعریف یک نوع، اگر مقدار یک زیرمتغیر تنظیم نشده باشد و صفت -r مشخص شده باشد، باعث میشود که آن زیرمتغیر به یک زیرمتغیر الزامی تبدیل شود. هر زمان که نمونهای از یک نوع ایجاد میشود، تمام زیرمتغیرهای الزامی باید مشخص شوند. این زیرمتغیرها در هر نمونه به صورت فقطخواندنی (readonly) درمیآیند.
هنگامی که unset روی یک زیرمتغیر درون یک نوع فراخوانی شود و صفت -r برای این فیلد مشخص نشده باشد، مقدار آن به مقدار پیشفرض مرتبط با آن نوع بازنشانی میشود. فراخوانی unset روی یک نمونه نوع که درون نوع دیگری قرار ندارد، تمام زیرمتغیرها و خود متغیر را حذف میکند.
یک تعریف نوع میتواند از تعریف نوع دیگری مشتق شود؛ این کار با تعریف نخستین نام زیرمتغیر به عنوان _ و تعریف نوع آن به عنوان نوع پایه انجام میپذیرد. هر تعریف باقیمانده، اضافات و تغییراتی خواهد بود که روی نوع جدید اعمال میشود. اگر نام نوع جدید با نام نوع پایه یکسان باشد، نوع جایگزین شده و نوع اصلی دیگر در دسترس نخواهد بود.
دستور typeset با گزینه -T و بدون آرگومان گزینه یا عملوند، تمام تعاریف نوع را در خروجی استاندارد با قالبی مینویسد که برای ایجاد مجدد تمام آن انواع قابل خواندن باشد.
کارها و پردازشها (Jobs)
اگر گزینه monitor از دستور set روشن باشد، یک پوسته تعاملی یک کار (job) را به هر خطلوله (pipeline) نسبت میدهد. پوسته جدولی از کارهای جاری را نگهداری میکند که توسط دستور jobs چاپ میشود و اعداد صحیح کوچکی را به آنها اختصاص میدهد. هنگامی که یک کار به صورت ناهمگام با & آغاز میشود، پوسته خطی شبیه به زیر چاپ میکند:
[1] 1234
که نشان میدهد کارِ ناهمگام آغازشده، کار شماره ۱ بوده و دارای یک پردازش (سطح بالا) با شناسه پردازش ۱۲۳۴ بوده است.
این بند و بند بعدی نیازمند ویژگیهایی هستند که در همه نسخههای UNIX وجود ندارند و ممکن است اعمال نشوند. اگر در حال اجرای یک کار هستید و مایلید کار دیگری انجام دهید، میتوانید کلید ^Z (control-Z) را فشار دهید که یک سیگنال STOP به کار جاری ارسال میکند. سپس پوسته معمولاً نشان میدهد که کار متوقف شده است (`Stopped`) و اعلان (prompt) دیگری را چاپ میکند. سپس میتوانید وضعیت این کار را دستکاری کنید، آن را با دستور bg در پسزمینه قرار دهید، یا دستورات دیگری را اجرا کنید و در نهایت با دستور اجرای پیشزمینه fg کار را مجدداً به پیشزمینه بازگردانید. یک ^Z فوراً اعمال میشود و مانند یک وقفه (interrupt) عمل میکند، به این صورت که خروجیهای معلق و ورودیهای خواندهنشده هنگام فشرده شدن آن دور ریخته میشوند.
کاری که در پسزمینه اجرا میشود، در صورتی که تلاش کند از ترمینال بخواند، متوقف خواهد شد. کارهای پسزمینه معمولاً مجاز به تولید خروجی هستند، اما این امکان را میتوان با اجرای دستور stty tostop غیرفعال کرد. اگر این گزینه tty را تنظیم کنید، کارهای پسزمینه هنگام تلاش برای تولید خروجی، درست مانند زمانی که تلاش میکنند ورودی بخوانند، متوقف خواهند شد.
یک استخر کار (job pool) مجموعهای از کارها است که با list & آغاز شده و با یک نام مرتبط شدهاند.
چندین روش برای ارجاع به کارها در پوسته وجود دارد. یک کار را میتوان با شناسه پردازش هر یک از پردازشهای آن کار یا با یکی از موارد زیر مشخص کرد:
- %number
- کار با شماره مشخصشده.
- pool
- تمام کارهای موجود در استخر کار با نام pool.
- pool.number
- کار شماره number در استخر کار با نام pool.
- %string
- هر کاری که خط فرمان آن با string شروع شود.
- %?string
- هر کاری که خط فرمان آن حاوی string باشد.
- %%
- کار جاری.
- %+
- معادل %%.
- %-
- کار قبلی. علاوه بر این، مگر در مواردی که خلاف آن ذکر شده باشد، هر جا که بتوان یک کار را مشخص کرد، نام یک استخر کار پسزمینه را میتوان برای نشان دادن تمام کارهای آن استخر به کار برد.
پوسته به محض اینکه پردازشی تغییر وضعیت دهد، بلافاصله مطلع میشود. پوسته معمولاً هر زمان که کاری مسدود شود و امکان پیشرفت بیشتر وجود نداشته باشد شما را مطلع میسازد، اما این کار را درست قبل از چاپ اعلان (prompt) انجام میدهد. این کار به این دلیل انجام میشود تا در فعالیتهای شما اختلالی ایجاد نگردد. گزینه notify از دستور set باعث میشود پوسته این پیامهای تغییر وضعیت کار را به محض رخ دادن چاپ کند.
هنگامی که گزینه monitor روشن است، هر کار پسزمینهای که تکمیل میشود، هر تله تنظیمشده برای CHLD را فعال میکند.
هنگامی که تلاش میکنید در زمان اجرای کارها یا متوقف بودن آنها از پوسته خارج شوید، با پیام `You have stopped(running) jobs.` به شما هشدار داده میشود. میتوانید از دستور jobs برای مشاهده آنها استفاده کنید. اگر بلافاصله دوباره برای خروج تلاش کنید، پوسته بار دوم هشدار نخواهد داد و کارهای متوقفشده خاتمه مییابند. هنگامی که یک پوسته ورود (login shell) سیگنال HUP دریافت میکند، یک سیگنال HUP به هر کاری که با دستور داخلی disown (توضیح داده شده در ادامه) سلب مالکیت نشده باشد، ارسال مینماید.
سیگنالها (Signals)
سیگنالهای INT و QUIT برای یک دستور فراخوانیشده، در صورتی که پس از دستور & آمده باشد و گزینه monitor فعال باشد، نادیده گرفته میشوند. در غیر این صورت، سیگنالها مقادیر به ارث برده شده توسط پوسته از والد خود را خواهند داشت (اما دستور داخلی trap در ادامه را نیز ببینید).
اجرا (Execution)
هر بار که دستوری خوانده میشود، جایگزینیهای فوق انجام میپذیرند. اگر نام دستور با یکی از دستورات داخلی ویژه (Special Built-in Commands) فهرستشده در زیر مطابقت داشته باشد، درون پردازش جاری پوسته اجرا میشود. سپس نام دستور بررسی میشود تا مشخص گردد آیا با یک تابع تعریفشده توسط کاربر مطابقت دارد یا خیر. در صورت مطابقت، پارامترهای مکانی ذخیره شده و سپس به آرگومانهای فراخوانی function بازنشانی میشوند. یک تابع نیز درون پردازش جاری پوسته اجرا میشود. هنگامی که function تکمیل شود یا دستور return را صادر کند، فهرست پارامترهای مکانی بازیابی میشود. برای توابع تعریفشده با نحو function name ، هر تله تنظیمشده روی EXIT درون تابع اجرا میگردد. مقدار خروج یک function برابر با مقدار آخرین دستور اجراشده است. اگر نام دستور یک دستور داخلی ویژه یا یک function تعریفشده توسط کاربر نباشد، اما یکی از دستورات داخلی فهرستشده در ادامه باشد، درون پردازش جاری پوسته اجرا میشود.
متغیرهای پوسته PATH به همراه متغیر FPATH فهرست دایرکتوریها را برای جستجوی نام دستور مشخص میکنند. نامهای دایرکتوری جایگزین با دونقطه (:) از یکدیگر جدا میشوند. مسیر پیشفرض برابر با خروجی getconf PATH است. دایرکتوری جاری را میتوان با دو یا چند دونقطه متوالی یا با یک دونقطه در ابتدا یا انتهای فهرست مسیر مشخص کرد. اگر نام دستور حاوی / باشد، مسیر جستجو استفاده نمیشود. در غیر این صورت، هر دایرکتوری در فهرست دایرکتوریهای تعریفشده توسط PATH و FPATH به ترتیب بررسی میشود. اگر دایرکتوریِ در حال جستجو در FPATH قرار داشته باشد و حاوی فایلی باشد که نام آن با دستور مورد جستجو مطابقت دارد، این فایل در محیط پوسته جاری بارگذاری میشود، به گونهای که گویی آرگومانی برای دستور . است، با این تفاوت که تنها نامهای مستعار از پیش تنظیمشده بسط مییابند و تابعی با نام دادهشده مطابق با توضیحات بالا اجرا میگردد.
اگر این دایرکتوری در FPATH نباشد، پوسته ابتدا بررسی میکند که آیا نسخه داخلی از دستور مربوط به مسیر دادهشده وجود دارد یا خیر و در صورت وجود، آن را در پردازش جاری فراخوانی میکند. اگر هیچ دستور داخلی یافت نشود، پوسته وجود فایلی به نام .paths را در این دایرکتوری بررسی میکند. در صورت یافت شدن و وجود خطی به شکل FPATH=path که در آن path نام یک دایرکتوری موجود است، آن دایرکتوری بلافاصله پس از دایرکتوری جاری جستجو میشود، گویی در متغیر FPATH یافت شده است. اگر path با / شروع نشود، به صورت نسبی نسبت به دایرکتوریِ در حال جستجو بررسی میشود.
فایل .paths سپس برای یافتن خطی به شکل PLUGIN_LIB=libname [ : libname ] ... بررسی میشود. هر کتابخانه مشخصشده توسط libname به گونهای جستجو میشود که گویی یک آرگومان گزینه برای builtin -f است و اگر حاوی یک دستور داخلی با نام مشخصشده باشد، به جای دستوری با این نام اجرا خواهد شد. هر دستور داخلی بارگذاریشده از کتابخانهای که به این روش یافت شود، با دایرکتوری حاوی فایل .paths مرتبط میگردد، بنابراین فقط در صورتی اجرا میشود که در دایرکتوری قبلی یافت نشده باشد.
در نهایت، دایرکتوری برای یافتن فایلی با نام دادهشده بررسی میشود. اگر فایل دسترسی اجرا داشته باشد اما یک فایل a.out نباشد، فرض میشود که فایلی حاوی دستورات پوسته است. یک پوسته مجزا برای خواندن آن ایجاد (spawn) میشود. در این حالت، تمام متغیرهای سراسرینشده (non-exported) حذف میشوند. اگر فایل دستورات پوسته دسترسی خواندن نداشته باشد، یا اگر بیتهای setuid یا setgid روی فایل تنظیم شده باشند، پوسته یک عامل کمکی (agent) را اجرا میکند که وظیفه آن تنظیم دسترسیها و اجرای پوسته با ارسال فایل دستور پوسته به عنوان یک فایل باز است. اگر فایل .paths حاوی خطی به شکل name=value در خط اول یا دوم باشد، متغیر محیطی name با افزودن دایرکتوری مشخصشده توسط value به ابتدای فهرست دایرکتوریها تغییر مییابد. اگر value یک دایرکتوری مطلق نباشد، دایرکتوری را به صورت نسبی نسبت به دایرکتوریای که فایل اجرایی در آن یافت شده است مشخص میکند. اگر متغیر محیطی name از قبل وجود نداشته باشد، به فهرست متغیرهای محیطی برای دستور مشخصشده اضافه خواهد شد. یک دستور داخل پرانتز در یک زیرپوسته (sub-shell) بدون حذف متغیرهای سراسرینشده اجرا میشود.
ورود مجدد دستور (Command Re-entry)
متن آخرین HISTSIZE دستور (پیشفرض ۵۱۲) واردشده از یک دستگاه ترمینال در یک فایل تاریخچه (history) ذخیره میشود. اگر متغیر HISTFILE تنظیم نشده باشد یا فایلی که نام میبرد قابل نوشتن نباشد، از فایل $HOME/.sh_history استفاده میشود. یک پوسته میتواند به دستورات تمام پوستههای تعاملی که از همان HISTFILE مشخصشده استفاده میکنند دسترسی داشته باشد. دستور داخلی hist برای فهرست کردن یا ویرایش بخشی از این فایل استفاده میشود. بخشی از فایل که قرار است ویرایش یا فهرست شود را میتوان با شماره یا با دادن حرف یا حروف اول دستور انتخاب کرد. یک دستور منفرد یا بازهای از دستورات را میتوان مشخص نمود. اگر برنامه ویرایشگری را به عنوان آرگومان به hist مشخص نکنید، مقدار متغیر HISTEDIT استفاده میشود. اگر HISTEDIT تنظیم نشده باشد، متغیر منسوخ FCEDIT استفاده میشود. اگر FCEDIT تعریف نشده باشد، از /bin/ed استفاده میگردد. دستور(ات) ویرایششده پس از خروج از ویرایشگر چاپ و مجدداً اجرا میشوند مگر اینکه بدون ذخیره کردن خارج شوید. گزینه -s (و در نسخههای منسوخ، نام ویرایشگر -) برای رد کردن مرحله ویرایش و اجرای مجدد دستور استفاده میشود. در این حالت یک پارامتر جایگزینی به شکل old=new میتواند برای تغییر دستور پیش از اجرا استفاده شود. به عنوان مثال، با نام مستعار از پیش تنظیمشده r که به ′hist -s′ ناممستعار داده شده است، تایپ کردن `r bad=good c' جدیدترین دستوری را که با حرف c شروع میشود مجدداً اجرا میکند و اولین رخداد رشته bad را با رشته good جایگزین مینماید.
گزینههای ویرایش درونخطی (In-line Editing Options)
بهطور معمول، هر خط دستوری که از یک دستگاه ترمینال وارد میشود صرفاً تایپ شده و پس از آن یک new-line (کلید «RETURN» یا «LINE FEED») میآید. اگر هر یک از گزینههای emacs، gmacs یا vi فعال باشد، کاربر میتواند خط دستور را ویرایش کند. برای ورود به هر یک از این حالتهای ویرایش، گزینه متناظر را با set تنظیم کنید. هر بار که به متغیر VISUAL یا EDITOR مقداری اختصاص یابد که به یکی از این نامهای گزینه ختم شود، گزینه ویرایشی متناظر بهطور خودکار انتخاب میشود.
قابلیتهای ویرایش نیازمند این هستند که ترمینال کاربر «RETURN» را به عنوان بازگشت مکاننما (carriage return) بدون خط جدید (line feed) بپذیرد و کاراکتر فاصله (« ») روی نویسه جاری در صفحه بازنویسی شود.
مگر در حالتی که گزینه multiline روشن باشد، حالتهای ویرایش مفهومی را پیادهسازی میکنند که در آن کاربر از درون یک پنجره به خط جاری نگاه میکند. عرض این پنجره مقدار متغیر COLUMNS (در صورت تعریف شدن) و در غیر این صورت ۸۰ است. اگر عرض پنجره برای نمایش اعلان (prompt) و باقی گذاشتن حداقل ۸ ستون برای ورود ورودی بسیار کوچک باشد، اعلان از سمت چپ بریده میشود. اگر خط از عرض پنجره منهای دو طولانیتر باشد، نشانهای در انتهای پنجره نمایش داده میشود تا به کاربر اطلاع دهد. با حرکت مکاننما و رسیدن آن به مرزهای پنجره، پنجره حول مکاننما مرکزیت مییابد. این نشانه یک > (<, *) است در صورتی که خط در سمت راست (چپ، هر دو طرف) پنجره امتداد یافته باشد.
دستورات جستجو در هر حالت ویرایش دسترسی به فایل تاریخچه را فراهم میکنند. فقط رشتهها مطابقت داده میشوند و نه الگوها، اگرچه وجود یک ^ در ابتدای رشته، تطبیق را به شروع از اولین نویسه خط محدود میکند.
هر یک از حالتهای ویرایش عملیاتی برای فهرست کردن فایلها یا دستوراتی دارند که با کلمه نیمهکاره واردشده مطابقت دارند. هنگامی که این عملیات روی اولین کلمه خط، یا اولین کلمه پس از یک ;، ⎪، & یا ( اعمال شود، و کلمه با ∼ شروع نشود یا حاوی یک / نباشد، فهرستی از نامهای مستعار (alias)، توابع و دستورات اجرایی تعریفشده توسط متغیر PATH که میتوانند با این کلمه جزئی مطابقت داشته باشند نمایش داده میشود. در غیر این صورت، فهرست فایلهایی که با کلمه دادهشده مطابقت دارند نمایش مییابد. اگر کلمه نیمهکاره واردشده شامل نویسههای بسط فایل نباشد، پیش از ایجاد این فهرستها یک * به انتهای آن افزوده میشود. پس از نمایش فهرست ایجادشده، خط ورودی دوباره رسم میشود. این عملیاتها بهترتیب فهرستبندی نام دستور (command name listing) و فهرستبندی نام فایل (file name listing) نامیده میشوند. عملیات دیگری نیز وجود دارند که تکمیل نام دستور (command name completion) و تکمیل نام فایل (file name completion) نامیده میشوند و فهرست دستورات یا فایلهای منطبق را محاسبه کرده، اما به جای چاپ فهرست، کلمه جاری را با تطبیق کامل یا جزئی جایگزین میکنند. برای تکمیل نام فایل، در صورت یکتا بودن تطبیق، اگر فایل یک دایرکتوری باشد یک / و اگر دایرکتوری نباشد یک فاصله به انتهای آن افزوده میشود. در غیر این صورت، طولانیترین پیشوند مشترک میان تمامی فایلهای منطبق جایگزین کلمه میشود. برای تکمیل نام دستور، تنها بخشی از نام فایلها که پس از آخرین / قرار دارد برای یافتن طولانیترین پیشوند دستور استفاده میشود. اگر تنها یک نام با این پیشوند مطابقت داشته باشد، کلمه با نام دستور به همراه یک فاصله جایگزین میگردد. هنگام استفاده از کلید tab برای تکمیل در صورتی که منجر به یک تطبیق یکتا نشود، فشردن مجدد tab فهرستی شمارهگذاریشده از گزینههای منطبق را ارائه میدهد. میتوان با وارد کردن شماره گزینه موردنظر و به دنبال آن یک کلید tab، انتخاب مشخصی را انجام داد.
کلیدهای میانبر (Key Bindings)
تله (trap) KEYBD میتواند برای رهگیری کلیدها هنگام تایپ شدن و تغییر کاراکترهایی که عملاً توسط شل دیده میشوند استفاده شود. این تله پس از ورود هر نویسه (یا دنبالهای از نویسهها هنگامی که اولین نویسه ESC باشد) در حین خواندن از ترمینال اجرا میشود. متغیر .sh.edchar حاوی نویسه یا دنباله نویسهای است که تله را ایجاد کرده است. تغییر مقدار .sh.edchar در عملیات تله باعث میشود شل طوری رفتار کند که گویی مقدار جدید به جای مقدار اصلی از صفحهکلید وارد شده است.
متغیر .sh.edcol روی شماره ستون ورودی مکاننما در زمان ورود ورودی تنظیم میشود. متغیر .sh.edmode هنگام قرار داشتن در حالت درج vi (به زیر مراجعه کنید) روی ESC تنظیم شده و در غیر این صورت تهی (null) است. افزودن ${.sh.editmode} به ابتدای مقداری که به .sh.edchar اختصاص داده میشود باعث خواهد شد شل در صورتی که در حالت کنترل نیست به این حالت تغییر وضعیت دهد.
این تله برای نویسههایی که به عنوان آرگومان دستورالعملهای ویرایش وارد میشوند یا هنگام خواندن ورودی برای جستجوی نویسه فراخوانی نمیشود.
حالت ویرایش ایمکس (Emacs Editing Mode)
این حالت با فعال کردن یکی از گزینههای emacs یا gmacs فعال میشود. تنها تفاوت میان این دو حالت شیوه مدیریت ^T توسط آنها است. برای ویرایش، کاربر مکاننما را به نقطهای که نیازمند اصلاح است منتقل کرده و سپس بر حسب نیاز نویسهها یا کلمات را درج یا حذف میکند. تمامی دستورات ویرایشی نویسههای کنترلی یا دنبالههای گریز (escape sequences) هستند. نماد نویسههای کنترلی یک علامت توان (^) به همراه نویسه مربوطه است. برای نمونه، ^F نماد کلید کنترلی F است. این کلید با نگهداشتن کلید «CTRL» (کنترل) و فشردن «f» وارد میشود. کلید «SHIFT» فشرده نمیشود. (نماد ^? نشاندهنده کلید DEL یا همان delete است.)
نماد دنبالههای گریز M- به همراه یک نویسه است. برای نمونه، M-f (تلفظ میشود متا f) با فشردن کلید ESC (اسکی 033) و به دنبال آن «f» وارد میشود. (M-F نماد فشردن کلید ESC و به دنبال آن کلید «SHIFT» به همراه «F» بزرگ است.)
تمامی دستورات ویرایشی از هر کجای خط (نه فقط از ابتدای آن) عمل میکنند. به جز در مواردی که ذکر شده، کلید «RETURN» یا «LINE FEED» بعد از دستورات ویرایشی وارد نمیشود.
- ^F
- انتقال مکاننما به اندازه یک نویسه به جلو (راست).
- M-[C
- انتقال مکاننما به اندازه یک نویسه به جلو (راست).
- M-f
- انتقال مکاننما به اندازه یک کلمه به جلو. (مفهوم کلمه در ویرایشگر emacs رشتهای از نویسهها شامل حروف، ارقام و زیرخطها است.)
- ^B
- انتقال مکاننما به اندازه یک نویسه به عقب (چپ).
- M-[D
- انتقال مکاننما به اندازه یک نویسه به عقب (چپ).
- M-b
- انتقال مکاننما به اندازه یک کلمه به عقب.
- ^A
- انتقال مکاننما به ابتدای خط.
- M-[H
- انتقال مکاننما به ابتدای خط.
- ^E
- انتقال مکاننما به انتهای خط.
- M-[Y
- انتقال مکاننما به انتهای خط.
- ^]char
- انتقال مکاننما به سمت جلو تا نویسه char در خط جاری.
- M-^]char
- انتقال مکاننما به سمت عقب تا نویسه char در خط جاری.
- ^X^X
- تعویض جایگاه مکاننما و نشانهگذار (mark).
- erase
- (نویسه حذف تعریفشده توسط کاربر بر اساس دستور stty(1) که معمولاً ^H یا # است.) حذف نویسه قبلی.
- lnext
- (نویسه درج لفظی بعدی تعریفشده توسط کاربر بر اساس دستور stty(1) یا ^V در صورت عدم تعریف.) ویژگیهای ویرایشی نویسه بعدی را (در صورت وجود) حذف میکند.
- ^D
- حذف نویسه جاری.
- M-d
- حذف کلمه جاری.
- M-^H
- (متا-backspace) حذف کلمه قبلی.
- M-h
- حذف کلمه قبلی.
- M-^?
- (متا-DEL) حذف کلمه قبلی (اگر نویسه وقفه شما ^? (DEL، حالت پیشفرض) باشد، این دستور کار نخواهد کرد).
- ^T
- جابجایی نویسه جاری با نویسه قبلی و پیشروی مکاننما در حالت emacs. جابجایی دو نویسه قبلی در حالت gmacs.
- ^C
- تبدیل نویسه جاری به حرف بزرگ.
- M-c
- تبدیل کلمه جاری به حرف بزرگ (Capitalize).
- M-l
- تبدیل کلمه جاری به حروف کوچک (lower case).
- ^K
- حذف از مکاننما تا انتهای خط. اگر پارامتر عددی با مقداری کمتر از موقعیت فعلی مکاننما پیش از آن بیاید، حذف از موقعیت دادهشده تا مکاننما انجام میشود. اگر پارامتر عددی با مقداری بزرگتر از موقعیت فعلی مکاننما پیش از آن بیاید، حذف از مکاننما تا موقعیت مکاننمای دادهشده انجام میشود.
- ^W
- حذف از مکاننما تا نشانهگذار (kill to mark).
- M-p
- قرار دادن ناحیه بین مکاننما تا نشانهگذار در پشته (stack).
- kill
- (نویسه kill تعریفشده توسط کاربر طبق دستور stty، معمولاً ^G یا @.) پاک کردن کل خط جاری. اگر دو نویسه kill پشت سر هم وارد شوند، تمام نویسههای kill از آن پس باعث رفتن به خط جدید میشوند (کاربردی در ترمینالهای کاغذی).
- ^Y
- بازیابی آخرین آیتم حذفشده از خط (بازگرداندن آیتم به خط / Yank).
- ^L
- رفتن به سطر بعد (Line feed) و چاپ خط جاری.
- M-^L
- پاک کردن صفحه نمایش.
- ^@
- (نویسه Null) تنظیم نشانهگذار (Set mark).
- M-space
- (متا space) تنظیم نشانهگذار.
- ^J
- (خط جدید / New line) اجرای خط جاری.
- ^M
- (بازگشت / Return) اجرای خط جاری.
- eof
- نویسه پایان فایل (End-of-file)، معمولاً ^D، تنها در صورتی به عنوان پایان فایل پردازش میشود که خط جاری تهی باشد.
- ^P
- واکشی دستور قبلی. هر بار که ^P وارد شود، به دستور قبلی در تاریخچه دسترسی پیدا میکند. در دستورات چندخطی در صورتی که در خط اول نباشد، یک سطر به عقب بازمیگردد.
- M-[A
- اگر مکاننما در انتهای خط باشد، معادل ^R است که در آن string برابر با محتوای خط جاری تنظیم شده باشد. در غیر این صورت، معادل ^P است.
- M-<
- واکشی قدیمیترین (دورترین) خط تاریخچه.
- M->
- واکشی جدیدترین (تازهترین) خط تاریخچه.
- ^N
- واکشی خط دستور بعدی. هر بار که ^N وارد شود، به خط دستور بعدی رو به جلو دسترسی پیدا میکند.
- M-[B
- معادل ^N.
- ^Rstring
- جستجوی معکوس در تاریخچه برای یافتن خط دستور قبلی حاوی string. اگر پارامتر صفر داده شود، جستجو رو به جلو انجام میشود. string با فشردن کلید «RETURN» یا «NEW LINE» خاتمه مییابد. اگر در ابتدای رشته علامت ^ قرار گیرد، خط منطبق باید با string آغاز شود. اگر string حذف شود، خط دستور بعدی حاوی جدیدترین string در دسترس قرار میگیرد. در این حالت، پارامتر صفر جهت جستجو را معکوس میکند.
- ^O
- اجرا و واکشی - اجرای خط جاری و واکشی خط بعدی نسبت به خط جاری از فایل تاریخچه.
- M-digits
- (Escape) تعریف پارامتر عددی؛ ارقام به عنوان پارامتر دستور بعدی در نظر گرفته میشوند. دستوراتی که پارامتر میپذیرند عبارتند از: ^F، ^B، erase، ^C، ^D، ^K، ^R، ^P، ^N، ^]، M-.، M-^]، M-_، M-=، M-b، M-c، M-d، M-f، M-h، M-l و M-^H.
- M-letter
- کلید نرمافزاری (Soft-key) - در فهرست نامهای مستعار شما به دنبال نام مستعاری به نام _letter جستجو میشود و در صورت تعریف بودن چنین نام مستعاری، مقدار آن در صف ورودی درج میگردد. letter نباید از متاتوابع فوق باشد.
- M-[letter
- کلید نرمافزاری - در فهرست نامهای مستعار شما به دنبال نام مستعاری به نام __letter جستجو میشود و در صورت تعریف بودن، مقدار آن در صف ورودی درج میگردد. از این قابلیت میتوان برای برنامهریزی کلیدهای تابعی (Function keys) در بسیاری از ترمینالها استفاده کرد.
- M-.
- آخرین کلمه از دستور قبلی در خط درج میشود. اگر پیش از آن یک پارامتر عددی بیاید، مقدار این پارامتر تعیین میکند که به جای کلمه آخر کدام کلمه درج شود.
- M-_
- مشابه M-..
- M-*
- تلاش برای بسط نام فایل (تولید نام) روی کلمه جاری. اگر کلمه با هیچ فایلی مطابقت نداشته باشد یا شامل نویسههای الگوی ویژه نباشد، یک ستاره به انتهای آن افزوده میشود.
- M-ESC
- تکمیل نام دستور یا نام فایل همانطور که در بالا شرح داده شد.
- ^I tab
- تلاش برای تکمیل نام دستور یا نام فایل همانطور که در بالا شرح داده شد. اگر تکمیل جزئی رخ دهد، تکرار آن همانند ورود M-= رفتار خواهد کرد. اگر هیچ تطبیقی یافت نشود یا بعد از space وارد شود، یک tab درج میشود.
- M-=
- اگر پارامتر عددی پیش از آن نیاید، فهرستی از دستورات یا نامهای فایل منطبق را طبق توضیحات بالا ایجاد میکند. در غیر این صورت، کلمه زیر مکاننما با آیتم متناظر با مقدار پارامتر عددی از تازهترین فهرست دستور یا فایل ایجادشده جایگزین میشود. اگر مکاننما روی کلمهای نباشد، به جای آن درج میگردد.
- ^U
- ضرب کردن پارامتر دستور بعدی در ۴.
- \
- گریز دادن (Escape) نویسه بعدی. نویسههای ویرایشی، نویسههای erase، kill و وقفه (interrupt، معمولاً ^?) کاربر در صورت قرار گرفتن \ پیش از آنها میتوانند در خط دستور یا رشته جستجو وارد شوند. \ ویژگیهای ویرایشی نویسه بعدی را (در صورت وجود) حذف میکند.
- M-^V
- نمایش نسخه شل.
- M-#
- اگر خط با # شروع نشود، یک # در ابتدای خط و بعد از هر خط جدید درج شده و خط وارد میشود. این کار باعث درج یک توضیح در فایل تاریخچه میگردد. اگر خط با # شروع شود، علامت # حذف شده و یک # بعد از هر خط جدید نیز حذف میشود.
حالت ویرایش Vi (Vi Editing Mode)
دو حالت تایپ وجود دارد. در ابتدا، هنگامی که دستوری را وارد میکنید، در حالت input (ورودی) قرار دارید. برای ویرایش، کاربر با فشردن کلید ESC (033) وارد حالت control (کنترل) میشود و مکاننما را به نقطهای که نیاز به اصلاح دارد منتقل میکند و سپس کاراکترها یا کلمات را بر حسب نیاز درج یا حذف مینماید. اکثر دستورات کنترلی یک count (شمارنده تکرار) اختیاری را پیش از دستور میپذیرند.
در اکثر سیستمها در حالت vi، پردازش استاندارد (canonical processing) در ابتدا فعال است و چنانچه سرعت ۱۲۰۰ باود یا بیشتر باشد و دستور شامل کاراکترهای کنترلی باشد یا کمتر از یک ثانیه از نمایش خط اعلان (prompt) سپری شده باشد، دستور مجدداً چاپ (echo) خواهد شد. کاراکتر ESC پردازش استاندارد را برای باقیمانده دستور متوقف میکند و سپس کاربر میتواند خط فرمان را اصلاح نماید. این سازوکار، مزایای پردازش استاندارد را همراه با بازتاب پیشتایپ (type-ahead) در حالت خام (raw mode) فراهم میکند.
اگر گزینه viraw نیز تنظیم شده باشد، پردازش استاندارد ترمینال همواره غیرفعال خواهد بود. این حالت برای سیستمهایی که از دو جداکننده جایگزین پایان خط پشتیبانی نمیکنند ضمنی است، و ممکن است برای برخی ترمینالها سودمند باشد.
دستورات ویرایش ورودی (Input Edit Commands)
- erase
- (کاراکتر حذف تعریفشده توسط کاربر مطابق دستور stty، معمولاً ^H یا #.) حذف کاراکتر قبلی.
- ^W
- حذف کلمه قبلیِ جداشده با فاصله.
- eof
- به عنوان اولین کاراکتر خط، باعث خروج و پایان کار پوسته میشود مگر اینکه گزینه ignoreeof تنظیم شده باشد. در غیر این صورت، این کاراکتر نادیده گرفته میشود.
- lnext
- (کاراکتر درج تحتاللفظی بعدی تعریفشده توسط کاربر مطابق stty(1) یا ^V در صورت عدم تعریف.) ویژگیهای ویرایشی کاراکتر بعدی (در صورت وجود) را حذف میکند.
- \
- نادیدهگیری (Escape) کاراکتر erase یا kill بعدی.
- ^I tab
- تلاش برای تکمیل نام دستور یا فایل مطابق توضیحات بالا انجام میدهد و به حالت ورودی بازمیگردد. اگر تکمیل جزئی انجام شود، تکرار مجدد آن رفتاری مشابه وارد کردن = از حالت کنترل خواهد داشت. اگر تطابقی یافت نشود یا بعد از space وارد شود، یک کاراکتر tab درج میگردد.
دستورات ویرایش حرکتی (Motion Edit Commands)
- [count]l
- حرکت مکاننما یک کاراکتر به جلو (راست).
- [count][C
- حرکت مکاننما یک کاراکتر به جلو (راست).
- [count]w
- حرکت مکاننما به اندازه یک کلمه حرفی-عددی به جلو.
- [count]W
- حرکت مکاننما به ابتدای کلمه بعدی پس از فاصله خالی.
- [count]e
- حرکت مکاننما به انتهای کلمه.
- [count]E
- حرکت مکاننما به انتهای کلمه جاری که با فاصله محدود شده است.
- [count]h
- حرکت مکاننما یک کاراکتر به عقب (چپ).
- [count][D
- حرکت مکاننما یک کاراکتر به عقب (چپ).
- [count]b
- حرکت مکاننما یک کلمه به عقب.
- [count]B
- حرکت مکاننما به کلمه قبلی جداشده با فاصله.
- [count]⎪
- حرکت مکاننما به ستون count.
- [count]fc
- یافتن کاراکتر بعدی c در خط جاری.
- [count]Fc
- یافتن کاراکتر قبلی c در خط جاری.
- [count]tc
- معادل f به دنبال آن h.
- [count]Tc
- معادل F به دنبال آن l.
- [count];
- تکرار آخرین دستور جستجوی تککاراکتری f، F، t یا T به تعداد count مرتبه.
- [count],
- تکرار معکوس آخرین دستور جستجوی تککاراکتری به تعداد count مرتبه.
- 0
- حرکت مکاننما به ابتدای خط.
- ^
- حرکت مکاننما به ابتدای خط.
- [H
- حرکت مکاننما به اولین کاراکتر غیرفاصله در خط.
- $
- حرکت مکاننما به انتهای خط.
- [Y
- حرکت مکاننما به انتهای خط.
- %
- حرکت به جفت متناظر (، )، {، }، [ یا ]. اگر مکاننما روی یکی از کاراکترهای بالا نباشد، ابتدا باقیمانده خط برای اولین رخداد یکی از این کاراکترها جستجو میشود.
دستورات ویرایش جستجو (Search Edit Commands)
- [count]k
- واکشی دستور قبلی. هر بار که k وارد شود، به دستور قبلی در زمان گذشته دسترسی حاصل میشود.
- [count]-
- معادل k.
- [count][A
- اگر مکاننما در انتهای خط باشد، معادل / همراه با string^تنظیمشده به محتویات خط جاری است. در غیر این صورت، معادل k است.
- [count]j
- واکشی دستور بعدی. هر بار که j وارد شود، به دستور بعدی در زمان آینده دسترسی حاصل میشود.
- [count]+
- معادل j.
- [count][B
- معادل j.
- [count]G
- دستور شماره count واکشی میشود. مقدار پیشفرض، قدیمیترین دستور در تاریخچه است.
- /string
- جستجو رو به عقب در تاریخچه برای دستور قبلیِ حاوی string. String با یک کاراکتر «RETURN» یا «NEW LINE» پایان مییابد. اگر در ابتدای رشته یک کاراکتر ^ قرار گیرد، خط منطبقشده باید با string شروع شود. اگر string خالی باشد، از رشته قبلی استفاده میشود.
- ?string
- مشابه / با این تفاوت که جستجو در جهت رو به جلو انجام میشود.
- n
- جستجو برای تطابق بعدی آخرین الگوی دستورات / یا ?.
- N
- جستجو برای تطابق بعدی آخرین الگوی دستورات / یا ?، اما در جهت معکوس.
دستورات ویرایش تغییر متن (Text Modification Edit Commands)
- a
- ورود به حالت ورودی و درج متن پس از کاراکتر جاری.
- A
- افزودن متن به انتهای خط. معادل $a.
- [count]cmotion
- c[count]motion
- حذف کاراکتر جاری تا کاراکتری که motion مکاننما را به آن منتقل میکند، و ورود به حالت ورودی. اگر motion برابر با c باشد، کل خط حذف شده و وارد حالت ورودی میشود.
- C
- حذف کاراکتر جاری تا انتهای خط و ورود به حالت ورودی. معادل c$.
- S
- معادل cc.
- [count]s
- جایگزینی کاراکترهای زیر مکاننما در حالت ورودی.
- D
- حذف کاراکتر جاری تا انتهای خط. معادل d$.
- [count]dmotion
- d[count]motion
- حذف کاراکتر جاری تا کاراکتری که motion به آن منتقل میشود. اگر motion برابر با d باشد، کل خط حذف میشود.
- i
- ورود به حالت ورودی و درج متن پیش از کاراکتر جاری.
- I
- درج متن پیش از ابتدای خط. معادل 0i.
- [count]P
- قرار دادن آخرین تغییر متنی قبل از مکاننما.
- [count]p
- قرار دادن آخرین تغییر متنی بعد از مکاننما.
- R
- ورود به حالت ورودی و جایگزینی کاراکترهای روی صفحه با کاراکترهای تایپشده به روش رونویسی (overlay).
- [count]rc
- جایگزینی count کاراکتر از موقعیت جاری مکاننما با c، و جلو بردن مکاننما.
- [count]x
- حذف کاراکتر جاری.
- [count]X
- حذف کاراکتر قبلی.
- [count].
- تکرار دستور قبلی تغییر متن.
- [count]∼
- معکوس کردن بزرگی/کوچکی حروف (case) برای count کاراکتر از موقعیت جاری مکاننما و جلو بردن مکاننما.
- [count]_
- باعث الصاق کلمه شماره count از دستور قبلی و ورود به حالت ورودی میشود. در صورت حذف count، از آخرین کلمه استفاده میشود.
- *
- باعث افزودن یک کاراکتر * به کلمه جاری و تلاش برای تولید نام فایل میشود. اگر تطابقی یافت نشود، بوق سیستم به صدا درمیآید. در غیر این صورت، کلمه با الگوی منطبق جایگزین شده و وارد حالت ورودی میشود.
- \
- تکمیل نام دستور یا فایل مطابق توضیحات بالا.
سایر دستورات ویرایش (Other Edit Commands)
- [count]ymotion
- y[count]motion
- کپی کردن (Yank) کاراکتر جاری تا کاراکتری که motion مکاننما را به آن منتقل میکند و قرار دادن آنها در بافر حذف. متن و مکاننما بدون تغییر باقی میمانند.
- yy
- کپی کردن کل خط.
- Y
- کپی کردن از موقعیت جاری تا انتهای خط. معادل y$.
- u
- واگردانی (Undo) آخرین دستور تغییر متن.
- U
- واگردانی تمام دستورات تغییر متن اعمالشده روی خط.
- [count]v
- دستور hist -e ${VISUAL:-${EDITOR:-vi}} count را در بافر ورودی برمیگرداند. اگر count ذکر نشود، از خط جاری استفاده میشود.
- ^L
- تعویض خط (Line feed) و چاپ خط جاری. تنها در حالت کنترل مؤثر است.
- ^J
- (خط جدید - New line) اجرای خط جاری، صرفنظر از حالت فعال.
- ^M
- (بازگشت - Return) اجرای خط جاری، صرفنظر از حالت فعال.
- #
- اگر اولین کاراکتر دستور یک # باشد، این دستور آن # و هر # دیگری که پس از یک خط جدید میآید را حذف میکند. در غیر این صورت، با قرار دادن یک # در ابتدای هر خط از دستور، خط را ارسال میکند. برای قرار دادن خط جاری به صورت کامنت در تاریخچه و خارج کردن دستورات قبلاً کامنتشده در فایل تاریخچه از حالت کامنت کاربرد دارد.
- [count]=
- اگر count مشخص نشده باشد، فهرستی از نامهای دستورات یا فایلهای منطبق را مطابق توضیحات بالا تولید میکند. در غیر این صورت، کلمه زیر مکاننما با مورد شماره count از تازهترین فهرست دستورات یا فایلهای تولیدشده جایگزین میشود. اگر مکاننما روی کلمهای نباشد، به جای جایگزینی، درج میگردد.
- @letter
- فهرست نامهای مستعار (alias) شما برای یافتن نام مستعاری به نام _letter جستجو میشود و اگر نام مستعاری با این نام تعریف شده باشد، مقدار آن برای پردازش در صف ورودی درج خواهد شد.
- ^V
- نمایش نگارش پوسته.
تکمیل خودکار قابل برنامهریزی (Programmable Completion)
بهطور پیشفرض، فشردن کلید tab باعث تطبیق کلمه جاری با فایلهایی میشود که با کاراکترهای تایپشده شروع میشوند و تا جای ممکن کاراکترهایی که یک تطابق منحصربهفرد را فراهم کنند اضافه میکند. اگر پیشوند منطبق منحصربهفرد نباشد، فشردن مجدد tab یک فهرست شمارهگذاریشده از گزینهها را نمایش میدهد و وارد کردن number tab کلمه جاری را با آن انتخاب جایگزین میکند.
تکمیل خودکار قابل برنامهریزی به شما امکان میدهد نحوه گسترش کلمات را هنگام فشردن کلید tab برای یک یا چند دستور مشخص کنترل کنید. دستور توکار complete به شما امکان میدهد نحوه تکمیل کلمه جاری برای دستور مشخصشده را تعیین کنید.
دستورات توکار (Built-in Commands)
دستورات ساده زیر درون فرآیند پوسته اجرا میشوند. تغییر مسیر ورودی/خروجی مجاز است. مگر در مواردی که خلاف آن ذکر شده باشد، خروجی در توصیفگر پرونده ۱ نوشته میشود و وضعیت خروج، در صورتی که خطای ترتیبی وجود نداشته باشد، صفر است. به جز :، true، false، echo، newgrp و login، تمام دستورات توکار -- را برای مشخص کردن پایان گزینهها میپذیرند. آنها همچنین گزینه --man را به عنوان درخواستی برای نمایش صفحه راهنما در خروجی خطای استاندارد و -? را به عنوان درخواست راهنمایی تفسیر میکنند که یک پیام usage (نحوه استفاده) در خروجی خطای استاندارد چاپ میکند. دستوراتی که قبل از آنها یک یا دو نماد † قرار دارد دستورات توکار ویژه هستند و در موارد زیر به صورت ویژه با آنها رفتار میشود:
- 1.
- فهرست انتساب متغیرها پیش از دستور، پس از اتمام دستور نیز معتبر باقی میماند.
- 2.
- تغییر مسیرهای ورودی/خروجی پس از انتساب متغیرها پردازش میشوند.
- 3.
- خطاها باعث لغو و خروج اسکریپت حاوی آنها میشوند.
- 4.
- آنها نامهای مجاز برای توابع نیستند.
- 5.
- کلماتی که پس از یک دستور با پیشوند †† میآیند و در قالب یک انتساب متغیر هستند، با همان قوانین انتساب متغیر بسط داده میشوند. این بدان معناست که جایگزینی تیلدا بعد از علامت = انجام میشود و تفکیک فیلد و تولید نام پرونده انجام نمیشود. به اینها توکارهای declaration (اعلانی) گفته میشود.
- † : [ arg ... ]
- این دستور
فقط
پارامترها
را بسط
میدهد.
- † . name [ arg ... ]
- اگر name تابعی باشد که با نحو کلمه کلیدی رزروشده function name تعریف شده باشد، تابع در محیط جاری اجرا میشود (مانند اینکه با نحو name() تعریف شده باشد.) در غیر این صورت، اگر name به یک پرونده اشاره کند، پرونده به طور کامل خوانده شده و دستورات در محیط جاری پوسته اجرا میشوند. مسیر جستجوی مشخصشده توسط PATH برای یافتن دایرکتوری حاوی پرونده استفاده میشود. اگر هرگونه آرگومان arg داده شود، آنها هنگام پردازش دستور . به پارامترهای مکانی تبدیل میشوند و پارامترهای مکانی اصلی پس از اتمام بازیابی میشوند. در غیر این صورت، پارامترهای مکانی دستنخورده باقی میمانند. وضعیت خروج برابر با وضعیت خروج آخرین دستور اجرا شده است.
- †† alias [ -ptx ] [ name[ =value ] ] ...
- دستور alias بدون هیچ آرگومانی، فهرست نامهای مستعار را به شکل name=value در خروجی استاندارد چاپ میکند. گزینه -p باعث میشود کلمه alias قبل از هر کدام درج شود. هنگامی که یک یا چند آرگومان داده شود، یک alias (نام مستعار) برای هر name که value آن مشخص شده باشد، تعریف میشود. یک فاصله در انتهای value باعث میشود کلمه بعدی نیز برای جایگزینی نام مستعار بررسی شود. گزینه منسوخشده -t برای تنظیم و فهرست کردن نامهای مستعار ردیابیشده (tracked aliases) استفاده میشود. مقدار یک نام مستعار ردیابیشده، مسیر کامل مربوط به name دادهشده است. این مقدار در صورت بازنشانی مقدار PATH نامعتبر و تعریفنشده میشود، اما نام مستعار همچنان ردیابیشده باقی میماند. بدون گزینه -t، برای هر name در فهرست آرگومانها که مقداری برای value آن داده نشده باشد، نام و مقدار نام مستعار چاپ میشود. گزینه منسوخشده -x هیچ تاثیری ندارد. اگر یک name داده شود اما مقداری تعیین نشود و هیچ نام مستعاری برای آن name تعریف نشده باشد، وضعیت خروج غیرصفر خواهد بود.
- bg [ job... ]
- این دستور تنها در سیستمهایی که از کنترل کارها (job control) پشتیبانی میکنند در دسترس است. هر job (کار) مشخصشده را به پسزمینه میبرد. اگر job مشخص نشده باشد، کار جاری به پسزمینه برده میشود. برای توضیحات مربوط به ساختار job، بخش Jobs (کارها) را ببینید.
- † break [ n ]
- خروج از حلقه دربرگیرنده for، while، until یا select، در صورت وجود. اگر n مشخص شده باشد، به اندازه n سطح از حلقهها خارج میشود.
- builtin [ -dsp ] [ -f file ] [ name ... ]
- اگر name مشخص
نشده باشد،
و هیچ گزینه
-f تعیین
نشده باشد،
دستورات
توکار در
خروجی
استاندارد
چاپ
میشوند.
گزینه -s
تنها
دستورات
توکار ویژه
را چاپ
میکند. در
غیر این
صورت، هر name
بیانگر نام
مسیری است
که نام پایه
(basename) آن، نام
دستور
توکار است.
نام تابع
نقطه ورود (entry
point) با پیشوند
b_ به نام
دستور
توکار
تعیین
میشود. یک
دستور
توکار که با
نام مسیر
مشخص شده
باشد تنها
زمانی اجرا
میشود که
آن نام مسیر
در حین
جستجوی
مسیر (path search)
پیدا شود.
دستورات
توکار
یافتشده
در
کتابخانههای
بارگذاریشده
از طریق
پرونده .paths
با نام مسیر
دایرکتوری
حاوی
پرونده .paths
مرتبط
خواهند شد.
نمونه اولیه (prototype) استاندارد ISO C/C++ برای دستور توکار mycommand به صورت b_mycommand(int argc, char *argv[], void *context) است که در آن argv آرایهای از argc عنصر است و context یک اشارهگر اختیاری به ساختار Shell_t مطابق شرح ارائهشده در <ast/shell.h> میباشد.
دستورات توکار ویژه را نمیتوان به یک نام مسیر پیوند زد یا حذف کرد. گزینه -d هر یک از دستورات توکار دادهشده را حذف میکند. در سیستمهایی که از بارگذاری پویا پشتیبانی میکنند، گزینه -f نام یک کتابخانه اشتراکی حاوی کد دستورات توکار را مشخص میکند. پیشوند و/یا پسوند کتابخانه اشتراکی که به سیستم بستگی دارد، میتواند حذف شود. به محض بارگذاری یک کتابخانه، نمادهای آن برای فراخوانیهای بعدی builtin در دسترس قرار میگیرند. میتوان چندین کتابخانه را با فراخوانیهای جداگانه دستور builtin مشخص کرد. کتابخانهها به ترتیب معکوس تعیین آنها جستجو میشوند. هنگامی که یک کتابخانه بارگذاری میشود، به دنبال تابعی با نام lib_init() در کتابخانه میگردد و این تابع را با آرگومان 0 فراخوانی میکند.
گزینه -p باعث میشود خروجی به صورت قالبی از دستورات builtin تولید شود که بتوان از آن به عنوان ورودی پوسته برای بازسازی مجموعه توکارهای جاری استفاده کرد.
- cd [ -LP ] [ arg ]
- cd [ -LP ] old new
- این دستور
میتواند
به یکی از
دو شکل
باشد. در
شکل اول،
دایرکتوری
جاری را به
arg تغییر
میدهد. اگر
arg برابر با
- باشد،
دایرکتوری
به
دایرکتوری
قبلی تغییر
مییابد.
متغیر
پوسته HOME
مقدار
پیشفرض arg
است. متغیر
PWD روی
دایرکتوری
جاری تنظیم
میشود.
متغیر
پوسته CDPATH
مسیر جستجو
برای
دایرکتوری
حاوی arg را
تعریف
میکند. نام
دایرکتوریهای
جایگزین با
دو نقطه (:)
از هم جدا
میشوند.
مسیر
پیشفرض
<null>
(مشخصکننده
دایرکتوری
جاری) است.
توجه داشته
باشید که
دایرکتوری
جاری با یک
نام مسیر
پوچ (null) مشخص
میشود، که
میتواند
بلافاصله
بعد از
علامت
مساوی یا
بین
جداکنندههای
دو نقطه در
هر جای
دیگری از
فهرست
مسیرها
ظاهر شود.
اگر arg با یک
/ آغاز شود،
مسیر جستجو
استفاده
نمیشود. در
غیر این
صورت، هر
دایرکتوری
در مسیر
برای یافتن
arg جستجو
میشود.
شکل دوم cd رشته new را جایگزین رشته old در نام دایرکتوری جاری، یعنی PWD، کرده و تلاش میکند به این دایرکتوری جدید تغییر مکان دهد.
به طور پیشفرض، نامهای پیوند نمادین هنگام یافتن نام دایرکتوری به صورت تحتاللفظی رفتار میشوند. این معادل گزینه -L است. گزینه -P باعث میشود هنگام تعیین دایرکتوری، پیوندهای نمادین برطرف و حل شوند. آخرین نمونه از -L یا -P در خط فرمان تعیین میکند که از کدام روش استفاده شود.
دستور cd ممکن است توسط rksh. اجرا نشود.
- command [ -pvxV ] name [ arg ... ]
- بدون گزینههای -v یا -V، دستور command دستور name را با آرگومانهای ارائهشده توسط arg اجرا میکند. گزینه -p باعث میشود به جای مسیر تعریفشده توسط مقدار PATH، یک مسیر پیشفرض جستجو شود. هنگام یافتن name، توابع جستجو نخواهند شد. علاوه بر این، اگر name به یک دستور توکار ویژه اشاره کند، هیچیک از ویژگیهای خاص مرتبط با خنجرهای ابتدایی اعمال نخواهند شد. (برای مثال، نام مستعار از پیش تعریفشده redirect=′command exec′ از پایان یافتن اسکریپت در هنگام تغییر مسیر نامعتبر جلوگیری میکند.) با گزینه -x، اگر اجرای دستور به دلیل زیاد بودن بیش از حد آرگومانها با شکست مواجه شود (کد خطای E2BIG)، پوسته دستور name را چندین بار و با زیرمجموعهای از آرگومانها در هر بار فراخوانی اجرا خواهد کرد. آرگومانهایی که قبل از اولین کلمهای که به چندین آرگومان بسط مییابد و بعد از آخرین کلمهای که به چندین آرگومان بسط مییابد قرار دارند، در هر بار فراخوانی ارسال خواهند شد. وضعیت خروج برابر با بیشینه وضعیت خروج فراخوانیها خواهد بود. با گزینه -v، دستور command معادل دستور توکار whence است که در زیر شرح داده شده است. گزینه -V باعث میشود command مانند whence -v عمل کند.
- † continue [ n ]
- ادامه تکرار بعدی حلقه دربرگیرنده for، while، until یا select. اگر n مشخص شده باشد، اجرای حلقه از n-امین حلقه دربرگیرنده ادامه مییابد.
- disown [ job... ]
- باعث میشود هنگامی که یک پوسته ورود (login shell) خاتمه مییابد، پوسته سیگنال HUP را به هر job (کار) دادهشده ارسال نکند، یا در صورتی که job حذف شده باشد، به تمام کارهای فعال ارسال نکند.
- echo [ -n -e ] [ arg ... ]
- دستور توکار echo تمامی آرگومانهای خود را که با فاصله از هم جدا شدهاند چاپ کرده و با یک خط جدید به پایان میرساند. گزینه -n از قرار دادن نویسه خط جدید در انتهای خروجی صرفنظر میکند. اگر -e تنظیم شده باشد، تفسیر توالیهای گریز (escape sequences) را فعال میکند.
- †† enum [ -i ] type[=(value ... ]
- یک دستور
اعلانی به
نام type
ایجاد
میکند که
یک نوع عددی
صحیح است و
به یکی از
valueهای
مشخصشده
به عنوان
نامهای
شمارشی
اجازه
میدهد. اگر
=(value ...) حذف
شود، آنگاه
type باید یک
متغیر
آرایه
اندیسدار
با حداقل دو
عنصر باشد و
مقادیر از
این متغیر
آرایهای
گرفته
میشوند.
اگر -i مشخص
شده باشد،
مقادیر
حساس به
کوچک و
بزرگی حروف
نیستند.
هنگامی که یک متغیر شمارشی در یک عبارت محاسباتی استفاده میشود، مقدار آن برابر با اندیس در آرایه تعریفکننده آن با شروع از اندیس ۰ است. رشتههای شمارشی را میتوان در یک عبارت محاسباتی هنگام مقایسه با یک متغیر شمارشی استفاده کرد. همچنین، هر متغیر شمارشی بدون اندیس که پس از آن .name بیاید (که name یکی از نامهای شمارشی است)، به اندیس متناظر با name بسط مییابد.
نوع شمارشی _Bool با مقادیر true و false ایجاد میشود. نام مستعار از پیش تعریفشده bool به عنوان _Bool تعریف شده است.
- † eval [ arg ... ]
- آرگومانها به عنوان ورودی پوسته خوانده میشوند و دستور(ات) حاصل اجرا میگردند.
- † exec [ -c ] [ -a name ] [ arg ... ]
- اگر arg داده شود، دستور مشخصشده توسط آرگومانها به جای این پوسته بدون ایجاد یک فرآیند جدید اجرا میشود. گزینه -c باعث میشود محیط قبل از اعمال انتسابهای متغیر مرتبط با فراخوانی exec پاکسازی شود. گزینه -a باعث میشود name به جای اولین arg، به عنوان argv[0] برای فرآیند جدید در نظر گرفته شود. آرگومانهای ورودی/خروجی ممکن است ظاهر شده و بر فرآیند جاری تاثیر بگذارند. اگر arg داده نشود، اثر این دستور این است که توصیفگرهای پرونده را طبق فهرست تغییر مسیر ورودی/خروجی اصلاح کند. در این حالت، هر شماره توصیفگر پرونده بزرگتر از ۲ که با این سازوکار باز شده باشد، هنگام فراخوانی برنامه دیگر بسته میشود.
- † exit [ n ]
- باعث خروج پوسته با وضعیت خروج مشخصشده توسط n میشود. مقدار خروج برابر با کمارزشترین ۸ بیت از وضعیت مشخصشده خواهد بود. اگر n حذف شود، وضعیت خروج برابر با وضعیت آخرین دستور اجرا شده خواهد بود. رسیدن به پایان پرونده (EOF) نیز باعث خروج پوسته میشود، مگر برای پوستهای که گزینه ignoreeof در آن فعال باشد (دستور set در زیر را ببینید).
- †† export [ -p ] [ name[=value] ] ...
- اگر name داده نشود، نامها و مقادیر هر متغیر دارای خصیصه برونسپاری (export) چاپ میشوند، در حالی که مقادیر به گونهای نقلقول شدهاند که امکان ورود مجدد آنها فراهم باشد. دستور export همانند typeset -x است به جز اینکه اگر از export درون یک تابع استفاده کنید، هیچ متغیر محلی ایجاد نمیشود. گزینه -p باعث میشود کلمه export قبل از هر کدام درج شود. در غیر این صورت، nameهای دادهشده برای برونسپاری خودکار به environment (محیط) دستوراتی که پس از آن اجرا میشوند علامتگذاری میگردند.
- false
- کاری انجام نمیدهد و با وضعیت ۱ خارج میشود. همراه با until برای حلقههای بیپایان استفاده میشود.
- fg [ job... ]
- این دستور تنها در سیستمهایی که از کنترل کارها پشتیبانی میکنند در دسترس است. هر job (کار) مشخصشده به پیشزمینه آورده شده و به ترتیب مشخصشده منتظر آن میماند. در غیر این صورت، کار جاری به پیشزمینه آورده میشود. برای توضیحات مربوط به ساختار job، بخش Jobs را ببینید.
- getopts [ -a name ] optstring vname [ arg ... ]
- آرگومان arg
را برای
گزینههای
مجاز بررسی
میکند. اگر
arg حذف شود،
از
پارامترهای
مکانی
استفاده
میشود. یک
آرگومان
گزینه با +
یا - شروع
میشود.
گزینهای
که با + یا -
شروع نشود
یا آرگومان
-- به
گزینهها
پایان
میدهد.
گزینههایی
که با +
شروع
میشوند
تنها زمانی
شناسایی
میشوند که
optstring با یک +
شروع شود.
رشته optstring
شامل حروفی
است که getopts
آنها را
میشناسد.
اگر پس از
یک حرف
علامت :
بیاید،
انتظار
میرود آن
گزینه
دارای
آرگومان
باشد.
گزینهها
را میتوان
با فاصله از
آرگومان
جدا کرد.
گزینه -?
باعث
میشود getopts
یک پیام
نحوه
استفاده (usage)
در خروجی
خطای
استاندارد
تولید کند.
آرگومان -a
میتواند
برای تعیین
نام مورد
استفاده در
پیام نحوه
استفاده به
کار رود، که
به طور
پیشفرض $0
است.
دستور getopts هر بار که فراخوانی میشود، حرف گزینه بعدی را که مییابد درون متغیر vname قرار میدهد. هنگامی که arg با + آغاز شود، یک علامت + به ابتدای حرف گزینه اضافه خواهد شد. اندیس arg بعدی در OPTIND ذخیره میشود. آرگومان گزینه، در صورت وجود، در OPTARG ذخیره میگردد.
علامت : در ابتدای optstring باعث میشود getopts حرف یک گزینه نامعتبر را در OPTARG ذخیره کند، و در صورت ناشناخته بودن گزینه، مقدار vname را به ? و در صورت جا افتادن آرگومان الزامی گزینه، آن را به : تنظیم کند. در غیر این صورت، getopts یک پیام خطا چاپ میکند. هنگامی که گزینه دیگری وجود نداشته باشد، وضعیت خروج غیرصفر است.
هیچ راهی برای تعیین هیچیک از گزینههای :، +، -، ?، [ و ] وجود ندارد. گزینه # تنها میتواند به عنوان گزینه اول مشخص شود.
- hist [ -e ename ] [ -nlr ] [ first [ last ] ]
- hist -s [ old=new ] [ command ]
- در شکل اول، محدودهای از دستورات از first تا last از میان آخرین HISTSIZE دستوری که در ترمینال تایپ شدهاند انتخاب میشود. آرگومانهای first و last میتوانند به صورت یک عدد یا به عنوان یک رشته مشخص شوند. یک رشته برای یافتن جدیدترین دستوری که با رشته دادهشده شروع میشود استفاده میگردد. یک عدد منفی به عنوان آفست نسبت به شماره دستور جاری استفاده میشود. اگر گزینه -l انتخاب شود، دستورات در خروجی استاندارد فهرست میشوند. در غیر این صورت، برنامه ویرایشگر ename روی پروندهای حاوی این دستورات صفحهکلید فراخوانی میشود. اگر ename ارائه نشود، مقدار متغیر HISTEDIT استفاده میشود. اگر HISTEDIT تنظیم نشده باشد، آنگاه FCEDIT (پیشفرض /bin/ed) به عنوان ویرایشگر استفاده میشود. هنگامی که ویرایش کامل شد، دستور(ات) ویرایششده در صورت ذخیره شدن تغییرات اجرا میشوند. اگر last مشخص نشده باشد، روی first تنظیم خواهد شد. اگر first مشخص نشده باشد، مقدار پیشفرض برای ویرایش برابر با دستور قبلی و برای فهرست کردن برابر با -16 است. گزینه -r ترتیب دستورات را معکوس میکند و گزینه -n شماره دستورات را هنگام فهرست کردن حذف میکند. در شکل دوم، command همانطور که در بالا برای first شرح داده شد تفسیر میشود و پیشفرض آن آخرین دستور اجرا شده است. دستور حاصل پس از انجام جایگزینی اختیاری old=new اجرا میشود.
- jobs [ -lnp ] [ job ... ]
- اطلاعات مربوط به هر کار دادهشده را فهرست میکند؛ یا اگر job حذف شود، تمام کارهای فعال را فهرست میکند. گزینه -l علاوه بر اطلاعات عادی، شناسههای فرآیند (PID) را نیز فهرست میکند. گزینه -n تنها کارهایی را نمایش میدهد که از زمان آخرین اعلان متوقف شده یا خارج شدهاند. گزینه -p باعث میشود تنها گروه فرآیند (process group) فهرست شود. برای شرح ساختار job، بخش Jobs را ببینید.
- kill [ -s signame ] [ -q n ] job ...
- kill [ -n signum ] [ -q n ] job ...
- kill -Ll [ sig ... ]
- سیگنال TERM
(خاتمه) یا
سیگنال
مشخصشده
را به کارها
یا
فرآیندهای
تعیینشده
ارسال
میکند.
سیگنالها
یا با عدد
توسط گزینه
-n یا با نام
توسط گزینه
-s مشخص
میشوند
(همانطور
که در <signal.h>
داده شده
است، بدون
پیشوند «SIG»
به استثنای
اینکه SIGCLD با
نام CHLD
شناخته
میشود).
برای
سازگاری با
گذشته، n و
s
میتوانند
حذف شوند و
عدد یا نام
بلافاصله
بعد از -
قرار گیرد.
اگر سیگنال
ارسالی TERM
(خاتمه) یا HUP
(قطع
ارتباط)
باشد، در
صورت متوقف
بودن کار یا
فرآیند، یک
سیگنال CONT
(ادامه) نیز
به آن ارسال
خواهد شد.
آرگومان job
میتواند
شناسه
فرآیند (PID)
مربوط به
فرآیندی
باشد که
عضوی از یکی
از کارهای
فعال نیست.
برای
توضیحات
مربوط به
ساختار job،
بخش Jobs را
ببینید. در
شکل سوم، kill -l
یا kill -L، اگر
sig مشخص
نشده باشد،
نام
سیگنالها
فهرست
میشوند.
گزینه -l
تنها نام
سیگنالها
را فهرست
میکند.
گزینه -L هر
نام سیگنال
و شماره
متناظر با
آن را فهرست
میکند. در
غیر این
صورت، برای
هر sig که یک
نام است،
شماره
سیگنال
متناظر
فهرست
میشود.
برای هر sig
که یک عدد
است، نام
سیگنال
متناظر با
کمارزشترین
۸ بیت sig
فهرست
میشود.
در سیستمهایی که از sigqueue(2) پشتیبانی میکنند، گزینه -q میتواند برای ارسال یک سیگنال صفبندیشده با شماره پیام n استفاده شود. هر job مشخصشده باید یک عدد مثبت باشد. در سیستمهایی که از sigqueue(2) پشتیبانی نمیکنند، سیگنال بدون شماره پیام n ارسال میشود و سیگنال در صف قرار نخواهد گرفت. اگر سیگنال به دلیل بازگشت خطای EAGAIN نتواند در صف قرار گیرد، وضعیت خروج ۲ خواهد بود.
- let arg ...
- هر arg یک
عبارت
محاسباتی
جداگانه
است که باید
ارزیابی
شود. دستور
let تنها
زمانی
ثوابت
هشتهشتی
(اکتال)
شروعشده
با 0 را
شناسایی
میکند که
گزینه set با
نام letoctal روشن
و فعال
باشد. برای
شرح
ارزیابی
عبارات
محاسباتی،
بخش
ارزیابی
محاسباتی
(Arithmetic Evaluation) در
بالا را
ببینید.
وضعیت خروج در صورتی که مقدار آخرین عبارت غیرصفر باشد ۰ است و در غیر این صورت ۱ خواهد بود.
- † newgrp [ arg ... ]
- معادل exec /bin/newgrp arg ... است.
- print [ -CRenprsv ] [ -u unit] [ -f format ] [ arg ... ]
- بدون هیچ گزینهای یا با گزینه - یا --، هر arg در خروجی استاندارد چاپ میشود. گزینه -f باعث میشود آرگومانها طبق توصیف ارائهشده در printf چاپ شوند. در این حالت، هر یک از گزینههای e، n، r، R نادیده گرفته میشوند. در غیر این صورت، مگر اینکه -C، -R، -r، یا -v مشخص شده باشند، قواعد گریز (escape) زیر اعمال خواهند شد:
- \a
- نویسه هشدار/زنگ (اسکی 07).
- \b
- نویسه پسبر (اسکی 010).
- \c
- باعث میشود print بدون پردازش آرگومانهای بیشتر و بدون افزودن خط جدید به پایان برسد.
- \f
- نویسه تغذیه فرم/صفحه بعد (اسکی 014).
- \n
- نویسه خط جدید (اسکی 012).
- \r
- نویسه بازگشت به ابتدای خط (اسکی 015).
- \t
- نویسه تب افقی (اسکی 011).
- \v
- نویسه تب عمودی (اسکی 013).
- \E
- نویسه گریز/Escape (اسکی 033).
- \\
- نویسه بکاسلش \.
- \0x
- نویسه تعریفشده توسط رشته اکتال ۱، ۲ یا ۳ رقمی ارائهشده با x.
گزینه -R تمام آرگومانها و گزینههای بعدی به جز -n را چاپ میکند. گزینه -e باعث اعمال قواعد گریز بالا میشود. این رفتار پیشفرض است. این گزینه اثر گزینه قبلی -r را خنثی میکند. گزینه -p باعث میشود آرگومانها به جای خروجی استاندارد، در لوله (pipe) فرآیند ایجاد شده با ⎪& نوشته شوند. گزینه -v با هر arg به عنوان نام متغیر رفتار کرده و مقدار را در قالب %B دستور printf مینویسد. گزینه -C با هر arg به عنوان نام متغیر رفتار کرده و مقدار را در قالب %#B دستور printf مینویسد. گزینه -s باعث میشود آرگومانها به جای خروجی استاندارد در فایل تاریخچه نوشته شوند. گزینه -u میتواند برای تعیین شماره واحد توصیفگر فایل یکرقمی unit که خروجی باید روی آن قرار گیرد استفاده شود. مقدار پیشفرض ۱ است. اگر گزینه -n استفاده شود، هیچ خط جدیدی به خروجی اضافه نمیشود.
- printf [ -v varname ] format [ arg ... ]
- آرگومانهای arg بر اساس قواعد قالببندی ANSI-C مربوط به رشته قالب format در خروجی استاندارد چاپ میشوند. اگر تعداد آرگومانها از تعداد مشخصات قالب بیشتر باشد، رشته format برای قالببندی باقی آرگومانها دوباره استفاده میشود. اگر گزینه -v مشخص شده باشد، خروجی به متغیر varname اختصاص مییابد. افزونههای زیر نیز قابل استفاده هستند:
- %b
- قالب %b میتواند به جای %s استفاده شود تا توالیهای گریز در arg متناظر همانطور که در print توضیح داده شد بسط یابند.
- %B
- گزینه %B باعث میشود با هر یک از آرگومانها به عنوان نام متغیر رفتار شده و مقدار باینری متغیر چاپ شود. فلگ جایگزین # باعث میشود متغیر ترکیبی در یک خط خروجی داده شود. این ویژگی بیشترین کاربرد را برای متغیرهای ترکیبی و متغیرهایی با صفت -b دارد.
- %H
- قالب %H میتواند به جای %s استفاده شود تا نویسههای خاص HTML و XML در arg به صورت نام موجودیت (entity) آنها خروجی داده شوند. فلگ جایگزین # خروجی را برای استفاده به عنوان URI قالببندی میکند.
- %P
- قالب %P میتواند به جای %s استفاده شود تا arg به عنوان یک عبارت باقاعده گسترده تفسیر شده و به صورت یک الگوی پوسته چاپ شود.
- %R
- قالب %R میتواند به جای %s استفاده شود تا arg به عنوان الگوی پوسته تفسیر شده و به عنوان یک عبارت باقاعده گسترده چاپ شود.
- %q
- قالب %q میتواند به جای %s استفاده شود تا رشته حاصل به گونهای نقلقول شود که مجدداً برای پوسته به عنوان ورودی قابل استفاده باشد. هنگامی که قبل از q مشخصکننده قالب جایگزین # بیاید، رشته به شیوهای مناسب برای یک فیلد در فایل فرمت .csv نقلقول میشود.
- %(date-format)T
- قالب %(date-format)T میتواند برای رفتار با یک آرگومان به عنوان رشته تاریخ/زمان و قالببندی تاریخ/زمان مطابق با date-format همانطور که برای دستور date(1) تعریف شده استفاده شود. مقادیر مشخصشده به صورت ارقام مطابق توضیحات دستور touch(1) تفسیر میشوند.
- %Z
- قالب %Z یک بایت با مقدار 0 چاپ میکند.
- %d
- فیلد دقت قالب %d میتواند با یک . و مبنای خروجی دنبال شود. در این حالت، نویسه فلگ # باعث میشود base# به ابتدا اضافه گردد.
- #
- فلگ # هنگامی که همراه با قالب %d بدون مبنای خروجی استفاده شود، خروجی را در توانهای 1000 نشان میدهد که با یکی از پسوندهای زیر مشخص میشود: k M G T P E، و زمانی که همراه با قالب %i استفاده شود، خروجی را در توانهای 1024 نشان میدهد که با یکی از پسوندهای زیر مشخص میشود: Ki Mi Gi Ti Pi Ei.
- =
- فلگ = خروجی را در عرض فیلد مشخصشده در وسط تراز میکند.
- L
- فلگ L هنگامی که با قالبهای %c یا %s استفاده شود، دقت را به جای تعداد بایتها، به عنوان پهنای نویسه در نظر میگیرد.
- ,
- فلگ , هنگامی که با قالبهای %d یا %f استفاده شود، گروههای ارقام را با جداکننده گروهبندی (, روی گروههای ۳تایی در لوکال C) جدا میکند.
- pwd [ -LP ] [ -f fd ]
- مقدار دایرکتوری کاری جاری را خروجی میدهد. گزینه -L پیشفرض است؛ این گزینه نام منطقی دایرکتوری جاری را چاپ میکند. اگر گزینه -P داده شود، تمام پیوندهای نمادین از نام حل میشوند. آخرین نمونه از -L یا -P روی خط فرمان مشخص میکند کدام روش استفاده شود. اگر گزینه -f مشخص شود، نام دایرکتوری متناظر با توصیفگر فایل fd خروجی داده میشود.
- read [ -AaCSprsv ] [ -d delim] [ -n n] [ -N n] [ -m method] [ -t timeout] [ -u unit] [ vname?prompt ] [ vname ... ]
- سازوکار ورودی پوسته. یک خط خوانده شده و با استفاده از نویسههای موجود در IFS به عنوان جداکننده به فیلدها تقسیم میشود. نویسه گریز، \، برای حذف هرگونه معنی خاص برای نویسه بعدی و برای ادامه خط استفاده میشود. گزینه -d باعث میشود خواندن به جای خط جدید، تا اولین نویسه از delim ادامه یابد. گزینه -n باعث میشود حداکثر n بایت به جای یک خط کامل خوانده شود، اما هنگام خواندن از یک دستگاه کند، به محض خوانده شدن هر نویسهای بازمیگردد. گزینه -N باعث میشود دقیقاً n بایت خوانده شود مگر اینکه پایان فایل (EOF) رخ دهد یا خواندن به دلیل گزینه -t منقضی (timeout) شود. در حالت خام (raw)، -r، با نویسه \ به طور خاص رفتار نمیشود. فیلد اول به اولین vname، فیلد دوم به دومین vname و غیره اختصاص مییابد، و فیلدهای باقیمانده به آخرین vname اختصاص داده میشوند. هنگامی که vname دارای صفت باینری باشد و -n یا -N مشخص شده باشد، بایتهای خواندهشده مستقیماً در متغیر ذخیره میشوند. اگر -v مشخص شود، مقدار اولین vname به عنوان مقدار پیشفرض هنگام خواندن از یک دستگاه ترمینال استفاده خواهد شد. گزینه -A باعث میشود مقدار متغیر vname پاک (unset) شده و هر فیلد خواندهشده در عناصر متوالی آرایه شاخصدار vname ذخیره شود. -a یک نام مستعار برای -A است. گزینه -m یک متغیر ترکیبی را با روش خواندن تعریفشده توسط method میخواند. در حال حاضر، فقط روشهای json و ksh وجود دارند. گزینه -C باعث میشود متغیر vname به عنوان یک متغیر ترکیبی خوانده شود. فاصلههای خالی هنگام یافتن پرانتز باز ابتدایی نادیده گرفته میشوند. این معادل -m ksh است. گزینه -S باعث میشود با خط مانند یک رکورد در فایل فرمت .csv رفتار شود تا بتوان از نقلقول دوتایی (double quotes) برای مجاز ساختن نویسه جداکننده و خط جدید در درون یک فیلد استفاده کرد. گزینه -p باعث میشود خط ورودی از لوله ورودی فرآیندی که توسط پوسته با استفاده از ⎪& ایجاد شده گرفته شود. اگر گزینه -s وجود داشته باشد، ورودی به عنوان یک دستور در فایل تاریخچه ذخیره خواهد شد. گزینه -u میتواند برای تعیین واحد توصیفگر فایل یکرقمی unit جهت خواندن استفاده شود. توصیفگر فایل میتواند با دستور توکار ویژه exec باز شود. مقدار پیشفرض واحد n برابر 0 است. گزینه -t برای تعیین مهلت زمانی (timeout) بر حسب ثانیه هنگام خواندن از یک ترمینال یا لوله استفاده میشود. اگر vname حذف شود، آنگاه REPLY به عنوان vname پیشفرض استفاده میشود. پایان فایل با گزینه -p باعث پاکسازی برای این فرآیند میشود تا بتوان فرآیند دیگری را ایجاد کرد. اگر آرگومان اول شامل یک ? باشد، باقیمانده این کلمه به عنوان prompt در خطای استاندارد هنگام تعاملی بودن پوسته استفاده میشود. وضعیت خروج 0 است مگر اینکه پایان فایل رخ دهد یا read منقضی شود.
- †† readonly [ -p ] [ vname[=value] ] ...
- اگر vname داده نشود، نامها و مقادیر هر متغیر با صفت فقطخواندنی (readonly) چاپ میشود به طوری که مقادیر به گونهای نقلقول شدهاند که امکان ورود مجدد آنها وجود دارد. گزینه -p باعث میشود کلمه readonly قبل از هر یک درج شود. در غیر این صورت، vnameهای دادهشده به عنوان فقطخواندنی علامتگذاری میشوند و این نامها با انتسابهای بعدی قابل تغییر نیستند. هنگام تعریف یک نوع، اگر مقدار یک زیرمتغیر فقطخواندنی تعریف نشده باشد، هنگام ایجاد هر نمونه، تعیین مقدار الزامی است.
- † return [ n ]
- باعث میشود یک تابع پوسته یا اسکریپت . با وضعیت خروج مشخصشده توسط n به اسکریپت فراخوان بازگردد. مقدار برابر با ۸ بیت کمارزش وضعیت مشخصشده خواهد بود. اگر n حذف شود، وضعیت بازگشت همان وضعیت آخرین دستور اجراشده خواهد بود. اگر return در حالی فراخوانی شود که درون یک تابع یا اسکریپت . نیست، همانند exit رفتار میکند.
- † set [ ±BCGabefhkmnoprstuvx ] [ ±o [ option ] ] ... [ ±A vname ] [ -K keylist ] [ arg ... ]
- گزینههای این دستور دارای معانی زیر هستند:
- -A
- انتساب آرایه. اگر arg مشخص شده باشد، متغیر vname را پاک کرده و مقادیر را به صورت متوالی از فهرست arg اختصاص میدهد. اگر از +A استفاده شود، متغیر vname ابتدا پاک نمیشود.
- -B
- فعالسازی بسط گروه آکولاد (brace group expansion). به طور پیشفرض فعال است.
- -C
- از کوتاه کردن (truncate) فایلهای موجود توسط تغییر مسیر > جلوگیری میکند. فایلهایی که ایجاد میشوند با حالت O_EXCL باز میشوند. هنگامی که فعال باشد، برای کوتاه کردن یک فایل به >⎪ نیاز است.
- -G
- باعث میشود الگوی ** به تنهایی هنگام استفاده برای تولید نام فایل با فایلها و صفر یا چند دایرکتوری و زیردایرکتوری مطابقت داشته باشد. اگر با یک / دنبال شود، فقط با دایرکتوریها و زیردایرکتوریها مطابقت مییابد.
- -H
- فعالسازی بسط تاریخچه به سبک ! مشابه با csh(1).
- -K
- هنگامی که هیچ آرگومانی مشخص نشده باشد، همراه با -s برای تعیین فیلدهای مرتبسازی و گزینههای مرتبسازی یک آرایه استفاده میشود. (برای توضیح گزینه keylist بخش «مرتبسازی آرایهها» در بالا را ببینید.)
- -a
- تمام متغیرهای بعدی که تعریف میشوند به طور خودکار صادر (export) میشوند.
- -b
- پیامهای اتمام کار را به محض تغییر وضعیت یک کار پسزمینه چاپ میکند، به جای اینکه تا اعلان بعدی منتظر بماند.
- -e
- مگر اینکه درون یک دستور ⎪⎪ یا && باشد، یا دستور پس از یک دستور if، while یا until باشد یا در خط لوله پس از ! قرار داشته باشد، اگر دستوری وضعیت خروج غیرصفر داشته باشد، تله (trap) ERR را در صورت تنظیم بودن اجرا کرده و خارج میشود. این حالت هنگام خواندن پروفایلها غیرفعال است.
- -f
- تولید نام فایل را غیرفعال میکند.
- -h
- هر دستور در اولین مواجهه تبدیل به یک نام مستعار ردیابیشده (tracked alias) میشود.
- -k
- (منسوخشده). تمام آرگومانهای انتساب متغیر در محیط برای یک دستور قرار میگیرند، نه فقط مواردی که قبل از نام دستور میآیند.
- -m
- کارهای پسزمینه در یک گروه فرآیند جداگانه اجرا میشوند و پس از اتمام یک خط چاپ میشود. وضعیت خروج کارهای پسزمینه در یک پیام اتمام گزارش میشود. در سیستمهای دارای کنترل کار (job control)، این گزینه برای پوستههای تعاملی به طور خودکار فعال است.
- -n
- دستورات را خوانده و آنها را از نظر خطاهای نحوی بررسی میکند، اما آنها را اجرا نمیکند. برای پوستههای تعاملی نادیده گرفته میشود.
- -o
- آرگومان بعدی میتواند یکی از نامهای گزینه زیر باشد:
- allexport
- همان -a.
- bgnice
- تمام کارهای پسزمینه با اولویت پایینتر اجرا میشوند. این حالت پیشفرض است.
- braceexpand
- همان -B.
- emacs
- شما را در یک ویرایشگر درونخطی به سبک emacs برای ورود دستور قرار میدهد.
- errexit
- همان -e.
- globstar
- همان -G.
- gmacs
- شما را در یک ویرایشگر درونخطی به سبک gmacs برای ورود دستور قرار میدهد.
- histexpand
- همان -H.
- ignoreeof
- پوسته با پایان فایل (EOF) خارج نمیشود. باید از دستور exit استفاده شود.
- keyword
- همان -k.
- letoctal
- دستور let ثابتهای اکتال را که با 0 شروع میشوند مجاز میداند.
- markdirs
- به انتهای تمام نامهای دایرکتوری حاصل از تولید نام فایل یک / اضافه میشود.
- monitor
- همان -m.
- multiline
- ویرایشگرهای توکار برای خطوطی که طولانیتر از عرض صفحه نمایش هستند از چندین خط روی صفحه استفاده میکنند. این ممکن است برای همه ترمینالها کار نکند.
- noclobber
- همان -C.
- noexec
- همان -n.
- noglob
- همان -f.
- nolog
- تعاریف توابع را در فایل تاریخچه ذخیره نمیکند.
- notify
- همان -b.
- nounset
- همان -u.
- pipefail
- یک خط لوله تا زمانی که تمام اجزای خط لوله کامل نشوند تکمیل نمیشود، و مقدار بازگشتی برابر با مقدار آخرین دستور غیرصفر خواهد بود که شکست خورده است، یا در صورتی که هیچ دستوری شکست نخورده باشد برابر با صفر خواهد بود.
- privileged
- همان -p.
- showme
- هنگامی که فعال باشد، دستورات ساده یا خطوط لولهای که قبل از آنها یک نقطهویرگول (;) آمده باشد، طوری نمایش داده میشوند که گویی گزینه xtrace فعال است اما اجرا نخواهند شد. در غیر این صورت، ; ابتدایی نادیده گرفته میشود.
- trackall
- همان -h.
- verbose
- همان -v.
- vi
- شما را در حالت درج یک ویرایشگر درونخطی به سبک vi قرار میدهد تا زمانی که نویسه گریز 033 را فشار دهید. این شما را در حالت کنترل قرار میدهد. کلید Return خط را ارسال میکند.
- viraw
- هر نویسه به محض تایپ شدن در حالت vi پردازش میشود. این گزینه اکنون همیشه فعال است. غیرفعال کردن آن در زمان اجرا اثری ندارد.
- xtrace
- همان -x.
اگر هیچ نام گزینهای ارائه نشود، تنظیمات گزینههای جاری چاپ میشوند.
- -p
- پردازش فایل $HOME/.profile را غیرفعال کرده و از فایل /etc/suid_profile به جای فایل ENV استفاده میکند. این حالت هر زمان که uid (یا gid) مؤثر با uid (یا gid) واقعی برابر نباشد روشن است. خاموش کردن این گزینه باعث میشود uid و gid مؤثر به uid و gid واقعی تنظیم شوند.
- -r
- پوسته محدود (restricted shell) را فعال میکند. این گزینه پس از تنظیم قابل لغو نیست.
- -s
- پارامترهای موضعی را به ترتیب الفبایی مرتب میکند. هنگامی که با -A استفاده شود، عناصر آرایه را مرتب میکند.
- -t
- (منسوخشده). پس از خواندن و اجرای یک دستور خارج میشود.
- -u
- هنگام جایگزینی، با پارامترهای تنظیمنشده به عنوان خطا برخورد میکند.
- -v
- خطوط ورودی پوسته را هنگام خوانده شدن چاپ میکند.
- -x
- دستورات و آرگومانهای آنها را هنگام اجرا چاپ میکند.
- --
- هیچیک از گزینهها را تغییر نمیدهد؛ در تنظیم $1 به مقداری که با - شروع میشود مفید است. اگر هیچ آرگومانی بعد از این گزینه نیاید، پارامترهای موضعی پاک (unset) میشوند.
به عنوان یک ویژگی منسوخشده، اگر اولین arg برابر با - باشد، آنگاه گزینههای -x و -v خاموش میشوند و arg بعدی به عنوان اولین آرگومان در نظر گرفته میشود. استفاده از + به جای - باعث خاموش شدن این گزینهها میشود. این گزینهها همچنین میتوانند هنگام فراخوانی پوسته استفاده شوند. مجموعه گزینههای جاری را میتوان در $- یافت. مگر اینکه -A مشخص شده باشد، باقی آرگومانها پارامترهای موضعی هستند و به ترتیب به $1 $2 ... اختصاص مییابند. اگر هیچ آرگومانی داده نشود، نامها و مقادیر تمام متغیرها در خروجی استاندارد چاپ میشوند.
- † shift [ n ]
-
پارامترهای موضعی از $n+1 ... به $1 ... تغییر نام مییابند، مقدار پیشفرض n برابر ۱ است. پارامتر n میتواند هر عبارت حسابی باشد که به یک عدد نامنفی کمتر یا مساوی با $# ارزیابی شود. - sleep seconds
- اجرا را برای تعداد ثانیههای اعشاری یا کسری از ثانیه که توسط seconds مشخص شده به حالت تعلیق درمیآورد. میتوان از پسوند یکی از smhd به ترتیب برای مشخص کردن ثانیه، دقیقه، ساعت و روز استفاده کرد. همچنین ثانیهها را میتوان با استفاده از قالب تاریخ/زمان مشخص کرد.
- times
- زمان CPU مصرفشده توسط پوسته و تمام فرآیندهای فرزند آن را نمایش میدهد.
- † trap [ -alp ] [ action ] [ sig ] ...
- گزینهٔ -p
باعث
میشود
عملیات تله
(action) مرتبط با
هر تله
مطابق با
آرگومانهای
مشخصشده
همراه با
نقلقولگذاری
مناسب چاپ
شود. در غیر
این صورت،
هنگام
دریافت
سیگنال(های)
sig توسط
پوسته، action
بهگونهای
پردازش
میشود که
گویی
آرگومانی
برای دستور
eval است.
گزینهٔ -a باعث میشود تنظیمات فعلی تله به انتهای action اضافه شود. هر sig میتواند به صورت عدد یا نام سیگنال مشخص شود. دستورات تله به ترتیب شماره سیگنال اجرا میشوند. هرگونه تلاش برای تنظیم تله روی سیگنالی که در بدو ورود به پوستهٔ جاری نادیده گرفته شده بود، بیاثر است. اگر action حذف شود و نخستین sig یک عدد باشد، یا اگر action برابر با - باشد، تله(های) مربوط به هر sig به مقادیر اصلی خود بازنشانی میشوند. اگر action رشتهٔ تهی باشد، این سیگنال توسط پوسته و دستوراتی که فراخوانی میکند نادیده گرفته میشود.
اگر sig برابر با ERR باشد، action هر زمان که دستوری با وضعیت خروج غیرصفر پایان یابد، اجرا خواهد شد.
اگر sig برابر با DEBUG باشد، action پیش از هر دستور اجرا میشود. متغیر .sh.command شامل محتویات خط فرمان جاری هنگام اجرای action خواهد بود. اگر وضعیت خروج تله 2 باشد، دستور اجرا نخواهد شد. اگر وضعیت خروج تله 255 باشد و داخل یک تابع یا اسکریپت دات (نقطهای) اجرا شود، تابع یا اسکریپت بازمیگردد.
اگر sig برابر با 0 یا EXIT باشد و عبارت trap درون بدنهٔ تابعی که با ساختار function name تعریف شده اجرا شود، دستور action پس از اتمام تابع اجرا میگردد. برای trap تنظیمشده خارج از هر تابع، دستور action هنگام خروج از پوسته اجرا میشود.
اگر sig برابر با KEYBD باشد، action هر زمان که کلیدی در حالتهای emacs، gmacs یا vi خوانده شود، اجرا خواهد شد. دستور trap بدون آرگومان، فهرستی از دستورات مرتبط با هر شماره سیگنال را چاپ میکند.
یک دستور exit یا return بدون آرگومان درون عملیات تله، وضعیت خروج دستوری را که موجب فراخوانی تله شده حفظ میکند. گزینهٔ -l سیگنالها و شمارههای آنها را در خروجی استاندارد فهرست میکند.
- true
- کاری انجام نمیدهد و با وضعیت ۰ خارج میشود. همراه با while برای ایجاد حلقههای بینهایت استفاده میشود.
- †† typeset [ ±ACHSfblmnprstux ] [ ±EFLRXZi[n] ] [ +-M [ mapname ] ] [ -T [ tname=(assign_list) ] ] [ -h str ] [ -a [type] ] [ vname[=value ] ] ...
- ویژگیها و مقادیر متغیرها و توابع پوسته را تنظیم میکند. هنگامی که درون تابعی تعریفشده با ساختار function name فراخوانی شود، یک نمونهٔ جدید از متغیر vname ایجاد میشود و مقدار و نوع متغیر پس از اتمام تابع بازیابی میگردد. فهرست ویژگیهای زیر را میتوان مشخص کرد:
- -A
- متغیر vname را به عنوان یک آرایهٔ انجمنی اعلان میکند. اندیسها بهجای عبارتهای محاسباتی، رشته هستند.
- -C
- باعث میشود هر vname یک متغیر ترکیبی باشد. اگر value نام یک متغیر ترکیبی باشد، در vname کپی میشود. در غیر این صورت، هر vname را لغو مقدار میکند.
- -a
- متغیر vname را به عنوان یک آرایهٔ اندیسی اعلان میکند. اگر type مشخص شده باشد، باید نام یک نوع شمارشی باشد که با دستور enum ایجاد شده است و امکان استفاده از ثابتهای شمارشی به عنوان اندیس را فراهم میسازد.
- -E
- متغیر vname را به عنوان عدد ممیز شناور با دقت مضاعف (دوبل) اعلان میکند. اگر n غیرصفر باشد، تعداد ارقام بااهمیت مورد استفاده هنگام بسط vname را تعیین میکند؛ در غیر این صورت، ده رقم بااهمیت استفاده خواهد شد.
- -F
- متغیر vname را به عنوان عدد ممیز شناور با دقت مضاعف اعلان میکند. اگر n غیرصفر باشد، تعداد ارقام اعشار پس از ممیز مورد استفاده هنگام بسط vname را تعیین میکند؛ در غیر این صورت ده رقم پس از ممیز استفاده خواهد شد.
- -H
- این گزینه نگاشت فایل یونیکس به نام میزبان را روی سیستمهای غیریونیکس فراهم میکند.
- -L
- چپچین کردن و حذف فاصلههای ابتدایی از value. اگر n غیرصفر باشد، عرض فیلد را تعیین میکند، در غیر این صورت بر اساس عرض مقدار در اولین انتساب تعیین میشود. هنگامی که به متغیر مقداری انتساب داده شود، در سمت راست با فاصله پر شده یا در صورت نیاز کوتاه میشود تا در فیلد جا گیرد. گزینهٔ -R غیرفعال میشود.
- -M
- استفاده از نگاشت نویسهای mapping تعریفشده توسط wctrans(3) مانند tolower و toupper هنگام انتساب مقدار به هر یک از عملوندهای مشخصشده. هنگامی که mapping مشخص شده باشد و هیچ عملوندی وجود نداشته باشد، تمام متغیرهایی که از این نگاشت استفاده میکنند در خروجی استاندارد نوشته میشوند. هنگامی که mapping حذف شود و هیچ عملوندی نباشد، تمام متغیرهای نگاشتشده در خروجی استاندارد نوشته میشوند.
- -R
- راستچین کردن و پر کردن با فاصلههای ابتدایی. اگر n غیرصفر باشد، عرض فیلد را تعیین میکند، در غیر این صورت بر اساس عرض مقدار در اولین انتساب تعیین میشود. فیلد از سمت چپ با فاصله پر شده یا در صورت انتساب مجدد متغیر، از انتها بریده میشود. گزینهٔ -L غیرفعال میشود.
- -S
- هنگامی که درون assign_list یک تعریف نوع استفاده شود، باعث میشود زیرمتغیر مشخصشده بین تمام نمونههای آن نوع به اشتراک گذاشته شود. هنگامی که درون تابعی تعریفشده با کلمهٔ رزروشدهٔ function استفاده شود، متغیرهای مشخصشده دارای حوزهٔ function static خواهند بود. در غیر این صورت، متغیر پیش از پردازش فهرست انتساب لغو مقدار میشود.
- -T
- اگر به دنبال آن tname بیاید، نوعی به نام tname با استفاده از انتساب ترکیبی assign_list به tname ایجاد میکند. در غیر این صورت، تمام تعاریف نوع را در خروجی استاندارد مینویسد.
- -X
- متغیر vname را به عنوان عدد ممیز شناور با دقت مضاعف اعلان کرده و با قالب %a استاندارد ISO-C99 بسط میدهد. اگر n غیرصفر باشد، تعداد ارقام هگزادسیمال پس از ممیز مبنا هنگام بسط vname را مشخص میکند. مقدار پیشفرض ۱۰ است.
- -Z
- راستچین کردن و پر کردن با صفرهای ابتدایی، در صورتی که نخستین نویسهٔ غیرفاصله یک رقم باشد و گزینهٔ -L تنظیم نشده باشد. اگر گزینهٔ -L نیز تنظیم شده باشد، صفرهای ابتدایی حذف میشوند. اگر n غیرصفر باشد، عرض فیلد را تعیین میکند، در غیر این صورت بر اساس عرض مقدار در اولین انتساب تعیین میشود.
- -f
- نامها بهجای نام متغیر، به نام تابع اشاره دارند. هیچ انتسابی نمیتوان انجام داد و تنها گزینههای معتبر دیگر -S، -t، -u و -x هستند. گزینهٔ -S میتواند همراه با توابع دیسیپلین تعریفشده در یک نوع استفاده شود تا نشان دهد تابع ایستا (static) است. برای یک تابع ایستا، صرفنظر از اینکه کدام نمونه به آن رجوع کند، همان متد توسط تمام نمونههای آن نوع استفاده خواهد شد. علاوه بر این، تنها میتواند از مقادیر متغیرهای تعریف نوع اصلی استفاده کند. این توابع دیسیپلین را نمیتوان در هیچ نمونهای از نوع بازتعریف کرد. گزینهٔ -t ردیابی اجرای این تابع را فعال میکند. گزینهٔ -u باعث میشود این تابع به عنوان تعریفنشده علامتگذاری شود. هنگام ارجاع به تابع، متغیر FPATH برای یافتن تعریف تابع جستجو خواهد شد. اگر هیچ گزینهای به جز -f مشخص نشده باشد، تعریف تابع در خروجی استاندارد نمایش داده میشود. اگر +f مشخص شود، خطی شامل نام تابع به همراه یک کامنت پوسته حاوی شماره خط و مسیر فایلی که این تابع در آن تعریف شده است (در صورت وجود) نمایش مییابد. وضعیت خروج میتواند برای تعیین اینکه آیا تابع تعریف شده است یا خیر استفاده شود؛ به طوری که typeset -f .sh.math.name در صورت تعریف بودن تابع ریاضی name مقدار ۰ و در غیر این صورت مقداری غیرصفر برمیگرداند.
- -b
- متغیر میتواند هر تعداد بایت داده را در خود نگه دارد. دادهها میتوانند متنی یا باینری باشند. مقدار با کدگذاری base64 دادهها نشان داده میشود. اگر -Z نیز مشخص شود، اندازهٔ بافر به بایت توسط اندازهٔ مرتبط با -Z تعیین میشود. اگر رشتهٔ base64 انتسابدادهشده دادهٔ بیشتری تولید کند، بریده خواهد شد؛ در غیر این صورت با بایتهایی با مقدار صفر پر میشود. قالب %B در printf میتواند برای خروجی دادن دادههای واقعی این بافر بهجای کدگذاری base64 استفاده شود.
- -h
- درون تعاریف نوع برای افزودن اطلاعات هنگام تولید اطلاعات دربارهٔ زیرمتغیر در صفحهٔ راهنما (man page) استفاده میشود. هنگامی که خارج از تعریف نوع استفاده شود نادیده گرفته میشود. هنگام استفاده با -f اطلاعات به تابع دیسیپلین مربوطه مرتبط میشود.
- -i
- متغیر vname را به عنوان نمایش داخلی عدد صحیح اعلان میکند. سمت راست انتساب هنگام انتساب به یک عدد صحیح، به عنوان یک عبارت محاسباتی ارزیابی میشود. اگر n غیرصفر باشد، مبنای محاسباتی خروجی را تعیین میکند؛ در غیر این صورت مبنای خروجی ده خواهد بود.
- -l
- همراه با -i، -E یا -F برای نشان دادن عدد صحیح بزرگ (long) یا ممیز شناور با دقت مضاعف بزرگ (long double) استفاده میشود. در غیر این صورت، تمام نویسههای بزرگ انگلیسی به نویسههای کوچک تبدیل میشوند. گزینهٔ حروف بزرگ، -u، غیرفعال میشود. معادل با -M tolower .
- -m
- متغیر را منتقل کرده یا تغییر نام میدهد. مقدار برابر با نام متغیری است که مقدار آن به vname منتقل خواهد شد. متغیر اصلی لغو مقدار میشود. نمیتواند با هیچ گزینهٔ دیگری استفاده شود.
- -n
- متغیر vname را به عنوان مرجعی به متغیری که نام آن توسط مقدار متغیر vname تعیین شده است، اعلان میکند. این معمولاً برای ارجاع به متغیری درون یک تابع که نام آن به عنوان آرگومان ارسال شده استفاده میشود. نمیتواند با هیچ گزینهٔ دیگری استفاده شود.
- -p
- نام، ویژگیها و مقادیر برای vnameهای دادهشده به شکلی در خروجی استاندارد نوشته میشوند که بتوانند به عنوان ورودی پوسته استفاده شوند. اگر +p مشخص شود، مقادیر نمایش داده نمیشوند.
- -r
- vnameهای دادهشده به عنوان فقطخواندنی علامتگذاری میشوند و این نامها را نمیتوان با انتسابهای بعدی تغییر داد.
- -s
- همراه با -i، -E یا -F برای نشان دادن عدد صحیح کوتاه (short) یا ممیز شناور با دقت یگانه (float) استفاده میشود.
- -t
- متغیرها را برچسبگذاری (تگ) میکند. برچسبها توسط کاربر قابل تعریف هستند و معنای خاصی برای پوسته ندارند.
- -u
- هنگامی که همراه با -i داده شود، عدد صحیح بدون علامت را مشخص میکند. در غیر این صورت، تمام نویسههای کوچک به حروف بزرگ تبدیل میشوند. گزینهٔ حروف کوچک، -l، غیرفعال میشود. معادل با -M toupper .
- -x
- vnameهای دادهشده برای صدور خودکار به محیط (environment) دستوراتی که در ادامه اجرا میشوند علامتگذاری میشوند. متغیرهایی که نام آنها حاوی . است را نمیتوان صادر کرد.
ویژگی -i را نمیتوان همراه با -R، -L، -Z یا -f مشخص کرد.
استفاده از + بهجای - باعث خاموش شدن این گزینهها میشود. اگر هیچ آرگومان vname داده نشود، فهرستی از vnameها (و در صورت تمایل مقادیر) متغیرها چاپ میشود. (استفاده از + بهجای - مانع از چاپ مقادیر میشود.) گزینهٔ -p باعث میشود typeset به همراه حروف گزینهها قبل از هر نام چاپ شود، بهجای نام خود گزینهها. اگر گزینهای به جز -p داده شود، تنها آن متغیرهایی که دارای تمام گزینههای دادهشده هستند چاپ میشوند. در غیر این صورت، vnameها و ویژگیهای تمام متغیرهایی که دارای ویژگی هستند چاپ میشوند.
- ulimit [ -HSacdfmnpstv ] [ limit ]
- تنظیم یا نمایش محدودیت منابع سیستم. محدودیتهای منابع موجود در زیر فهرست شدهاند. بسیاری از سیستمها از یک یا چند مورد از این محدودیتها پشتیبانی نمیکنند. محدودیت برای یک منبع مشخص زمانی تنظیم میشود که limit مشخص شده باشد. مقدار limit میتواند عددی در واحد مشخصشده در زیر برای هر منبع باشد، یا مقدار unlimited. گزینههای -H و -S مشخص میکنند که آیا محدودیت سخت (hard) یا محدودیت نرم (soft) برای منبع دادهشده تنظیم شود. یک محدودیت سخت را پس از تنظیم نمیتوان افزایش داد. یک محدودیت نرم را میتوان تا سقف مقدار محدودیت سخت افزایش داد. اگر هیچیک از گزینههای H یا S مشخص نشوند، محدودیت روی هر دو اعمال میشود. محدودیت فعلی منبع زمانی چاپ میشود که limit حذف شده باشد. در این حالت، محدودیت نرم چاپ میشود مگر اینکه H مشخص شده باشد. هنگامی که بیش از یک منبع مشخص شود، نام منبع و واحد آن پیش از مقدار چاپ میشود.
- -a
- فهرست کردن تمام محدودیتهای فعلی منابع.
- -c
- تعداد بلوکهای ۵۱۲ بایتی روی اندازهٔ core dumpها.
- -d
- تعداد کیلوبایتها روی اندازهٔ ناحیهٔ داده (data area).
- -f
- تعداد بلوکهای ۵۱۲ بایتی روی فایلهایی که میتوانند توسط فرآیند جاری یا فرآیندهای فرزند نوشته شوند (فایلها با هر اندازهای میتوانند خوانده شوند).
- -m
- تعداد کیلوبایتها روی اندازهٔ حافظهٔ فیزیکی.
- -n
- تعداد توصیفکنندههای فایل (file descriptors) بهعلاوهٔ ۱.
- -p
- تعداد بلوکهای ۵۱۲ بایتی برای بافرینگ لوله (pipe).
- -s
- تعداد کیلوبایتها روی اندازهٔ ناحیهٔ پشته (stack area).
- -t
- تعداد ثانیههای پردازنده (CPU) مورد استفاده توسط هر فرآیند.
- -v
- تعداد کیلوبایتها برای حافظهٔ مجازی.
اگر هیچ گزینهای داده نشود، -f فرض میشود.
- umask [ -pS ] [ mask ]
- ماسک ایجاد فایل کاربر روی mask تنظیم میشود (ببینید: umask(2)). mask میتواند یک عدد اکتال (هشتهشتی) یا یک مقدار نمادین مطابق با توضیحات chmod(1) باشد. اگر یک مقدار نمادین داده شود، مقدار جدید umask متمم حاصل اعمال mask بر متمم مقدار قبلی umask است. اگر mask حذف شود، مقدار فعلی ماسک چاپ میشود. گزینهٔ -S باعث میشود حالت به عنوان یک مقدار نمادین چاپ شود؛ در غیر این صورت ماسک در مبنای هشت چاپ میشود. گزینهٔ -p باعث میشود خروجی به شکلی باشد که بتواند برای ورود مجدد به پوسته استفاده شود.
- † unalias [ -a ] name ...
- نامهای مستعار مشخصشده در فهرست nameها از فهرست نامهای مستعار حذف میشوند. گزینهٔ -a باعث حذف تمام نامهای مستعار میشود.
- †unset [ -fnv ] vname ...
- متغیرهای مشخصشده توسط فهرست vnameها لغو انتساب میشوند؛ یعنی به جز زیرمتغیرهای درون یک نوع، مقادیر و ویژگیهای آنها پاک میشود. برای زیرمتغیرهای یک نوع، مقادیر به مقدار پیشفرض از تعریف نوع بازنشانی میشوند. متغیرهای فقطخواندنی را نمیتوان لغو انتساب کرد. اگر گزینهٔ -f تنظیم شده باشد، نامها به نامهای تابع اشاره دارند. اگر گزینهٔ -v تنظیم شده باشد، نامها به نامهای متغیر اشاره دارند. گزینهٔ -f بر -v تقدم دارد. اگر -n تنظیم شده باشد و name یک ارجاع نام باشد، خود name لغو مقدار میشود نه متغیری که به آن ارجاع دارد. حالت پیشفرض معادل -v است. لغو انتساب متغیرهای LINENO، MAILCHECK، OPTARG، OPTIND، RANDOM، SECONDS، TMOUT و _ معنای ویژهٔ آنها را حذف میکند، حتی اگر بعداً به آنها مقداری انتساب داده شود.
- wait [ job ... ]
- منتظر ماندن برای job (کار/شغل) مشخصشده و گزارش وضعیت خاتمهٔ آن. اگر job داده نشود، برای تمام فرآیندهای فرزند فعال فعلی انتظار کشیده میشود. وضعیت خروج این دستور در صورتی که job مشخص شده باشد، برابر با وضعیت آخرین فرآیند منتظر مانده است؛ در غیر این صورت صفر خواهد بود. برای توضیحات قالب job، بخش Jobs را ببینید.
- whence [ -afpv ] name ...
- برای هر name،
مشخص
میکند که
در صورت
استفاده به
عنوان نام
دستور
چگونه
تفسیر
خواهد شد.
گزینهٔ -v گزارش جامعتری تولید میکند. گزینهٔ -f از جستجو برای توابع صرفنظر میکند. گزینهٔ -p یک جستجوی مسیر (PATH) برای name انجام میدهد، حتی اگر name یک نام مستعار، تابع یا کلمهٔ رزروشده باشد. گزینهٔ -p گزینهٔ -v را غیرفعال میکند. گزینهٔ -a مشابه گزینهٔ -v است اما باعث میشود تمام تفسیرهای ممکن برای نام دادهشده گزارش شوند.
فراخوانی (Invocation)
اگر شل توسط exec(2) فراخوانی شود و اولین نویسه از آرگومان صفر ($0) برابر با - باشد، شل به عنوان یک شل ورود (login) فرض میشود و دستورها از /etc/profile و سپس از $HOME/.profile (در صورت وجود) خوانده میشوند. همچنین، گزینه -l باعث میشود که شل به عنوان یک شل ورود در نظر گرفته شود. سپس، برای شلهای تعاملی، دستورها از پروندهای خوانده میشوند که نام آن از طریق گسترش پارامتر، جایگزینی دستور و جایگزینی محاسباتی روی مقدار متغیر محیطی ENV (در صورت وجود پرونده) تعیین میشود. اگر گزینه -s داده نشده باشد و آرگومان arg ارائه شده و پروندهای با نام arg وجود داشته باشد، این اسکریپت را خوانده و اجرا میکند. در غیر این صورت، اگر اولین arg حاوی / نباشد، یک جستجوی مسیر روی اولین arg برای تعیین نام اسکریپت اجرایی انجام میشود. اسکریپت arg باید مجوز اجرا داشته باشد و هرگونه تنظیمات setuid و setgid نادیده گرفته خواهد شد. اگر اسکریپت در مسیر پیدا نشود، با arg بهگونهای رفتار میشود که گویی نام یک دستور یا تابع توکار است. سپس دستورها مطابق توضیحات زیر خوانده میشوند؛ گزینههای زیر هنگام فراخوانی توسط شل تفسیر میشوند:
- -D
- فهرستی از تمام رشتههای داخل نقلقول دوگانه که قبل از آنها یک $ آمده است در خروجی استاندارد چاپ شده و شل خارج میشود. این مجموعه از رشتهها در صورتی که محلیسازی (locale) چیزی غیر از C یا POSIX باشد، مشمول ترجمه زبانی خواهند شد. هیچ دستوری اجرا نخواهد شد.
- -E
- پرونده مشخصشده توسط متغیر ENV یا در صورت تعریف نشدن پس از پروفایلها، پرونده $HOME/.kshrc را میخواند.
- -c
- اگر گزینه -c وجود داشته باشد، دستورها از اولین arg خوانده میشوند. هرگونه آرگومان باقیمانده به پارامترهای مکانی تبدیل میشود که از 0 شروع میشوند.
- -s
- اگر گزینه -s وجود داشته باشد یا هیچ آرگومانی باقی نمانده باشد، دستورها از ورودی استاندارد خوانده میشوند. خروجی شل، به جز خروجی دستورهای ویژه (Special Commands) ذکرشده در بالا، در توصیفکننده پرونده ۲ نوشته میشود.
- -i
- اگر گزینه -i وجود داشته باشد یا اگر ورودی و خروجی خطای شل به یک ترمینال متصل باشند (همانطور که توسط tcgetattr(2) گزارش میشود)، این شل تعاملی (interactive) خواهد بود. در این حالت TERM نادیده گرفته میشود (بهطوری که kill 0 شل تعاملی را متوقف نمیکند) و INTR دریافت و نادیده گرفته میشود (بهطوری که wait قابل وقفه باشد). در تمام موارد، QUIT توسط شل نادیده گرفته میشود.
- -r
- اگر گزینه -r وجود داشته باشد، شل یک شل محدودشده (restricted shell) است.
- -P
- اگر -P یا -o profile وجود داشته باشد، شل یک شل پروفایل است (به pfexec(1) مراجعه کنید).
- -R filename
- گزینه -R filename برای تولید یک پایگاه داده ارجاع متقابل استفاده میشود که میتواند توسط یک ابزار مجزا برای یافتن تعاریف و ارجاعات متغیرها و دستورها به کار رود. آرگومان filename پایگاه داده تولیدشده را مشخص میکند. یک پرونده اسکریپت نیز باید در خط فرمان ارائه شود.
سایر گزینهها و آرگومانها در بخش دستور set در بالا توضیح داده شدهاند. یک علامت - اختیاری به عنوان اولین آرگومان نادیده گرفته میشود.
فقط Rksh (Rksh Only)
Rksh برای تنظیم نامهای ورود و محیطهای اجرایی به کار میرود که قابلیتهای آنها نسبت به شل استاندارد کنترلشدهتر است. عملکرد rksh دقیقاً همانند ksh, است، به جز اینکه موارد زیر مجاز نیستند:
غیرفعال
کردن گزینه
restricted.
تغییر
دایرکتوری
(به cd(1)
مراجعه
کنید)،
تنظیم یا
حذف مقدار
یا
ویژگیهای
SHELL، ENV، FPATH یا
PATH،
مشخص کردن
مسیر یا نام
دستورات
حاوی /،
تغییر مسیر
خروجی (>،
>|، <> و >>).
افزودن یا
حذف
دستورهای
توکار.
استفاده از
command -p برای
فراخوانی
یک دستور.
محدودیتهای فوق پس از تفسیر پروندههای .profile و ENV اعمال میشوند.
هنگامی که دستوری که باید اجرا شود یک رویه شل (shell procedure) باشد، rksh دستور ksh را برای اجرای آن فراخوانی میکند. بنابراین، میتوان به کاربر نهایی رویههای شلی ارائه داد که به تمام توان شل استاندارد دسترسی دارند، در حالی که منوی محدودی از دستورها به او تحمیل میشود؛ این طرح فرض میکند که کاربر نهایی مجوز نوشتن و اجرا در همان دایرکتوری را ندارد.
اثر نهایی این قوانین این است که نویسنده .profile کنترل کاملی بر اقدامات کاربر دارد، چرا که تنظیمات تضمینشده را انجام داده و کاربر را در یک دایرکتوری مناسب (که احتمالاً دایرکتوری ورود نیست ) قرار میدهد.
مدیر سیستم اغلب دایرکتوریای از دستورها را راهاندازی میکند (مانند /usr/rbin) که میتوانند با خیال راحت توسط rksh. فراخوانی شوند.
وضعیت خروج (EXIT STATUS)
خطاهای شناساییشده توسط شل، مانند خطاهای نحوی، باعث میشوند شل وضعیت خروج غیرصفر بازگرداند. اگر از شل بهصورت غیرتعاملی استفاده شود، اجرای پرونده شل متوقف میشود مگر اینکه خطا در یک زیرشل (subshell) رخ دهد که در این صورت زیرشل متوقف میشود. در غیر این صورت، شل وضعیت خروج آخرین دستور اجرا شده را بازمیگرداند (به دستور exit در بالا نیز مراجعه کنید). خطاهای زمان اجرا که توسط شل شناسایی میشوند با چاپ نام دستور یا تابع و شرایط خطا گزارش میشوند. اگر شماره خطایی که خطا در آن رخ داده بزرگتر از یک باشد، شماره خط نیز در کروشه ([]) بعد از نام دستور یا تابع چاپ میشود.
فایلها (FILES)
- /etc/profile
- پرونده مقداردهی اولیه سراسری سیستم، برای شلهای ورود (login) اجرا میشود.
- $HOME/.profile
- پرونده مقداردهی اولیه شخصی، برای شلهای ورود پس از /etc/profile اجرا میشود.
- $HOME/.kshrc
- پرونده مقداردهی اولیه شخصی پیشفرض، برای شلهای تعاملی زمانی که ENV تنظیم نشده باشد اجرا میشود.
- /etc/suid_profile
- پرونده مقداردهی اولیه جایگزین، زمانی که شناسههای کاربری یا گروهی واقعی و موثر یکسان نباشند، به جای پرونده مقداردهی اولیه شخصی اجرا میشود.
- /dev/null
- دستگاه NULL (پوچ)
همچنین ببینید (SEE ALSO)
cat(1), cd(1), chmod(1), cut(1), date(1), egrep(1), echo(1), emacs(1), env(1), fgrep(1), gmacs(1), grep(1), newgrp(1), pfexec(1), stty(1), test(1), touch(1), umask(1), vi(1), dup(2), exec(2), fork(2), getpwnam(3), ioctl(2), lseek(2), paste(1), pathconf(2), pipe(2), sigsetinfo(2), sysconf(2), umask(2), ulimit(2), wait(2), wctrans(3), rand(3), a.out(5), profile(5), environ(7).
Morris I. Bolsky and David G. Korn, The New KornShell Command and Programming Language, Prentice Hall, 1995.
POSIX - Part 2: Shell and Utilities, IEEE Std 1003.2-1992, ISO/IEC 9945-2, IEEE, 1993.
هشدارها (CAVEATS)
اگر دستوری اجرا شود و سپس دستوری با همان نام در دایرکتوریای در مسیر جستجو پیش از دایرکتوریای که دستور اصلی در آن پیدا شده بود نصب شود، شل همچنان به اجرای (exec) دستور اصلی ادامه خواهد داد. از گزینه -t دستور alias برای تصحیح این وضعیت استفاده کنید.
برخی اسکریپتهای شل بسیار قدیمی حاوی ^ به عنوان مترادفی برای نویسه پایپ ⎪ هستند.
استفاده از دستور توکار hist در یک دستور مرکب (compound command) باعث میشود کل دستور از پرونده تاریخچه ناپدید شود.
دستور توکار . file کل پرونده را قبل از اجرای هر دستوری میخواند. بنابراین، دستورهای alias و unalias موجود در پرونده روی دستورهای تعریفشده در همان پرونده اعمال نخواهند شد.
تلهها (Traps) در زمانی که یک کار (job) منتظر یک فرآیند پیشزمینه است، پردازش نمیشوند. بنابراین، یک تله روی CHLD تا زمانی که کار پیشزمینه خاتمه نیابد اجرا نخواهد شد.
ایده خوبی است که بعد از عملگر ویرگول در عبارات محاسباتی یک فاصله قرار دهید تا از تفسیر ویرگول به عنوان ممیز اعشاری در برخی محلیسازیها (locales) جلوگیری شود.