.TH "ZSHMISC" "1" "July 12, 2026" "zsh 5\&.9\&.2" .SH "نام (NAME)" zshmisc \- همه‌چیز و حتی بیشتر از آن .\" Yodl file: Zsh/grammar.yo .SH "دستورهای ساده و خط‌لوله‌ها (SIMPLE COMMANDS & PIPELINES)" یک \fIدستور ساده\fP دنباله‌ای از انتساب‌های اختیاری پارامتر است که کلماتی جداشده با نویسه‌های خالی (blank\-separated) در پی آن می‌آیند، به همراه تغییرمسیرهای اختیاری که در میان آن‌ها قرار گرفته‌اند\&. برای شرح انتساب، ابتدای \fIzshparam\fP(1) را ببینید\&. .PP کلمهٔ اول دستوری است که باید اجرا شود، و کلمات باقی‌مانده، در صورت وجود، آرگومان‌های آن دستور هستند\&. اگر نام دستوری مشخص شده باشد، انتساب‌های پارامتر محیط دستور را هنگام اجرای آن تغییر می‌دهند\&. مقدار یک دستور ساده وضعیت خروج آن است، یا در صورتی که با یک سیگنال متوقف شده باشد، ۱۲۸ به‌علاوهٔ شمارهٔ سیگنال خواهد بود\&. برای مثال، .PP .RS .nf \fBecho foo\fP .fi .RE .PP یک دستور ساده به همراه آرگومان است\&. .PP یک \fIخط‌لوله\fP (pipeline) یا یک دستور ساده است، یا دنباله‌ای از دو یا چند دستور ساده که در آن هر دستور با «\fB|\fP» یا «\fB|&\fP» از دستور بعدی جدا شده است\&. در جایی که دستورها با «\fB|\fP» جدا شده‌اند، خروجی استاندارد دستور اول به ورودی استاندارد دستور بعدی متصل می‌شود\&. «\fB|&\fP» کوتاه‌نوشت «\fB2>&1 |\fP» است که هم خروجی استاندارد و هم خطای استاندارد دستور را به ورودی استاندارد دستور بعدی متصل می‌کند\&. مقدار یک خط‌لوله برابر با مقدار آخرین دستور است، مگر آنکه پیش از خط‌لوله «\fB!\fP» آمده باشد که در این صورت مقدار آن نقیض منطقی مقدار آخرین دستور خواهد بود\&. برای مثال، .PP .RS .nf \fBecho foo | sed \&'s/foo/bar/'\fP .fi .RE .PP یک خط‌لوله است، که در آن خروجی («\fBfoo\fP» به همراه یک خط جدید) از دستور اول به ورودی دستور دوم فرستاده خواهد شد\&. .PP اگر پیش از یک خط‌لوله «\fBcoproc\fP» بیاید، به عنوان یک هم‌روند (coprocess) اجرا می‌شود؛ یک لولهٔ دوطرفه میان آن و شل والد برقرار می‌گردد\&. شل می‌تواند از طریق عملگرهای تغییرمسیر «\fB>&p\fP» و «\fB<&p\fP» یا با «\fBprint \-p\fP» و «\fBread \-p\fP» از هم‌روند بخواند یا در آن بنویسد\&. پیش از یک خط‌لوله نمی‌توان هم‌زمان از «\fBcoproc\fP» و «\fB!\fP» استفاده کرد\&. اگر کنترل کارها (job control) فعال باشد، می‌توان با هم‌روند به‌جز در ورودی و خروجی، مانند یک کار پس‌زمینهٔ معمولی رفتار کرد\&. .PP یک \fIزیرفهرست\fP (sublist) یا یک خط‌لولهٔ تکی است، یا دنباله‌ای از دو یا چند خط‌لوله که با «\fB&&\fP» یا «\fB||\fP» جدا شده‌اند\&. اگر دو خط‌لوله با «\fB&&\fP» جدا شوند، خط‌لولهٔ دوم تنها در صورتی اجرا می‌شود که خط‌لولهٔ اول با موفقیت پایان یابد (وضعیت صفر برگرداند)\&. اگر دو خط‌لوله با «\fB||\fP» جدا شوند، دومی تنها در صورتی اجرا می‌شود که خط‌لولهٔ اول شکست بخورد (وضعیت غیرصفر برگرداند)\&. هر دو عملگر اولویت یکسانی دارند و شرکت‌پذیر از چپ هستند\&. مقدار زیرفهرست برابر با مقدار آخرین خط‌لوله‌ای است که اجرا شده است\&. برای مثال، .PP .RS .nf \fBdmesg | grep panic && print yes\fP .fi .RE .PP یک زیرفهرست متشکل از دو خط‌لوله است؛ دومی صرفاً یک دستور ساده است که تنها و تنها در صورتی اجرا خواهد شد که دستور \fBgrep\fP وضعیت صفر بازگرداند\&. اگر چنین نشود، مقدار زیرفهرست همان وضعیت بازگشتی خواهد بود، و در غیر این صورت وضعیت بازگردانده شده توسط \fBprint\fP خواهد بود (که تقریباً به طور قطع صفر است)\&. .PP یک \fIفهرست\fP (list) دنباله‌ای از صفر یا چند زیرفهرست است که در آن هر زیرفهرست به «\fB;\fP»، «\fB&\fP»، «\fB&|\fP»، «\fB&!\fP» یا یک خط جدید ختم می‌شود\&. این پایان‌دهنده ممکن است به صورت اختیاری از آخرین زیرفهرست در فهرست حذف شود، در صورتی که فهرست به شکل یک دستور مرکب درون «\fB(\fP\&.\&.\&.\fB)\fP» یا «\fB{\fP\&.\&.\&.\fB}\fP» ظاهر شده باشد\&. وقتی یک زیرفهرست به «\fB;\fP» یا خط جدید ختم می‌شود، شل پیش از اجرای زیرفهرست بعدی منتظر اتمام آن می‌ماند\&. اگر یک زیرفهرست به «\fB&\fP»، «\fB&|\fP» یا «\fB&!\fP» ختم شود، شل آخرین خط‌لولهٔ موجود در آن را در پس‌زمینه اجرا می‌کند و منتظر پایان یافتن آن نمی‌ماند (به تفاوت آن با سایر شل‌ها که کل زیرفهرست را در پس‌زمینه اجرا می‌کنند توجه کنید)\&. یک خط‌لولهٔ پس‌زمینه‌شده وضعیت صفر برمی‌گرداند\&. .PP به‌طور کلی‌تر، یک فهرست را می‌توان به عنوان مجموعه‌ای از هر نوع دستور شل در نظر گرفت، از جمله دستورهای مرکب زیر؛ در هر کجای توضیحات بعدی که کلمهٔ «فهرست» آمده باشد، همین مفهوم در نظر است\&. برای مثال، دستورهای موجود در یک تابع شل، نوع خاصی از فهرست را تشکیل می‌دهند\&. .SH "اصلاح‌کننده‌های پیش‌فرمان (PRECOMMAND MODIFIERS)" پیش از یک دستور ساده می‌تواند یک \fIاصلاح‌کنندهٔ پیش‌فرمان\fP (precommand modifier) قرار گیرد که نحوهٔ تفسیر دستور را دگرگون می‌کند\&. این اصلاح‌کننده‌ها دستورهای توکار (builtin) شل هستند، به‌استثنای \fBnocorrect\fP که یک کلمهٔ رزروشده است\&. .PP .PD 0 .TP .PD \fB\-\fP دستور با قرار گرفتن یک «\fB\-\fP» در ابتدای رشتهٔ \fBargv[0]\fP آن اجرا می‌شود\&. .TP \fBbuiltin\fP کلمهٔ دستور به‌جای تابع شل یا دستور خارجی، به عنوان نام یک دستور توکار در نظر گرفته می‌شود\&. .TP \fBcommand\fP [ \fB\-pvV\fP ] کلمهٔ دستور به‌جای تابع شل یا دستور توکار، به عنوان نام یک دستور خارجی در نظر گرفته می‌شود\&. اگر گزینهٔ \fBPOSIX_BUILTINS\fP تنظیم شده باشد، دستورهای توکار نیز اجرا می‌شوند ولی برخی ویژگی‌های خاص آن‌ها نادیده گرفته می‌شود\&. پرچم \fB\-p\fP باعث می‌شود به‌جای مسیر موجود در \fB$path\fP، یک مسیر پیش‌فرض جستجو شود\&. با پرچم \fB\-v\fP، دستور \fBcommand\fP مشابه \fBwhence\fP عمل می‌کند و با \fB\-V\fP، معادل \fBwhence \-v\fP خواهد بود\&. .TP \fBexec\fP [ \fB\-cl\fP ] [ \fB\-a\fP \fIargv0\fP ] دستور زیر به همراه تمام آرگومان‌هایش به‌جای فرآیند جاری اجرا می‌شود، نه به عنوان یک زیرفرآیند\&. شل فرآیند جدیدی منشعب (fork) نمی‌کند و جایگزین می‌شود\&. شل \fBTRAPEXIT\fP را فراخوانی نمی‌کند و فایل‌های \fBzlogout\fP را نیز بارگذاری نمی‌کند\&. گزینه‌ها برای سازگاری با سایر شل‌ها فراهم شده‌اند\&. .RS .PP گزینهٔ \fB\-c\fP محیط را پاک‌سازی می‌کند\&. .PP گزینهٔ \fB\-l\fP معادل اصلاح‌کنندهٔ پیش‌فرمان \fB\-\fP است، تا با دستور جایگزین همانند یک شل لاگین رفتار شود؛ دستور با قرار گرفتن یک \fB\-\fP در ابتدای رشتهٔ \fBargv[0]\fP آن اجرا می‌شود\&. این پرچم در صورت استفادهٔ هم‌زمان با گزینهٔ \fB\-a\fP هیچ اثری نخواهد داشت\&. .PP گزینهٔ \fB\-a\fP برای مشخص کردن صریح رشتهٔ \fBargv[0]\fP (نام دستور آن‌طور که توسط خود فرآیند دیده می‌شود) به منظور استفاده توسط دستور جایگزین به کار می‌رود و مستقیماً معادل مقداردهی به متغیر محیطی \fBARGV0\fP است\&. .RE .TP \fBnocorrect\fP تصحیح املایی روی هیچ‌یک از کلمات انجام نمی‌شود\&. این اصلاح‌کننده باید پیش از هر اصلاح‌کنندهٔ پیش‌فرمان دیگری قرار گیرد، زیرا بلافاصله، پیش از انجام هرگونه تجزیه (parse)، تفسیر می‌شود\&. این مورد در شل‌های غیرتعاملی اثری ندارد\&. .TP \fBnoglob\fP تولید نام فایل (globbing) روی هیچ‌یک از کلمات انجام نمی‌شود\&..SH "دستورهای پیچیده (COMPLEX COMMANDS)" یک \fIدستور پیچیده\fP در zsh یکی از موارد زیر است: .PP .PD 0 .TP .PD \fBif\fP \fIlist\fP \fBthen\fP \fIlist\fP [ \fBelif\fP \fIlist\fP \fBthen\fP \fIlist\fP ] \&.\&.\&. [ \fBelse\fP \fIlist\fP ] \fBfi\fP ابتدا \fIlist\fP پس از \fBif\fP اجرا می‌شود، و اگر وضعیت خروج صفر بازگرداند، \fIlist\fP پس از \fBthen\fP اجرا می‌شود\&. در غیر این صورت، \fIlist\fP پس از \fBelif\fP اجرا شده و اگر وضعیت آن صفر باشد، \fIlist\fP پس از \fBthen\fP اجرا می‌گردد\&. اگر هر یک از \fIlist\fPهای \fBelif\fP وضعیت غیرصفر بازگردانند، \fIlist\fP پس از \fBelse\fP اجرا می‌شود\&. .TP \fBfor\fP \fIname\fP \&.\&.\&. [ \fBin\fP \fIword\fP \&.\&.\&. ] \fIterm\fP \fBdo\fP \fIlist\fP \fBdone\fP فهرست \fIword\fPها را بسط داده و پارامتر \fIname\fP را به نوبت برابر با هر یک از آن‌ها قرار می‌دهد و هر بار \fIlist\fP را اجرا می‌کند\&. اگر `\fBin\fP \fIword\fP\&' حذف شود، به جای \fIword\fPها از پارامترهای مکانی استفاده می‌شود\&. .RS .PP بخش \fIterm\fP شامل یک یا چند خط جدید یا \fB;\fP است که پایان‌بخش \fIword\fPها هستند، و در صورتی که `\fBin\fP \fIword\fP\&' حذف شده باشد اختیاری می‌باشند\&. .PP بیش از یک پارامتر \fIname\fP می‌تواند پیش از فهرست \fIword\fPها قرار گیرد\&. اگر \fIN\fP مقدار \fIname\fP داده شود، در هر بار اجرای حلقه، \fIN\fP کلمهٔ (\fIword\fP) بعدی به پارامترهای متناظر اختصاص می‌یابند\&. اگر تعداد \fIname\fPها بیش از \fIword\fPهای باقی‌مانده باشد، پارامترهای باقی‌مانده هر یک برابر با رشتهٔ خالی تنظیم می‌شوند\&. اجرای حلقه زمانی به پایان می‌رسد که هیچ \fIword\fP باقی‌مانده‌ای برای انتساب به نخستین \fIname\fP وجود نداشته باشد\&. فقط در حالتی ممکن است \fBin\fP به عنوان نخستین \fIname\fP در فهرست ظاهر شود که در غیر این صورت، به عنوان نشانهٔ پایان فهرست در نظر گرفته خواهد شد\&. .RE .TP \fBfor ((\fP [\fIexpr1\fP] \fB;\fP [\fIexpr2\fP] \fB;\fP [\fIexpr3\fP] \fB)) do\fP \fIlist\fP \fBdone\fP ابتدا عبارت حسابی \fIexpr1\fP ارزیابی می‌شود (بخش `Arithmetic Evaluation\&' را ببینید)\&. عبارت حسابی \fIexpr2\fP مکرراً ارزیابی می‌شود تا زمانی که مقدار آن به صفر برسد و در صورت غیرصفر بودن، \fIlist\fP اجرا شده و عبارت حسابی \fIexpr3\fP ارزیابی می‌گردد\&. اگر هر عبارتی حذف شود، به گونه‌ای رفتار خواهد شد که گویی به 1 ارزیابی شده است\&. .TP \fBwhile\fP \fIlist\fP \fBdo\fP \fIlist\fP \fBdone\fP تا زمانی که \fIlist\fP پس از \fBwhile\fP وضعیت خروج صفر بازگرداند، \fIlist\fP پس از \fBdo\fP را اجرا می‌کند\&. .TP \fBuntil\fP \fIlist\fP \fBdo\fP \fIlist\fP \fBdone\fP تا زمانی که \fIlist\fP پس از \fBuntil\fP وضعیت خروج غیرصفر بازگرداند، \fIlist\fP پس از \fBdo\fP را اجرا می‌کند\&. .TP \fBrepeat\fP \fIword\fP \fBdo\fP \fIlist\fP \fBdone\fP مقدار \fIword\fP بسط یافته و به عنوان یک عبارت حسابی در نظر گرفته می‌شود که باید به یک عدد \fIn\fP ارزیابی شود\&. سپس \fIlist\fP به تعداد \fIn\fP بار اجرا می‌گردد\&. .RS .PP نحو \fBrepeat\fP به طور پیش‌فرض هنگامی که شل در حالت شبیه‌سازی یک شل دیگر آغاز به کار می‌کند غیرفعال است\&. می‌توان آن را با دستور `\fBenable \-r repeat\fP\&' فعال کرد\&. .RE .TP \fBcase\fP \fIword\fP \fBin\fP [ [\fB(\fP] \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \&.\&.\&. \fB)\fP \fIlist\fP (\fB;;\fP|\fB;&\fP|\fB;|\fP) ] \&.\&.\&. \fBesac\fP فهرست \fIlist\fP مرتبط با نخستین \fIpattern\fP را که با \fIword\fP مطابقت دارد (در صورت وجود) اجرا می‌کند\&. ساختار الگوها همانند ساختار مورد استفاده در تولید نام فایل است\&. بخش `Filename Generation\&' را ببینید\&. .RS .PP همچنین توجه داشته باشید، مگر آنکه گزینهٔ \fBSH_GLOB\fP تنظیم شده باشد، کل الگو با گزینه‌های جانشین توسط شل معادل با یک گروه از الگوها درون پرانتز تلقی می‌شود، اگرچه ممکن است فاصلهٔ خالی (whitespace) در اطراف پرانتزها و خط عمودی ظاهر شود و در این نقاط از الگو حذف خواهد شد\&. فاصلهٔ خالی ممکن است در جاهای دیگر الگو نیز ظاهر شود؛ این فاصله‌ها حذف نمی‌شوند\&. اگر گزینهٔ \fBSH_GLOB\fP تنظیم شده باشد، به گونه‌ای که پرانتز باز بتواند بدون ابهام به عنوان بخشی از نحو case تلقی شود، عبارت به کلمات جداگانه تجزیه شده و با آن‌ها به عنوان گزینه‌های صریح رفتار می‌شود (همانند دیگر شل‌ها)\&. .PP اگر \fIlist\fP در حال اجرا به جای \fB;;\fP با \fB;&\fP پایان یابد، فهرست بعدی نیز اجرا می‌شود\&. قانون پایان‌بخش برای فهرست بعدی یعنی \fB;;\fP، \fB;&\fP یا \fB;|\fP اعمال می‌شود، مگر آنکه به \fBesac\fP برسد\&. .PP اگر \fIlist\fP در حال اجرا با \fB;|\fP پایان یابد، شل به پویش \fIpattern\fPها برای یافتن انطباق بعدی ادامه می‌دهد، \fIlist\fP متناظر را اجرا می‌کند و قانون مربوط به پایان‌بخش متناظر یعنی \fB;;\fP، \fB;&\fP یا \fB;|\fP را اعمال می‌نماید\&. توجه داشته باشید که \fIword\fP مجدداً بسط داده نمی‌شود؛ تمام \fIpattern\fPهای معتبر با همان \fIword\fP ارزیابی می‌شوند\&. .RE .TP \fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP \&.\&.\&. \fIterm\fP ] \fBdo\fP \fIlist\fP \fBdone\fP که در آن \fIterm\fP یک یا چند خط جدید یا \fB;\fP برای پایان دادن به \fIword\fPها است\&. مجموعهٔ \fIword\fPها را که پیش از هر یک عددی قرار گرفته است چاپ می‌کند\&. اگر \fBin\fP \fIword\fP حذف شود، از پارامترهای مکانی استفاده می‌کند\&. اعلان \fBPROMPT3\fP چاپ شده و در صورتی که شل تعاملی بوده و ویرایشگر خط فعال باشد، یک سطر از آن و در غیر این صورت از ورودی استاندارد خوانده می‌شود\&. اگر این سطر شامل شمارهٔ یکی از \fIword\fPهای فهرست‌شده باشد، پارامتر \fIname\fP برابر با \fIword\fP متناظر با این شماره تنظیم می‌شود\&. اگر این سطر خالی باشد، فهرست گزینه‌ها مجدداً چاپ می‌شود\&. در غیر این صورت، مقدار پارامتر \fIname\fP برابر با null قرار می‌گیرد\&. محتوای سطر خوانده‌شده از ورودی استاندارد در پارامتر \fBREPLY\fP ذخیره می‌شود\&. به ازای هر انتخاب، \fIlist\fP تا زمان مواجهه با break یا پایان فایل (end\-of\-file) اجرا می‌شود\&. .TP \fB(\fP \fIlist\fP \fB)\fP فهرست \fIlist\fP را در یک زیرشل (subshell) اجرا می‌کند\&. تله‌های تنظیم‌شده توسط دستور توکار \fBtrap\fP در حین اجرای \fIlist\fP به مقادیر پیش‌فرض خود بازنشانی می‌شوند؛ استثنا در حالتی است که در صورت تنظیم گزینهٔ \fBPOSIXTRAPS\fP، سیگنال‌های نادیده‌گرفته‌شده همچنان نادیده گرفته خواهند شد\&. .TP \fB{\fP \fIlist\fP \fB}\fP فهرست \fIlist\fP را اجرا می‌کند\&. .TP \fB{\fP \fItry\-list\fP \fB} always {\fP \fIalways\-list\fP \fB}\fP ابتدا \fItry\-list\fP را اجرا می‌کند\&. صرف‌نظر از بروز خطاها، یا دستورهای \fBbreak\fP یا \fBcontinue\fP که در طول \fItry\-list\fP رخ دهند، \fIalways\-list\fP را اجرا می‌کند\&. سپس اجرا از نتیجهٔ اجرای \fItry\-list\fP ادامه می‌یابد؛ به عبارت دیگر، با هرگونه خطا، یا دستور \fBbreak\fP یا \fBcontinue\fP به شیوهٔ عادی رفتار می‌شود، گویی اصلاً \fIalways\-list\fP وجود نداشته است\&. به این دو بخش از کد اصطلاحاً «try block\&» و «always block» گفته می‌شود\&. .RS .PP خط‌های جدید یا نقطه‌ویرگول‌های اختیاری می‌توانند پس از \fBalways\fP ظاهر شوند؛ با این حال، توجه داشته باشید که آن‌ها \fIنمی‌توانند\fP میان آکولاد بستهٔ قبلی و \fBalways\fP قرار گیرند\&. .PP یک «خطا» در این چارچوب شرایطی نظیر یک خطای نحوی است که باعث می‌شود شل از اجرای تابع، اسکریپت یا فهرست فعلی صرف‌نظر کرده و آن را متوقف کند\&. خطاهای نحوی که هنگام تجزیهٔ کد توسط شل رخ می‌دهند موجب اجرای \fIalways\-list\fP نمی‌شوند\&. برای مثال، یک بلوک \fBif\fP که ساختار اشتباهی در \fItry\-list\fP دارد باعث توقف شل هنگام تجزیه می‌شود، بنابراین \fIalways\-list\fP اجرا نخواهد شد، در حالی که یک جایگزینی نادرست مانند \fB${*foo*}\fP باعث یک خطای زمان اجرا می‌شود که پس از آن \fIalways\-list\fP اجرا خواهد شد\&. .PP شرایط خطا را می‌توان با متغیر صحیح ویژهٔ \fBTRY_BLOCK_ERROR\fP بررسی و بازنشانی کرد\&. در خارج از یک \fIalways\-list\fP مقدار آن بی‌اهمیت است، اما با \fB\-1\fP مقداردهی اولیه می‌شود\&. درون \fIalways\-list\fP، اگر خطایی در \fItry\-list\fP رخ داده باشد مقدار آن برابر با 1 وگرنه 0 خواهد بود\&. اگر \fBTRY_BLOCK_ERROR\fP در طول \fIalways\-list\fP برابر با 0 تنظیم شود، وضعیت خطای ناشی از \fItry\-list\fP بازنشانی شده و اجرای شل پس از پایان \fIalways\-list\fP به طور عادی ادامه می‌یابد\&. تغییر این مقدار در طول \fItry\-list\fP مفید نیست (مگر آنکه بخشی از یک بلوک دربرگیرندهٔ \fBalways\fP باشد)\&. .PP صرف‌نظر از مقدار \fBTRY_BLOCK_ERROR\fP، پس از پایان \fIalways\-list\fP وضعیت عادی شل یعنی \fB$?\fP همان مقدار بازگردانده‌شده از \fItry\-list\fP خواهد بود\&. این مقدار در صورت وجود خطا غیرصفر خواهد بود، حتی اگر \fBTRY_BLOCK_ERROR\fP برابر با صفر تنظیم شده باشد\&. .PP دستورات زیر کد مشخص‌شده را بدون در نظر گرفتن خطاهای ناشی از آن اجرا می‌کند\&. این یک روش جایگزین برای شیوهٔ معمول محافظت از کد از طریق اجرای آن در یک زیرشل است\&. .PP .RS .nf \fB{ # code which may cause an error } always { # This code is executed regardless of the error\&. (( TRY_BLOCK_ERROR = 0 )) } # The error condition has been reset\&.\fP .fi .RE .PP هنگامی که یک بلوک \fBtry\fP در خارج از هر تابعی رخ دهد، مواجهه با یک \fBreturn\fP یا \fBexit\fP در \fItry\-list\fP موجب اجرای \fIalways\-list\fP \fIنمی‌شود\fP\&. در عوض، شل بلافاصله پس از اجرای هر تلهٔ \fBEXIT\fP خارج می‌شود\&. در غیر این صورت، برخورد با یک دستور \fBreturn\fP در \fItry\-list\fP درست مانند \fBbreak\fP و \fBcontinue\fP موجب اجرای \fIalways\-list\fP خواهد شد\&. .PP .RE .TP .PD 0 \fBfunction\fP [ \fB\-T\fP ] \fIword\fP \&.\&.\&. [ \fB()\fP ] [ \fIterm\fP ] \fB{\fP \fIlist\fP \fB}\fP .TP .PD 0 \fIword\fP \&.\&.\&. \fB()\fP [ \fIterm\fP ] \fB{\fP \fIlist\fP \fB}\fP .TP .PD \fIword\fP \&.\&.\&. \fB()\fP [ \fIterm\fP ] \fIcommand\fP که در آن \fIterm\fP یک یا چند خط جدید یا \fB;\fP است\&. تابعی را تعریف می‌کند که با هر یک از \fIword\fPها ارجاع‌پذیر است\&. معمولاً تنها یک \fIword\fP ارائه می‌شود؛ چندین \fIword\fP معمولاً فقط برای تنظیم تله‌ها مفید هستند\&. بدنهٔ تابع همان \fIlist\fP میان \fB{\fP و \fB}\fP است\&. بخش `Functions\&' را ببینید\&. .RS .PP گزینه‌های \fBfunction\fP معانی زیر را دارند: .PP .PD 0 .TP .PD \-T ردیابی (tracing) را برای این تابع فعال می‌کند، همانند اینکه با \fBfunctions \-T\fP مشخص شده باشد\&. مستندات گزینهٔ \fB\-f\fP در دستور توکار \fBtypeset\fP را در \fIzshbuiltins\fP(1) ببینید\&..PP اگر گزینهٔ \fBSH_GLOB\fP برای سازگاری با سایر پوسته‌ها تنظیم شده باشد، در صورتی که تنها یک \fIword\fP وجود داشته باشد، فاصله می‌تواند بین پرانتز چپ و راست قرار گیرد؛ در غیر این صورت، در چنین حالتی با پرانتزها به‌صورت تشکیل‌دهندهٔ یک الگوی جانشینی (globbing pattern) رفتار خواهد شد\&. .PP در هر یک از شکل‌های بالا، تغییر مسیر (redirection) می‌تواند در خارج از بدنهٔ تابع قرار گیرد، برای مثال .PP .RS .nf \fBfunc() { \&.\&.\&. } 2>&1\fP .fi .RE .PP تغییر مسیر همراه با تابع ذخیره می‌شود و هر زمان که تابع اجرا شود اعمال می‌گردد\&. هر متغیری در تغییر مسیر، در هنگام اجرای تابع اما خارج از حوزهٔ (scope) تابع بسط می‌یابد\&. .RE .TP \fBtime\fP [ \fIpipeline\fP ] دستور خط‌لوله‌ای \fIpipeline\fP اجرا شده و آمار زمان‌بندی به شکلی که توسط پارامتر \fBTIMEFMT\fP مشخص شده، در خطای استاندارد گزارش می‌شود\&. اگر \fIpipeline\fP حذف شود، آمار مربوط به فرآیند پوسته و فرزندان آن چاپ می‌شود\&. .TP \fB[[\fP \fIexp\fP \fB]]\fP عبارت شرطی \fIexp\fP را ارزیابی کرده و در صورت درست بودن آن، وضعیت خروج صفر برمی‌گرداند\&. برای شرح \fIexp\fP بخش `Conditional Expressions\&' را ببینید\&. .SH "شکل‌های جایگزین برای دستورهای پیچیده (ALTERNATE FORMS FOR COMPLEX COMMANDS)" بسیاری از دستورهای پیچیدهٔ zsh شکل‌های جایگزینی دارند\&. این شکل‌ها غیراستاندارد بوده و احتمالاً حتی برای برنامه‌نویسان باتجربهٔ پوسته نیز بدیهی نخواهند بود؛ در هر جایی که قابلیت حمل کد پوسته اهمیت دارد، نباید از آن‌ها استفاده شود\&. .PP نسخه‌های کوتاه زیر تنها در صورتی کار می‌کنند که \fIsublist\fP به شکل `\fB{\fP \fIlist\fP \fB}\fP\&' باشد یا اینکه گزینهٔ \fBSHORT_LOOPS\fP تنظیم شده باشد\&. برای دستورهای \fBif\fP، \fBwhile\fP و \fBuntil\fP، در هر دوی این موارد بخش آزمون حلقه نیز باید به‌درستی محدود شده باشد، مانند `\fB[[\fP \fI\&.\&.\&.\fP \fB]]\fP\&' یا `\fB((\fP \fI\&.\&.\&.\fP \fB))\fP\&'، در غیر این صورت پایان آزمون شناسایی نخواهد شد\&. برای دستورهای \fBfor\fP، \fBrepeat\fP، \fBcase\fP و \fBselect\fP چنین شکل خاصی برای آرگومان‌ها الزامی نیست، اما شرط دیگر (شکل خاص \fIsublist\fP یا استفاده از گزینهٔ \fBSHORT_LOOPS\fP) همچنان اعمال می‌شود\&. گزینهٔ \fBSHORT_REPEAT\fP برای فعال کردن نسخهٔ کوتاه تنها برای دستور \fBrepeat\fP در دسترس است\&. .PP .PD 0 .TP .PD \fBif\fP \fIlist\fP \fB{\fP \fIlist\fP \fB}\fP [ \fBelif\fP \fIlist\fP \fB{\fP \fIlist\fP \fB}\fP ] \&.\&.\&. [ \fBelse {\fP \fIlist\fP \fB}\fP ] شکلی جایگزین از \fBif\fP\&. این قواعد به این معنی است که .RS .PP .RS .nf \fBif [[ \-o ignorebraces ]] { print yes }\fP .fi .RE .PP کار می‌کند، اما .PP .RS .nf \fBif true { # Does not work! print yes }\fP .fi .RE .PP کار \fIنمی‌کند\fP، زیرا آزمون به‌درستی محدود نشده است\&. .RE .TP \fBif\fP \fIlist\fP \fIsublist\fP یک شکل کوتاه از \fBif\fP جایگزین\&. همان محدودیت‌ها روی شکل \fIlist\fP همانند شکل پیشین اعمال می‌شود\&. .TP \fBfor\fP \fIname\fP \&.\&.\&. \fB(\fP \fIword\fP \&.\&.\&. \fB)\fP \fIsublist\fP یک شکل کوتاه از \fBfor\fP\&. .TP \fBfor\fP \fIname\fP \&.\&.\&. [ \fBin\fP \fIword\fP \&.\&.\&. ] \fIterm\fP \fIsublist\fP که در آن \fIterm\fP حداقل یک خط جدید یا \fB;\fP است\&. شکل کوتاه دیگری از \fBfor\fP\&. .TP \fBfor ((\fP [\fIexpr1\fP] \fB;\fP [\fIexpr2\fP] \fB;\fP [\fIexpr3\fP] \fB))\fP \fIsublist\fP یک شکل کوتاه از دستور حسابی \fBfor\fP\&. .TP \fBforeach\fP \fIname\fP \&.\&.\&. \fB(\fP \fIword\fP \&.\&.\&. \fB)\fP \fIlist\fP \fBend\fP شکل دیگری از \fBfor\fP\&. .TP \fBwhile\fP \fIlist\fP \fB{\fP \fIlist\fP \fB}\fP شکلی جایگزین از \fBwhile\fP\&. به محدودیت‌های شکل \fIlist\fP که در بالا ذکر شد توجه کنید\&. .TP \fBuntil\fP \fIlist\fP \fB{\fP \fIlist\fP \fB}\fP شکلی جایگزین از \fBuntil\fP\&. به محدودیت‌های شکل \fIlist\fP که در بالا ذکر شد توجه کنید\&. .TP \fBrepeat\fP \fIword\fP \fIsublist\fP این یک شکل کوتاه از \fBrepeat\fP است\&. .TP \fBcase\fP \fIword\fP \fB{\fP [ [\fB(\fP] \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \&.\&.\&. \fB)\fP \fIlist\fP (\fB;;\fP|\fB;&\fP|\fB;|\fP) ] \&.\&.\&. \fB}\fP شکلی جایگزین از \fBcase\fP\&. .TP \fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP \&.\&.\&. \fIterm\fP ] \fIsublist\fP که در آن \fIterm\fP حداقل یک خط جدید یا \fB;\fP است\&. یک شکل کوتاه از \fBselect\fP\&. .TP \fBfunction\fP \fIword\fP \&.\&.\&. [ \fB()\fP ] [ \fIterm\fP ] \fIsublist\fP این یک شکل کوتاه از \fBfunction\fP است\&. .SH "کلمات رزروشده (RESERVED WORDS)" کلمات زیر در صورت استفاده به‌عنوان اولین کلمهٔ یک دستور کلمات رزروشده شناخته می‌شوند، مگر اینکه نقل‌قول شده یا با استفاده از \fBdisable \-r\fP غیرفعال شده باشند: .PP \fBdo done esac then elif else fi for case if while function repeat time until select coproc nocorrect foreach end ! [[ { } declare export float integer local readonly typeset\fP .PP علاوه بر این، در صورتی که نه گزینهٔ \fBIGNORE_BRACES\fP و نه گزینهٔ \fBIGNORE_CLOSE_BRACES\fP تنظیم نشده باشند، `\fB}\fP\&' در هر موقعیتی شناخته می‌شود\&..SH "خطاها (ERRORS)" برخی خطاها توسط پوسته به عنوان خطای مهلک در نظر گرفته می‌شوند: در یک پوستهٔ تعاملی، این خطاها باعث بازگشت کنترل به خط فرمان می‌شوند، و در یک پوستهٔ غیرتعاملی باعث توقف و خروج کامل پوسته (abort) می‌گردند\&. در نسخه‌های قدیمی‌تر zsh، یک پوستهٔ غیرتعاملی که در حال اجرای یک اسکریپت بود کاملاً متوقف نمی‌شد، بلکه اجرای اسکریپت را از دستور بعدی خوانده‌شده از سر می‌گرفت و باقی‌ماندهٔ هرگونه تابع یا ساختار پوسته مانند حلقه‌ها یا شرط‌ها را نادیده می‌گرفت؛ این رفتار تا حدی غیرمنطقی را می‌توان با تنظیم گزینهٔ \fBCONTINUE_ON_ERROR\fP بازیابی کرد\&. .PP خطاهای مهلکی که در پوسته‌های غیرتعاملی یافت می‌شوند عبارتند از: .PP .PD 0 .TP .PD \(bu شکست در تجزیهٔ گزینه‌های پوسته که هنگام فراخوانی پوسته ارسال شده‌اند .TP \(bu شکست در تغییر گزینه‌ها با دستور داخلی \fBset\fP .TP \(bu انواع خطاهای تجزیه، از جمله عدم موفقیت در تجزیهٔ عبارت‌های ریاضی .TP \(bu شکست در تنظیم یا تغییر رفتار متغیرها با \fBtypeset\fP، \fBlocal\fP، \fBdeclare\fP، \fBexport\fP، \fBinteger\fP، \fBfloat\fP .TP \(bu اجرای ساختارهای کنترل حلقه در موقعیت‌های نادرست (\fBcontinue\fP، \fBbreak\fP) .TP \(bu تلاش برای استفاده از عبارات باقاعده در صورت در دسترس نبودن ماژول عبارت باقاعده .TP \(bu عملیات غیرمجاز در هنگام تنظیم بودن گزینهٔ \fBRESTRICTED\fP .TP \(bu شکست در ایجاد pipe مورد نیاز برای یک خط لوله (pipeline) .TP \(bu شکست در ایجاد یک multio .TP \(bu شکست در بارگذاری خودکار (autoload) ماژول مورد نیاز برای یک قابلیت اعلان‌شدهٔ پوسته .TP \(bu خطا در ایجاد جایگزینی‌های دستور یا فرایند .TP \(bu خطاهای نحوی در توصیف‌کننده‌های glob (همان glob qualifiers) .TP \(bu خطاهای تولید فایل (file generation) در صورتی که توسط گزینهٔ \fBBAD_PATTERN\fP مهار نشده باشند .TP \(bu همهٔ الگوهای نادرست استفاده‌شده برای تطبیق درون دستورهای case .TP \(bu شکست در تولید فایل در صورتی که ناشی از \fBNOMATCH\fP یا گزینه‌های مشابه نباشد .TP \(bu تمام خطاهای تولید فایل در مواردی که الگو برای ایجاد یک multio استفاده شده باشد .TP \(bu خطاهای حافظه در صورت تشخیص توسط پوسته .TP \(bu اندیس‌های نامعتبر برای متغیرهای پوسته .TP \(bu تلاش برای انتساب مقدار به متغیرهای فقط‌خواندنی (read\-only) .TP \(bu خطاهای منطقی مربوط به متغیرها مانند انتساب مقدار به نوع نادرست .TP \(bu استفاده از نام‌های نامعتبر برای متغیرها .TP \(bu خطا در نحو جایگزینی متغیرها .TP \(bu شکست در تبدیل نویسه‌ها در عبارت‌های \fB$\&'\fP\&.\&.\&.\fB'\fP .PP اگر گزینهٔ \fBPOSIX_BUILTINS\fP تنظیم شده باشد، طبق آنچه در استاندارد POSIX مشخص شده است، خطاهای بیشتری در ارتباط با دستورهای داخلی پوسته به عنوان خطای مهلک در نظر گرفته می‌شوند\&. .PP .SH "کامنت‌ها (COMMENTS)" در پوسته‌های غیرتعاملی، یا در پوسته‌های تعاملی هنگامی که گزینهٔ \fBINTERACTIVE_COMMENTS\fP تنظیم شده باشد، کلمه‌ای که با نویسهٔ سوم پارامتر \fBhistchars\fP (به‌طور پیش‌فرض `\fB#\fP\&') آغاز شود، باعث نادیده گرفته شدن آن کلمه و تمام نویسه‌های پس از آن تا خط جدید (newline) می‌گردد\&. .SH "نام‌های مستعار (ALIASING)" هر \fIکلمه\fP واجد شرایط در ورودی پوسته بررسی می‌شود تا مشخص گردد آیا نام مستعاری (alias) برای آن تعریف شده است یا خیر\&. در این صورت، اگر در موقعیت دستور باشد (اگر بتواند نخستین کلمه از یک دستور ساده باشد)، یا اگر نام مستعار از نوع سراسری (global) باشد، با متن نام مستعار جایگزین می‌شود\&. اگر متن جایگزین به یک فاصله ختم شود، کلمهٔ بعدی در ورودی پوسته همیشه برای اهداف گسترش نام مستعار واجد شرایط خواهد بود\&. .PP در نحو تعریف تابع سازگار با sh به صورت `\fIword\fP \fB()\fP \&.\&.\&.\&'، قرار گرفتن کلمه‌ای حاصل از گسترش نام مستعار به عنوان نام تابع (\fIword\fP) یک خطا محسوب می‌شود، مگر اینکه گزینهٔ \fBALIAS_FUNC_DEF\fP تنظیم شده باشد\&. .PP یک نام مستعار با استفاده از دستور داخلی \fBalias\fP تعریف می‌شود؛ نام‌های مستعار سراسری را می‌توان با استفاده از گزینهٔ \fB\-g\fP در این دستور داخلی تعریف کرد\&. .PP یک \fIکلمه\fP به صورت زیر تعریف می‌شود: .PP .PD 0 .TP .PD \(bu هر رشتهٔ ساده یا الگوی glob .TP \(bu هر رشتهٔ نقل‌قول‌شده، با استفاده از هر روش نقل‌قول (توجه داشته باشید که برای واجد شرایط بودن، نقل‌قول‌ها باید بخشی از تعریف نام مستعار باشند) .TP \(bu هر ارجاع به پارامتر یا جایگزینی دستور .TP \(bu هر دنباله‌ای از موارد پیش‌گفته که بدون فاصلهٔ سفید یا نشانه‌های دیگر میانشان به هم متصل شده باشند .TP \(bu هر کلمهٔ رزروشده (\fBcase\fP، \fBdo\fP، \fBelse\fP و غیره\&) .TP \(bu در نام‌گذاری مستعار سراسری، هر جداکنندهٔ دستور، هر عملگر تغییر مسیر، و `\fB(\fP\&' یا `\fB)\fP' هنگامی که بخشی از یک الگوی glob نباشند .PP گسترش نام مستعار بر روی ورودی پوسته پیش از هر گسترش دیگری به جز گسترش تاریخچه (history expansion) انجام می‌شود\&. بنابراین، اگر نام مستعاری برای کلمهٔ \fBfoo\fP تعریف شده باشد، می‌توان با نقل‌قول کردن بخشی از کلمه، مانند \fB\efoo\fP، از گسترش نام مستعار جلوگیری کرد\&. هر نوعی از نقل‌قول کارساز است، اگرچه هیچ چیز مانع از تعریف یک نام مستعار برای شکل نقل‌قول‌شده مانند \fB\efoo\fP نیز نمی‌شود\&. .PP به‌ویژه، توجه داشته باشید که هنگام استفاده از \fBunalias\fP برای حذف نام‌های مستعار سراسری، باید از نقل‌قول استفاده شود: .PP .RS .nf \fB% alias \-g foo=bar % unalias foo unalias: no such hash table element: bar % unalias \efoo % \fP .fi .RE .PP هنگامی که \fBPOSIX_ALIASES\fP تنظیم شده باشد، تنها رشته‌های ساده و فاقد نقل‌قول برای نام‌گذاری مستعار واجد شرایط هستند\&. دستور داخلی \fBalias\fP نام‌های مستعار غیرمجاز را رد نمی‌کند، اما آن‌ها گسترش نمی‌یابند\&. .PP برای استفاده به همراه تکمیل خودکار (completion)، که بک‌اسلش ابتداییِ پیش از یک نویسهٔ غیرخاص را حذف می‌کند، ممکن است نقل‌قول کردن کلمه با شروع یک نقل‌قول تکی، یعنی \fB\&'foo\fP مناسب‌تر باشد؛ تکمیل خودکار به طور خودکار نقل‌قول تکی پایانی را اضافه خواهد کرد\&. .PP.SS "دشواری‌های نام مستعار (Alias difficulties)" .PP اگرچه نام‌های مستعار را می‌توان به شیوه‌هایی به کار برد که نحو عادی پوسته را دگرگون کند، اما هر رشته‌ای از نویسه‌های غیرفاصله‌ای نمی‌تواند به عنوان نام مستعار استفاده شود\&. .PP هر مجموعه‌ای از نویسه‌ها که در بالا به عنوان کلمه فهرست نشده باشد، یک کلمه محسوب نمی‌شود؛ از این رو هیچ تلاشی برای بسط آن به عنوان نام مستعار صورت نمی‌گیرد، صرف‌نظر از اینکه چگونه تعریف شده باشد (یعنی از طریق دستور توکار یا پارامتر ویژهٔ \fBaliases\fP که در بخش THE ZSH/PARAMETER MODULE در \fIzshmodules\fP(1) شرح داده شده است)\&. با این حال، همان‌طور که در بالا دربارهٔ \fBPOSIX_ALIASES\fP اشاره شد، پوسته در زمان ایجاد نام مستعار، تلاشی برای استنتاج اینکه آیا رشته با یک کلمه مطابقت دارد یا خیر، انجام نمی‌دهد\&. .PP برای نمونه، عبارتی حاوی یک \fB=\fP در ابتدای خط فرمان، یک انتساب است و نمی‌تواند به عنوان نام مستعار بسط یابد؛ یک \fB=\fP تنها یک انتساب نیست، اما فقط با استفاده از پارامتر می‌توان آن را به عنوان نام مستعار تنظیم کرد، زیرا در غیر این صورت \fB=\fP به عنوان بخشی از نحو دستور توکار تلقی می‌شود\&. .PP در حال حاضر امکان ایجاد نام مستعار برای نشانهٔ «\fB((\fP» که عبارات حسابی را آغاز می‌کند وجود ندارد، زیرا تا زمانی که یک عبارت کامل تجزیه نشود، نمی‌توان آن را از دو نشانهٔ متوالی «\fB(\fP» که زیرپوسته‌های تو‌در‌تو را معرفی می‌کنند تشخیص داد\&. همچنین، اگر برای یک جداکننده مانند \fB&&\fP نام مستعار تعیین شود، \fB\e&&\fP به دو نشانهٔ \fB\e&\fP و \fB&\fP تبدیل می‌شود که هر کدام ممکن است جداگانه نام مستعار داشته باشند\&. همین موضوع برای \fB\e<<\fP، \fB\e>|\fP و غیره نیز صدق می‌کند\&. .PP مشکل رایجی در ارتباط با نام‌های مستعار وجود دارد که با کد زیر نشان داده شده است: .PP .RS .nf \fBalias echobar=\&'echo bar'; echobar\fP .fi .RE .PP این دستور پیامی چاپ می‌کند مبنی بر اینکه فرمان \fBechobar\fP یافت نشد\&. این اتفاق به این دلیل رخ می‌دهد که نام‌های مستعار هنگام خوانده شدن کد بسط می‌یابند؛ کل خط به یکباره خوانده می‌شود، به طوری که هنگام اجرای \fBechobar\fP برای بسط نام مستعار تازه‌تعریف‌شده خیلی دیر است\&. این مورد اغلب در اسکریپت‌های پوسته، توابع و کدهایی که با «\fBsource\fP» یا «\fB\&.\fP» اجرا می‌شوند مشکل‌ساز است\&. در نتیجه، در کدهای غیرتعاملی استفاده از توابع به جای نام‌های مستعار توصیه می‌شود\&. .PP .SH "نقل‌قول (QUOTING)" یک نویسه می‌تواند با قرار گرفتن یک «\fB\e\fP» پیش از آن، \fIنقل‌قول\fP شود (یعنی به گونه‌ای در نظر گرفته شود که معنای دقیق خودش را نشان دهد)\&. یک «\fB\e\fP» که بلافاصله پس از آن یک خط جدید بیاید، نادیده گرفته می‌شود\&. .PP رشته‌ای که بین «\fB$\&'\fP» و «\fB'\fP» محصور شده باشد، به همان شیوه‌ای پردازش می‌شود که آرگومان‌های رشته‌ای دستور توکار \fBprint\fP پردازش می‌شوند، و رشتهٔ حاصل کاملاً نقل‌قول‌شده در نظر گرفته می‌شود\&. یک نویسهٔ تحت‌اللفظی «\fB\&'\fP» می‌تواند با استفاده از توالی گریز «\fB\e\&'\fP» در رشته گنجانده شود\&. .PP تمام نویسه‌های محصور بین یک جفت نقل‌قول تکی (\fB\&''\fP) که پیش از آن «\fB$\fP» نیامده باشد، نقل‌قول می‌شوند\&. یک علامت نقل‌قول تکی نمی‌تواند درون نقل‌قول‌های تکی دیگر قرار گیرد مگر اینکه گزینهٔ \fBRC_QUOTES\fP تنظیم شده باشد، که در این صورت یک جفت نقل‌قول تکی به یک علامت نقل‌قول تکی تبدیل می‌شود\&. برای نمونه، .PP .RS .nf \fBprint \&''''\fP .fi .RE .PP در صورتی که \fBRC_QUOTES\fP تنظیم نشده باشد به جز یک خط جدید چیزی خروجی نمی‌دهد، اما اگر تنظیم شده باشد، یک علامت نقل‌قول تکی در خروجی چاپ می‌کند\&. .PP درون نقل‌قول‌های دوتایی (\fB""\fP)، جایگزینی پارامتر و فرمان انجام می‌گیرد، و «\fB\e\fP» نویسه‌های «\fB\e\fP»، «\fB`\fP»، «\fB"\fP»، «\fB$\fP» و اولین نویسهٔ \fB$histchars\fP (پیش‌فرض «\fB!\fP») را نقل‌قول می‌کند\&. .\" Yodl file: Zsh/redirect.yo .SH "تغییر مسیر (REDIRECTION)" اگر پس از یک دستور \fB&\fP بیاید و کنترل شغل فعال نباشد، ورودی استاندارد پیش‌فرض برای آن دستور، فایل خالی \fB/dev/null\fP خواهد بود\&. در غیر این صورت، محیط اجرای یک دستور شامل توصیف‌کننده‌های فایلِ پوستهٔ فراخوان است، به همان صورتی که توسط مشخصات ورودی/خروجی تغییر یافته‌اند\&. .PP موارد زیر ممکن است در هر کجای یک دستور ساده ظاهر شوند یا قبل یا بعد از یک دستور پیچیده بیایند\&. بسط پیش از استفاده از \fIword\fP یا \fIdigit\fP رخ می‌دهد، مگر در مواردی که در ادامه ذکر شده است\&. اگر نتیجهٔ جایگزینی روی \fIword\fP بیش از یک نام فایل تولید کند، تغییر مسیر به نوبت برای هر نام فایل مجزا انجام می‌شود\&. .PP .PD 0 .TP .PD \fB<\fP \fIword\fP فایل \fIword\fP را برای خواندن به عنوان ورودی استاندارد باز می‌کند\&. اگر فایل وجود نداشته باشد، باز کردن فایل با این شیوه یک خطا است\&. .TP \fB<>\fP \fIword\fP فایل \fIword\fP را برای خواندن و نوشتن به عنوان ورودی استاندارد باز می‌کند\&. اگر فایل وجود نداشته باشد، ایجاد می‌شود\&. .TP \fB>\fP \fIword\fP فایل \fIword\fP را برای نوشتن به عنوان خروجی استاندارد باز می‌کند\&. اگر فایل وجود نداشته باشد، ایجاد می‌شود\&. اگر فایل وجود داشته باشد و گزینهٔ \fBCLOBBER\fP تنظیم نشده باشد، این کار باعث ایجاد خطا می‌شود؛ در غیر این صورت، اندازهٔ آن به صفر کاهش می‌یابد\&. .TP .PD 0 \fB>|\fP \fIword\fP .TP .PD \fB>!\fP \fIword\fP مشابه \fB>\fP است، با این تفاوت که اگر فایل وجود داشته باشد، بدون در نظر گرفتن \fBCLOBBER\fP اندازهٔ آن به صفر کاهش می‌یابد\&. .TP \fB>>\fP \fIword\fP فایل \fIword\fP را برای نوشتن در حالت الحاق به عنوان خروجی استاندارد باز می‌کند\&. اگر فایل وجود نداشته باشد و هر دو گزینهٔ \fBCLOBBER\fP و \fBAPPEND_CREATE\fP تنظیم نشده باشند، این کار باعث خطا می‌شود؛ در غیر این صورت، فایل ایجاد می‌شود\&. .TP .PD 0 \fB>>|\fP \fIword\fP .TP .PD \fB>>!\fP \fIword\fP مشابه \fB>>\fP است، با این تفاوت که اگر فایل وجود نداشته باشد، بدون در نظر گرفتن \fBCLOBBER\fP و \fBAPPEND_CREATE\fP ایجاد می‌شود\&. .TP \fB<<\fP[\fB\-\fP] \fIword\fP ورودی پوسته تا خطی که دقیقاً همانند \fIword\fP باشد، یا تا رسیدن به پایان فایل (end\-of\-file) خوانده می‌شود\&. هیچ بسط پارامتر، جایگزینی فرمان یا تولید نام فایلی روی \fIword\fP انجام نمی‌شود\&. سند حاصل که یک \fIhere\-document\fP نامیده می‌شود، ورودی استاندارد قرار می‌گیرد\&. .RS .PP اگر هر نویسه‌ای از \fIword\fP با نقل‌قول‌های تکی، دوتایی یا یک «\fB\e\fP» نقل‌قول شده باشد، هیچ تفسیری روی نویسه‌های سند انجام نمی‌شود\&. در غیر این صورت، جایگزینی پارامتر و فرمان انجام می‌گیرد، «\fB\e\fP» که پس از آن یک خط جدید بیاید حذف می‌شود، و برای نقل‌قول کردن نویسه‌های «\fB\e\fP»، «\fB$\fP»، «\fB`\fP» و اولین نویسهٔ \fIword\fP باید از «\fB\e\fP» استفاده شود\&. .PP توجه داشته باشید که خود \fIword\fP دستخوش بسط پوسته نمی‌شود\&. نقل‌قول‌های وارونه در \fIword\fP اثر معمول خود را ندارند؛ بلکه مشابه نقل‌قول‌های دوتایی رفتار می‌کنند، با این تفاوت که خود نقل‌قول‌های وارونه بدون تغییر منتقل می‌شوند\&. (این اطلاعات جهت تکمیل مطلب آورده شده است و استفاده از نقل‌قول وارونه توصیه نمی‌شود\&.) نقل‌قول‌ها در قالب \fB$\&'\fP\fI\&.\&.\&.\fP\fB'\fP اثر استاندارد خود را در بسط ارجاعات دارای بک‌اسلش به نویسه‌های ویژه دارند\&. .PP اگر از \fB<<\-\fP استفاده شود، تمام تب‌های ابتدای خطوط از \fIword\fP و از سند حذف می‌شوند\&. .RE .TP \fB<<<\fP \fIword\fP بسط پوسته را روی \fIword\fP انجام داده و نتیجه را به ورودی استاندارد می‌فرستد\&. این ویژگی با عنوان \fIhere\-string\fP شناخته می‌شود\&. این مورد را با استفاده از \fIword\fP در here\-documentهای بالا مقایسه کنید که در آن \fIword\fP دستخوش بسط پوسته نمی‌شود\&. نتیجه دارای یک خط جدید در انتها خواهد بود\&. .TP .PD 0 \fB<&\fP \fInumber\fP .TP .PD \fB>&\fP \fInumber\fP ورودی/خروجی استاندارد از توصیف‌کنندهٔ فایل \fInumber\fP تکثیر می‌شود (به \fIdup2\fP(2) مراجعه کنید)\&. .TP .PD 0 \fB<& \-\fP .TP .PD \fB>& \-\fP ورودی/خروجی استاندارد را می‌بندد\&. .TP .PD 0 \fB<& p\fP .TP .PD \fB>& p\fP ورودی/خروجی از/به هم‌روند به ورودی/خروجی استاندارد منتقل می‌شود\&. .TP .PD 0 \fB>&\fP \fIword\fP .TP .PD \fB&>\fP \fIword\fP (به جز مواردی که «\fB>&\fP \fIword\fP» با یکی از نحوهای بالا مطابقت داشته باشد؛ برای جلوگیری از این ابهام همیشه می‌توان از «\fB&>\fP» استفاده کرد\&.) هر دو خروجی استاندارد و خطای استاندارد (توصیف‌کنندهٔ فایل ۲) را به شیوهٔ «\fB>\fP \fIword\fP» تغییر مسیر می‌دهد\&. توجه داشته باشید که در حضور multios، این دستور اثری مشابه «\fB>\fP \fIword\fP \fB2>&1\fP» \fIندارد\fP (به بخش زیر مراجعه کنید)\&..TP .PD 0 \fB>&|\fP \fIword\fP .TP .PD 0 \fB>&!\fP \fIword\fP .TP .PD 0 \fB&>|\fP \fIword\fP .TP .PD \fB&>!\fP \fIword\fP هم خروجی استاندارد و هم خطای استاندارد (توصیف‌کننده فایل ۲) را به شیوهٔ `\fB>|\fP \fIword\fP\&' تغییر مسیر می‌دهد\&. .TP .PD 0 \fB>>&\fP \fIword\fP .TP .PD \fB&>>\fP \fIword\fP هم خروجی استاندارد و هم خطای استاندارد (توصیف‌کننده فایل ۲) را به شیوهٔ `\fB>>\fP \fIword\fP\&' تغییر مسیر می‌دهد\&. .TP .PD 0 \fB>>&|\fP \fIword\fP .TP .PD 0 \fB>>&!\fP \fIword\fP .TP .PD 0 \fB&>>|\fP \fIword\fP .TP .PD \fB&>>!\fP \fIword\fP هم خروجی استاندارد و هم خطای استاندارد (توصیف‌کننده فایل ۲) را به شیوهٔ `\fB>>|\fP \fIword\fP\&' تغییر مسیر می‌دهد\&. .PP اگر یکی از موارد بالا با یک رقم شروع شود، توصیف‌کننده فایل مورد اشاره همان رقمی خواهد بود که مشخص شده است، به جای مقدار پیش‌فرض 0 یا 1\&. ترتیب مشخص شدن تغییر مسیرها حائز اهمیت است\&. پوسته هر تغییر مسیر را بر اساس ارتباط (\fIfile descriptor\fP, \fIfile\fP) در زمان ارزیابی بررسی می‌کند\&. برای مثال: .PP .RS .nf \&.\&.\&. \fB1>\fP\fIfname\fP \fB2>&1\fP .fi .RE .PP ابتدا توصیف‌کننده فایل 1 را به فایل \fIfname\fP مرتبط می‌کند\&. سپس توصیف‌کننده فایل 2 را به فایلی که به توصیف‌کننده فایل 1 مرتبط است (یعنی \fIfname\fP) مرتبط می‌سازد\&. اگر ترتیب تغییر مسیرها معکوس می‌بود، توصیف‌کننده فایل 2 به ترمینال مرتبط می‌شد (با فرض اینکه توصیف‌کننده فایل 1 قبلاً به آن مرتبط شده بود) و سپس توصیف‌کننده فایل 1 به فایل \fIfname\fP مرتبط می‌گشت\&. .PP جداکنندهٔ دستور `\fB|&\fP\&' که در بخش \fISimple Commands & Pipelines\fP در \fIzshmisc\fP(1) توضیح داده شده است، کوته‌نوشتی برای `\fB2>&1 |\fP\&' می‌باشد\&. .PP شکل‌های مختلف جایگزینی فرایند (Process Substitution)، یعنی `\fB<(\fP\fIlist\fP\fB)\fP\&' و `\fB=(\fP\fIlist\fP\fB)\fP\&' برای ورودی و `\fB>(\fP\fIlist\fP\fB)\fP\&' برای خروجی، اغلب همراه با تغییر مسیر استفاده می‌شوند\&. به عنوان مثال، اگر \fIword\fP در یک تغییر مسیر خروجی به شکل `\fB>(\fP\fIlist\fP\fB)\fP\&' باشد، آنگاه خروجی از طریق یک لوله به دستوری که توسط \fIlist\fP مشخص شده فرستاده می‌شود\&. بخش \fIProcess Substitution\fP در \fIzshexpn\fP(1) را ببینید\&. .SH "باز کردن توصیف‌کننده‌های فایل با استفاده از پارامترها (OPENING FILE DESCRIPTORS USING PARAMETERS)" .PP هنگامی که پوسته در حال تجزیهٔ آرگومان‌های یک دستور است و گزینهٔ پوستهٔ \fBIGNORE_BRACES\fP تنظیم نشده باشد، شکل متفاوتی از تغییر مسیر مجاز خواهد بود: به جای یک رقم قبل از عملگر، یک شناسهٔ معتبر پوسته قرار می‌گیرد که در آکولاد محصور شده است\&. پوسته یک توصیف‌کننده فایل جدید باز می‌کند که تضمین می‌شود حداقل 10 باشد و پارامتری را که نام آن همان شناسه است، برابر با توصیف‌کننده فایلِ بازشده قرار می‌دهد\&. هیچ فاصله یا نویسهٔ خالی بین آکولاد بسته و نویسهٔ تغییر مسیر مجاز نیست\&. برای مثال: .PP .RS .nf \&.\&.\&. \fB{myfd}>&1\fP .fi .RE .PP این کار یک توصیف‌کننده فایل جدید باز می‌کند که همتای (duplicate) توصیف‌کننده فایل 1 است و پارامتر \fBmyfd\fP را برابر با شمارهٔ توصیف‌کننده فایل قرار می‌دهد که حداقل 10 خواهد بود\&. می‌توان با استفاده از نحو \fB>&$myfd\fP در این توصیف‌کننده فایل جدید نوشت\&. توصیف‌کننده فایل در زیرپوسته‌ها (subshells) و برنامه‌های اجرایی خارجی منشعب‌شده (forked) باز باقی می‌ماند\&. .PP نحو \fB{\fP\fIvarid\fP\fB}>&\-\fP، برای مثال \fB{myfd}>&\-\fP، می‌تواند برای بستن توصیف‌کننده فایلی که به این شیوه باز شده است به کار رود\&. توجه داشته باشید که در این حالت، پارامتر ارائه‌شده توسط \fIvarid\fP باید از قبل روی یک توصیف‌کننده فایل تنظیم شده باشد\&. .PP اگر پارامتر فقط‌خواندنی (readonly) باشد، باز کردن یا بستن توصیف‌کننده فایل به این شیوه یک خطا محسوب می‌شود\&. با این حال، در صورتی که \fIparam\fP فقط‌خواندنی باشد، خواندن یا نوشتن روی یک توصیف‌کننده فایل با استفاده از \fB<&$\fP\fIparam\fP یا \fB>&$\fP\fIparam\fP خطایی ایجاد نمی‌کند\&. .PP اگر گزینهٔ \fBCLOBBER\fP تنظیم نشده باشد (unset باشد)، باز کردن توصیف‌کننده فایل با استفاده از پارامتری که قبلاً روی یک توصیف‌کننده فایل بازِ تخصیص‌یافته توسط این سازوکار تنظیم شده است، یک خطا به شمار می‌آید\&. حذف مقدار پارامتر (unset کردن آن) پیش از استفاده برای تخصیص توصیف‌کننده فایل، از بروز این خطا جلوگیری می‌کند\&. .PP توجه داشته باشید که این سازوکار صرفاً یک توصیف‌کننده فایل را تخصیص می‌دهد یا می‌بندد؛ هیچ تغییر مسیری به یا از آن انجام نمی‌دهد\&. معمولاً تخصیص یک توصیف‌کننده فایل قبل از استفاده به عنوان آرگومان برای \fBexec\fP راحت‌تر است\&. این نحو در هیچ حالتی هنگام استفاده در اطراف دستورهای مرکب مانند زیرپوسته‌های داخل پرانتز یا حلقه‌ها کار نمی‌کند، جایی که آکولاد باز به عنوان بخشی از فهرست دستورهایی تفسیر می‌شود که باید در پوستهٔ فعلی اجرا گردند\&. .PP موارد زیر یک توالی معمول از تخصیص، استفاده و بستن یک توصیف‌کننده فایل را نشان می‌دهد: .PP .RS .nf \fBinteger myfd exec {myfd}>~/logs/mylogfile\&.txt print This is a log message\&. >&$myfd exec {myfd}>&\-\fP .fi .RE .PP توجه داشته باشید که بسط متغیر در عبارت \fB>&$myfd\fP در نقطه‌ای رخ می‌دهد که تغییر مسیر باز می‌شود\&. این زمان پس از بسط آرگومان‌های دستور و پس از پردازش هرگونه تغییر مسیر در سمت چپ خط فرمان است\&..SH "MULTIOS" اگر کاربر تلاش کند یک توصیف‌گر فایل (file descriptor) را بیش از یک بار برای نوشتن باز کند، در صورتی که گزینهٔ \fBMULTIOS\fP تنظیم شده باشد (که به طور پیش‌فرض چنین است)، شل توصیف‌گر فایل را به عنوان یک لوله (pipe) به فرایندی باز می‌کند که ورودی خود را مانند \fBtee\fP در تمام خروجی‌های مشخص‌شده کپی می‌کند\&. بنابراین: .PP .RS .nf \fBdate >foo >bar\fP .fi .RE .PP تاریخ را در دو فایل با نام‌های `\fBfoo\fP\&' و `\fBbar\fP'\& می‌نویسد\&. توجه داشته باشید که لوله یک تغییرمسیر ضمنی است؛ بنابراین .PP .RS .nf \fBdate >foo | cat\fP .fi .RE .PP تاریخ را در فایل `\fBfoo\fP\&' نوشته و همچنین با pipe به \fBcat\fP می‌فرستد\&. .PP توجه داشته باشید که شل تمام فایل‌های مورد استفاده در فرایند multio را فوراً باز می‌کند، نه در نقطه‌ای که قرار است در آن‌ها نوشته شود\&. .PP همچنین توجه داشته باشید که تغییرمسیرها همواره به ترتیب گسترش می‌یابند\&. این امر صرف‌نظر از وضعیت تنظیم گزینهٔ \fBMULTIOS\fP رخ می‌دهد، اما با فعال بودن این گزینه، پیامدهای دیگری نیز به همراه دارد\&. به عنوان مثال، معنی عبارت \fB>&1\fP پس از یک تغییرمسیر قبلی تغییر خواهد کرد: .PP .RS .nf \fBdate >&1 >output\fP .fi .RE .PP در مورد بالا، عبارت \fB>&1\fP به خروجی استاندارد در آغاز سطر اشاره دارد؛ نتیجه شبیه به دستور \fBtee\fP است\&. با این حال، حالت زیر را در نظر بگیرید: .PP .RS .nf \fBdate >output >&1\fP .fi .RE .PP از آنجا که تغییرمسیرها به ترتیب ارزیابی می‌شوند، هنگام مواجهه با \fB>&1\fP خروجی استاندارد روی فایل \fBoutput\fP تنظیم شده و بنابراین نسخهٔ دیگری از خروجی به آن فایل فرستاده می‌شود\&. بعید است که هدف چنین چیزی بوده باشد\&. .PP اگر گزینهٔ \fBMULTIOS\fP تنظیم شده باشد، کلمهٔ بعد از عملگر تغییرمسیر نیز مشمول تولید نام فایل (globbing) می‌شود\&. بنابراین .PP .RS .nf \fB: > *\fP .fi .RE .PP تمام فایل‌های دایرکتوری فعلی را (با فرض اینکه حداقل یک فایل وجود داشته باشد) خالی (truncate) خواهد کرد\&. (بدون گزینهٔ \fBMULTIOS\fP، فایلی خالی با نام `\fB*\fP\&' ایجاد می‌کرد\&.) به طور مشابه، می‌توانید انجام دهید: .PP .RS .nf \fBecho exit 0 >> *\&.sh\fP .fi .RE .PP اگر کاربر تلاش کند یک توصیف‌گر فایل را بیش از یک بار برای خواندن باز کند، در صورتی که گزینهٔ \fBMULTIOS\fP تنظیم شده باشد، شل توصیف‌گر فایل را به عنوان یک لوله به فرایندی باز می‌کند که تمام ورودی‌های مشخص‌شده را به ترتیبی که تعیین شده‌اند در خروجی خود کپی می‌کند\&. باید توجه داشت که هر فایل فوراً باز می‌شود، نه در لحظه‌ای که قرار است خوانده شود: این رفتار با \fBcat\fP متفاوت است، بنابراین اگر رفتاری دقیقاً استاندارد مورد نیاز است، باید به جای آن از \fBcat\fP استفاده شود\&. .PP بنابراین .PP .RS .nf \fBsort &$myfd\fP توضیح داده شد\&. .PP توجه داشته باشید که لوله یک تغییرمسیر ضمنی است؛ بنابراین .PP .RS .nf \fBcat bar | sort bar > baz\fP .fi .RE .PP هنگامی که \fBMULTIOS\fP غیرفعال باشد، `\fBbar\fP\&' را کوتاه (truncate) کرده و `\fBHello\fP' را درون `\fBbaz\fP\&' می‌نویسد\&. .PP هنگامی که یک multio خروجی به یک برنامهٔ خارجی متصل می‌شود، مشکلی پیش می‌آید\&. یک مثال ساده این را نشان می‌دهد: .PP .RS .nf \fBcat file >file1 >file2 cat file1 file2\fP .fi .RE .PP در اینجا، ممکن است `\fBcat\fP\&' دوم محتوای کامل \fBfile1\fP و \fBfile2\fP را نمایش ندهد (یعنی محتوای اصلی \fBfile\fP که دو بار تکرار شده است)\&. .PP دلیل این امر آن است که فرایندهای multio پس از انشعاب یافتن (fork) فرایند \fBcat\fP از شل والد ایجاد می‌شوند، بنابراین شل والد منتظر نمی‌ماند تا فرایندهای multio نوشتن داده‌ها را به پایان برسانند\&. این بدان معنی است که دستور نشان‌داده‌شده می‌تواند قبل از نوشته شدن کامل \fBfile1\fP و \fBfile2\fP خاتمه یابد\&. به عنوان یک راهکار، می‌توان فرایند \fBcat\fP را به عنوان بخشی از یک کار (job) در شل فعلی اجرا کرد: .PP .RS .nf \fB{ cat file } >file >file2\fP .fi .RE .PP در اینجا، کار \fB{\fP\fI\&.\&.\&.\fP\fB}\fP مکث خواهد کرد تا منتظر نوشته شدن هر دو فایل بماند\&. .PP.SH "تغییرمسیرهای بدون دستور (REDIRECTIONS WITH NO COMMAND)" هنگامی که یک دستور ساده شامل یک یا چند عملگر تغییرمسیر و صفر یا چند انتساب پارامتر باشد، اما نام دستوری وجود نداشته باشد، zsh می‌تواند به چندین شیوه رفتار کند\&. .PP اگر پارامتر \fBNULLCMD\fP تنظیم نشده باشد یا گزینهٔ \fBCSH_NULLCMD\fP تنظیم شده باشد، یک خطا رخ می‌دهد\&. این رفتار \fBcsh\fP است و \fBCSH_NULLCMD\fP هنگام شبیه‌سازی \fBcsh\fP به‌طور پیش‌فرض تنظیم است\&. .PP اگر گزینهٔ \fBSH_NULLCMD\fP تنظیم شده باشد، دستور توکار `\fB:\fP\&' به عنوان یک دستور با تغییرمسیرهای داده‌شده درج می‌شود\&. این حالت پیش‌فرض هنگام شبیه‌سازی \fBsh\fP یا \fBksh\fP است\&. .PP در غیر این صورت، اگر پارامتر \fBNULLCMD\fP تنظیم شده باشد، مقدار آن به عنوان دستوری با تغییرمسیرهای داده‌شده استفاده خواهد شد\&. اگر هر دو پارامتر \fBNULLCMD\fP و \fBREADNULLCMD\fP تنظیم شده باشند، هنگامی که تغییرمسیر از نوع ورودی باشد، مقدار دومی به جای اولی استفاده خواهد شد\&. مقدار پیش‌فرض برای \fBNULLCMD\fP برابر با `\fBcat\fP\&' و برای \fBREADNULLCMD\fP برابر با `\fBmore\fP'\&' است\&. بنابراین .PP .RS .nf \fB< file\fP .fi .RE .PP محتویات \fBfile\fP را در خروجی استاندارد نشان می‌دهد، و اگر خروجی یک پایانه باشد، صفحه‌بندی می‌شود\&. \fBNULLCMD\fP و \fBREADNULLCMD\fP ممکن است به توابع پوسته اشاره کنند\&. .PP .\" Yodl file: Zsh/exec.yo .SH "اجرای دستور (COMMAND EXECUTION)" اگر نام یک دستور حاوی هیچ خط موری (اسلش) نباشد، پوسته تلاش می‌کند آن را پیدا کند\&. اگر تابع پوسته‌ای با آن نام وجود داشته باشد، تابع همان‌طور که در بخش `Functions\&' توضیح داده شده فراخوانی می‌شود\&. اگر یک دستور توکار پوسته با آن نام وجود داشته باشد، آن دستور توکار فراخوانی می‌گردد\&. .PP در غیر این صورت، پوسته هر عنصر از \fB$path\fP را برای یافتن دایرکتوری حاوی یک فایل اجرایی با آن نام جستجو می‌کند\&. .PP اگر اجرا شکست بخورد: یک پیام خطا چاپ می‌شود، و یکی از مقادیر زیر بازگردانده می‌شود\&. .PP .PD 0 .TP 127 جستجو ناموفق بود\&. پیام خطا `\fBcommand not found:\fP \fIcmd\fP\&' است\&. .TP 126 فایل اجرایی مجوزهای کافی ندارد، یک دایرکتوری یا فایل ویژه است، یا اینکه اسکریپت نبوده و در قالبی ناشناخته برای سیستم‌عامل قرار دارد\&. شرایط دقیق و پیام خطا وابسته به سیستم‌عامل هستند؛ به \fIexecve\fP(2) مراجعه کنید\&. .PD .PP اگر اجرا به دلیل این که فایل در قالب اجرایی نیست با شکست مواجه شود، و فایل یک دایرکتوری نباشد، فرض می‌شود که یک اسکریپت پوسته است\&. \fB/bin/sh\fP برای اجرای آن فراخوانی (spawn) می‌شود\&. اگر برنامه فایلی باشد که با `\fB#!\fP\&' آغاز می‌شود، باقی‌ماندهٔ خط اول یک مفسر را برای برنامه مشخص می‌کند\&. در سیستم‌عامل‌هایی که این قالب اجرایی را در هسته مدیریت نمی‌کنند، پوسته مفسر مشخص‌شده را اجرا خواهد کرد\&. .PP اگر هیچ دستور خارجی پیدا نشود اما تابعی به نام \fBcommand_not_found_handler\fP وجود داشته باشد، پوسته این تابع را به همراه تمام آرگومان‌های خط فرمان اجرا می‌کند\&. وضعیت بازگشتی تابع، به وضعیت دستور تبدیل می‌شود\&. توجه داشته باشید که این گرداننده در یک زیرپوسته (subshell) منشعب‌شده (forked) برای اجرای یک دستور خارجی اجرا می‌گردد، بنابراین تغییرات در دایرکتوری‌ها، پارامترهای پوسته و غیره هیچ اثری بر پوستهٔ اصلی ندارند\&. .\" Yodl file: Zsh/func.yo .SH "توابع (FUNCTIONS)" توابع پوسته با کلمهٔ کلیدی رزروشدهٔ \fBfunction\fP یا نحو ویژهٔ `\fIfuncname\fP \fB()\fP\&' تعریف می‌شوند\&. توابع پوسته خوانده شده و به صورت داخلی ذخیره می‌گردند\&. نام‌های مستعار (Alias) هنگام خوانده‌شدن تابع برطرف می‌شوند\&. توابع مانند دستورها با آرگومان‌هایی که به عنوان پارامترهای موضعی منتقل می‌شوند، اجرا می‌گردند\&. (بخش `Command Execution\&' را ببینید\&.) .PP توابع در همان فرایند فراخواننده اجرا می‌شوند و در تمام فایل‌ها و دایرکتوری کاری فعلی با فراخواننده سهیم هستند\&. تله‌ای (trap) روی \fBEXIT\fP که درون تابع تنظیم شود، پس از اتمام کار تابع در محیط فراخواننده اجرا می‌گردد\&. .PP دستور توکار \fBreturn\fP برای بازگشت از فراخوانی‌های تابع استفاده می‌شود\&. .PP شناسه‌های توابع را می‌توان با دستور توکار \fBfunctions\fP فهرست کرد\&. توابع را می‌توان با دستور توکار \fBunfunction\fP لغو تعریف کرد\&. .SH "بارگذاری خودکار توابع (AUTOLOADING FUNCTIONS)" .PP یک تابع می‌تواند با استفاده از دستور توکار \fBautoload\fP (یا `\fBfunctions \-u\fP\&' یا `\fBtypeset \-fu\fP') به عنوان \fIundefined\fP (تعریف‌نشده) نشانه‌گذاری شود\&. چنین تابعی هیچ بدنه‌ای ندارد\&. هنگامی که تابع برای نخستین بار اجرا می‌شود، پوسته با استفاده از عناصر متغیر \fBfpath\fP به دنبال تعریف آن می‌گردد\&. بنابراین برای تعریف توابع جهت بارگذاری خودکار، یک توالی معمول به این صورت است: .PP .RS .nf \fBfpath=(~/myfuncs $fpath) autoload myfunc1 myfunc2 \&.\&.\&.\fP .fi .RE .PP اگر به دستور توکار \fBautoload\fP یا معادل آن، گزینهٔ \fB\-U\fP داده شود، بسط معمول نام‌های مستعار هنگام خواندن نادیده گرفته می‌شود\&. این کار برای استفاده از توابعی که همراه با توزیع zsh عرضه می‌شوند توصیه می‌گردد\&. توجه داشته باشید برای توابعی که از پیش با دستور توکار \fBzcompile\fP کامپایل شده‌اند، پرچم \fB\-U\fP باید هنگام ایجاد فایل \fB\&.zwc\fP ارائه شود، زیرا اطلاعات مربوطه درون این فایل کامپایل می‌شود\&. .PP به ازای هر \fIelement\fP در \fBfpath\fP، پوسته به دنبال سه فایل احتمالی می‌گردد که جدیدترین آن‌ها برای بارگذاری تعریف تابع استفاده می‌شود: .PP .PD 0 .TP .PD \fIelement\fP\fB\&.zwc\fP فایلی ایجادشده با دستور توکار \fBzcompile\fP که انتظار می‌رود شامل تعاریف تمام توابع موجود در دایرکتوری با نام \fIelement\fP باشد\&. با این فایل به همان شیوهٔ یک دایرکتوری حاوی فایل‌های توابع رفتار می‌شود و برای تعریف تابع مورد جستجو قرار می‌گیرد\&. اگر تعریف پیدا نشود، جستجو برای تعریف با دو احتمال دیگر که در زیر شرح داده شده ادامه می‌یابد\&. .RS .PP اگر \fIelement\fP از پیش شامل پسوند \fB\&.zwc\fP باشد (یعنی پسوند صراحتاً توسط کاربر مشخص شده باشد)، \fIelement\fP برای یافتن تعریف تابع بدون مقایسهٔ قدمت زمانی‌اش با فایل‌های دیگر جستجو می‌شود؛ در واقع، نیازی به وجود هیچ دایرکتوری‌ای به نام \fIelement\fP بدون این پسوند نیست\&. بنابراین گنجاندن عنصری مانند `\fB/usr/local/funcs\&.zwc\fP\&' در \fBfpath\fP سرعت جستجوی توابع را بالا می‌برد، اما این عیب را دارد که توابع گنجانده‌شده باید قبل از اینکه پوسته متوجه تغییراتی شود، صراحتاً به صورت دستی مجدداً کامپایل گردند\&. .RE .TP \fIelement\fP\fB/\fP\fIfunction\fP\fB\&.zwc\fP فایلی ایجادشده با \fBzcompile\fP که انتظار می‌رود حاوی تعریف \fIfunction\fP باشد\&. ممکن است تعاریف توابع دیگری را نیز شامل شود، اما آن‌ها نه بارگذاری می‌شوند و نه اجرا؛ فایلی که بدین صورت یافت شود \fIتنها\fP برای یافتن تعریف \fIfunction\fP جستجو می‌شود\&. .TP \fIelement\fP\fB/\fP\fIfunction\fP فایلی از متن دستورات zsh که به عنوان تعریف \fIfunction\fP در نظر گرفته می‌شود\&. .PP به طور خلاصه، ترتیب جستجو به این صورت است: نخست، در \fIوالدین\fP دایرکتوری‌های موجود در \fBfpath\fP برای یافتن جدیدترین مورد بین یک دایرکتوری کامپایل‌شده یا یک دایرکتوری در \fBfpath\fP؛ دوم، اگر بیش از یکی از این موارد شامل تعریفی برای تابع مورد نظر باشد، چپ‌ترین مورد در \fBfpath\fP انتخاب می‌شود؛ و سوم، در داخل یک دایرکتوری، جدیدترین مورد بین یک تابع کامپایل‌شده یا تعریف یک تابع معمولی استفاده می‌شود\&. .PP اگر گزینهٔ \fBKSH_AUTOLOAD\fP تنظیم شده باشد، یا فایل فقط شامل یک تعریف ساده از تابع باشد، محتویات فایل اجرا خواهد شد\&. این کار به طور معمول تابع مورد نظر را تعریف می‌کند، اما ممکن است مقداردهی اولیه‌ای را نیز انجام دهد که در بستر اجرای تابع اجرا می‌شود، و بنابراین ممکن است پارامترهای محلی تعریف کند\&. اگر با بارگذاری فایل، تابع تعریف نشود یک خطا محسوب می‌شود\&. .PP در غیر این صورت، بدنهٔ تابع (بدون `\fIfuncname\fP\fB() {\fP\fI\&.\&.\&.\fP\fB}\fP\&' در اطراف آن) به عنوان کل محتوای فایل در نظر گرفته می‌شود\&. این ساختار اجازه می‌دهد تا از فایل مستقیماً به عنوان یک اسکریپت پوستهٔ اجرایی استفاده شود\&. اگر پردازش فایل منجر به تعریف مجدد تابع شود، خود تابع دوباره اجرا نمی‌گردد\&. برای وادار کردن پوسته به انجام مقداردهی اولیه و سپس فراخوانی تابع تعریف‌شده، فایل علاوه بر یک تعریف کامل از تابع (که برای فراخوانی‌های بعدی تابع نگه‌داشته می‌شود)، باید شامل کد مقداردهی اولیه (که اجرا شده و سپس کنار گذاشته می‌شود) و یک فراخوانی تابع پوسته به همراه هرگونه آرگومان در انتها باشد\&. .PP برای مثال، فرض کنید فایل بارگذاری خودکار \fBfunc\fP شامل این موارد باشد: .PP .RS .nf \fBfunc() { print This is func; } print func is initialized\fP .fi .RE .PP آنگاه اجرای `\fBfunc; func\fP\&' با تنظیم بودن \fBKSH_AUTOLOAD\fP در اولین فراخوانی هر دو پیام را تولید می‌کند، اما در فراخوانی دوم و پس از آن، تنها پیام `\fBThis is func\fP\&' را چاپ می‌نماید\&. بدون تنظیم بودن \fBKSH_AUTOLOAD\fP، پیام مقداردهی اولیه در فراخوانی نخست، و پیام دیگر در دومین و فراخوانی‌های بعدی تولید خواهد شد\&. .PP همچنین می‌توان تابعی ایجاد کرد که به عنوان بارگذاری خودکار نشانه‌گذاری نشده است، اما تعریف خود را با جستجو در \fBfpath\fP بارگذاری می‌کند، این کار با استفاده از `\fBautoload \-X\fP\&' درون یک تابع پوسته انجام می‌شود\&. برای مثال، موارد زیر معادل یکدیگرند: .PP .RS .nf \fBmyfunc() { autoload \-X } myfunc args\&.\&.\&.\fP .fi .RE .PP و.PP .RS .nf \fBunfunction myfunc # if myfunc was defined autoload myfunc myfunc args\&.\&.\&.\fP .fi .RE .PP در واقع، دستور \fBfunctions\fP عبارت `\fBbuiltin autoload \-X\fP\&' را به عنوان بدنهٔ یک تابع بارگذاری‌خودکار (autoloaded) در خروجی قرار می‌دهد\&. این کار به این منظور انجام می‌شود که .PP .RS .nf \fBeval "$(functions)"\fP .fi .RE .PP نتیجه‌ای معقول تولید کند\&. یک تابع بارگذاری‌خودکارِ واقعی را می‌توان با وجود توضیح `\fB# undefined\fP\&' در بدنه شناسایی کرد، زیرا تمام توضیحات از توابع تعریف‌شده حذف می‌شوند\&. .PP برای بارگذاری تعریف یک تابع بارگذاری‌خودکارِ \fBmyfunc\fP بدون اجرای \fBmyfunc\fP، از دستور زیر استفاده کنید: .PP .RS .nf \fBautoload +X myfunc\fP .fi .RE .PP .SH "توابع ناشناس (ANONYMOUS FUNCTIONS)" .PP اگر نامی برای یک تابع مشخص نشود، آن تابع «ناشناس» (`anonymous\&') است و به شکل ویژه‌ای با آن رفتار می‌شود\&. هر دو شکل تعریف تابع را می‌توان به کار برد: یک `\fB()\fP\&' بدون هیچ نامی پیش از آن، یا عبارت `\fBfunction\fP\&' که بلافاصله پس از آن یک آکولاد باز قرار گرفته باشد\&. تابع بی‌درنگ در همان نقطهٔ تعریف اجرا می‌شود و برای استفاده‌های بعدی ذخیره نمی‌گردد\&. نام تابع برابر با `\fB(anon)\fP\&' تنظیم می‌شود\&. .PP آرگومان‌های تابع را می‌توان به صورت کلماتی پس از آکولادِ بستهٔ تعریف‌کنندهٔ تابع تعیین کرد؛ از این رو در صورت عدم وجود آن‌ها، هیچ آرگومانی (به جز \fB$0\fP) مقداردهی نخواهد شد\&. این مورد با نحوهٔ تجزیهٔ سایر توابع تفاوت دارد: پس از تعاریف توابع عادی ممکن است کلمات کلیدی خاصی مانند `\fBelse\fP\&' یا `\fBfi\fP' بیایند، در حالی که در توابع ناشناس با آن‌ها به عنوان آرگومان رفتار خواهد شد؛ بنابراین برای واداشتن شل به تفسیر آن‌ها به عنوان کلمه کلیدی، به یک خط جدید (newline) یا نقطه\-ویرگول نیاز است\&. .PP همچنین توجه داشته باشید که فهرست آرگومان‌های هر اسکریپت یا تابع دربرگیرنده پنهان می‌شود (همان‌طور که در مورد هر تابع دیگری که در این نقطه فراخوانی شود صدق می‌کند)\&. .PP تغییرمسیرها را می‌توان به همان روشی که بر روی ساختارهای شلِ جاری محصور در آکولاد اعمال می‌شوند، بر توابع ناشناس نیز اعمال کرد\&. کاربرد اصلی توابع ناشناس، فراهم کردن یک محدوده (scope) برای متغیرهای محلی است\&. این قابلیت به‌ویژه در فایل‌های راه‌اندازی (start\-up files) بسیار سودمند است چرا که این فایل‌ها محدودهٔ متغیر محلی مخصوص به خود را ارائه نمی‌دهند\&. .PP برای مثال، .PP .RS .nf \fBvariable=outside function { local variable=inside print "I am $variable with arguments $*" } this and that print "I am $variable"\fP .fi .RE .PP خروجی زیر را تولید می‌کند: .PP .RS .nf \fBI am inside with arguments this and that I am outside\fP .fi .RE .PP توجه داشته باشید که تعاریف تابعی با آرگومان‌هایی که به هیچ منبسط (expand) می‌شوند، برای مثال `\fBname=; function $name { \fP\fI\&.\&.\&.\fP\fB }\fP\&'، به عنوان توابع ناشناس در نظر گرفته نمی‌شوند\&. در عوض، مانند تعاریف تابع عادی با آن‌ها برخورد می‌شود که در آن، تعریف تابع بدون اعلام هیچ پیامی نادیده گرفته می‌شود\&. .PP .SH "توابع ویژه (SPECIAL FUNCTIONS)" توابع خاصی در صورت تعریف شدن، معنای ویژه‌ای برای شل دارند\&. .PP .SS "توابع قلاب (Hook Functions)" .PP برای توابع زیر، این امکان وجود دارد که آرایه‌ای تعریف شود که نامی یکسان با تابع داشته و عبارت `\fB_functions\fP\&' به انتهای آن افزوده شده باشد\&. هر عنصری در چنین آرایه‌ای به عنوان نام تابعی برای اجرا در نظر گرفته می‌شود؛ این تابع در همان زمینه (context) و با همان آرگومان‌ها و همان مقدار اولیهٔ \fB$?\fP مانند تابع پایه اجرا می‌شود\&. برای مثال، اگر \fB$chpwd_functions\fP آرایه‌ای حاوی مقادیر `\fBmychpwd\fP\&' و `\fBchpwd_save_dirstack\fP' باشد، شل تلاش می‌کند توابع `\fBchpwd\fP\&'، `\fBmychpwd\fP' و `\fBchpwd_save_dirstack\fP\&' را به همان ترتیب اجرا کند\&. هر تابعی که وجود نداشته باشد، بدون اخطار نادیده گرفته می‌شود\&. تابعی که از طریق این سازوکار یافته شود در جاهای دیگر به عنوان یک \fIتابع قلاب (hook function)\fP شناخته می‌شود\&. بروز خطا در هر یک از توابع باعث می‌شود توابع بعدی اجرا نشوند\&. علاوه بر این توجه داشته باشید که خطا در یک قلاب \fBprecmd\fP باعث می‌شود تابع \fBperiodic\fP که بلافاصله پس از آن قرار دارد اجرا نشود (اگرچه ممکن است در فرصت بعدی اجرا گردد)\&. .PP .PD 0 .TP .PD \fBchpwd\fP هر زمان که دایرکتوری کاری جاری تغییر کند اجرا می‌شود\&. .TP \fBperiodic\fP اگر پارامتر \fBPERIOD\fP تنظیم شده باشد، این تابع هر \fB$PERIOD\fP ثانیه یک‌بار، درست پیش از اعلان خط فرمان (prompt) اجرا می‌شود\&. توجه داشته باشید که اگر با استفاده از آرایهٔ \fBperiodic_functions\fP چندین تابع تعریف شده باشند، تنها یک دورهٔ زمانی برای کل مجموعه توابع اعمال می‌شود، و با تغییر لیست توابع، زمان‌بندیِ تعیین‌شده بازنشانی نمی‌گردد\&. بنابراین این مجموعه توابع همواره با یکدیگر فراخوانی می‌شوند\&. .TP \fBprecmd\fP پیش از هر اعلان خط فرمان اجرا می‌شود\&. توجه داشته باشید که توابع پیش‌فرمان (precommand) صرفاً به دلیل بازترسیم مجدد خط فرمان، مثلاً هنگام نمایش اعلان خروج یک کار (job)، دوباره اجرا نمی‌شوند\&. .TP \fBpreexec\fP درست پس از خوانده شدن یک دستور و زمانی که در شرف اجرا است، اجرا می‌شود\&. اگر سازوکار تاریخچه فعال باشد (صرف‌نظر از اینکه خط از بافر تاریخچه کنار گذاشته شده باشد یا خیر)، رشته‌ای که کاربر تایپ کرده به عنوان آرگومان اول ارسال می‌شود، در غیر این صورت یک رشتهٔ خالی خواهد بود\&. دستور واقعی که اجرا خواهد شد (شامل نام‌های مستعار گسترش‌یافته) در دو شکل مختلف ارسال می‌شود: آرگومان دوم یک نسخهٔ تک‌خطی و با اندازهٔ محدود از دستور است (که مواردی مانند بدنهٔ توابع در آن حذف شده‌اند)؛ آرگومان سوم شامل متن کاملِ دستوری است که اجرا می‌شود\&. .TP \fBzshaddhistory\fP هنگامی که یک خط تاریخچه به صورت تعاملی خوانده شده است، اما پیش از آنکه اجرا شود، اجرا می‌گردد\&. تنها آرگومان آن، خط کامل تاریخچه است (به گونه‌ای که هر کاراکتر خط جدیدِ پایانی همچنان در آن وجود خواهد داشت)\&. .RS .PP اگر هر یک از توابع قلاب، وضعیت ۱ (یا هر مقدار غیرصفر دیگری به جز ۲، هرچند این مورد برای نسخه‌های آیندهٔ شل تضمین نشده است) را برگرداند، خط تاریخچه ذخیره نخواهد شد، اگرچه تا زمان اجرای خط بعدی در تاریخچه باقی می‌ماند و به شما اجازه می‌دهد فوراً از آن استفاده مجدد کرده یا آن را ویرایش کنید\&. .PP اگر هر یک از توابع قلاب، وضعیت ۲ را برگرداند، خط تاریخچه در فهرست تاریخچهٔ داخلی ذخیره می‌شود، اما در فایل تاریخچه نوشته نمی‌شود\&. در صورت بروز تعارض، اولین مقدار وضعیت غیرصفر ملاک عمل خواهد بود\&. .PP یک تابع قلاب می‌تواند `\fBfc \-p\fP \fI\&.\&.\&.\fP\&' را فراخوانی کند تا زمینهٔ تاریخچه را تغییر دهد تا تاریخچه در فایلی متفاوت از آنچه در پارامتر سراسری \fBHISTFILE\fP آمده ذخیره شود\&. با این مورد به صورت ویژه رفتار می‌شود: زمینهٔ تاریخچه پس از پایان پردازش خط تاریخچه، به صورت خودکار بازیابی می‌شود\&. .PP تابع مثال زیر در صورت تنظیم بودن یکی از گزینه‌های \fBINC_APPEND_HISTORY\fP یا \fBSHARE_HISTORY\fP عمل می‌کند تا خط بلافاصله پس از افزودن مدخل تاریخچه، نوشته شود\&. این تابع ابتدا خط تاریخچه را با حذف کاراکتر خط جدید به تاریخچهٔ عادی اضافه می‌کند که معمولاً رفتار درستی است\&. سپس زمینهٔ تاریخچه را تغییر می‌دهد تا خط در یک فایل تاریخچه در دایرکتوری جاری نوشته شود\&. .PP .RS .nf \fBzshaddhistory() { print \-sr \-\- ${1%%$\&'\en'} fc \-p \&.zsh_local_history }\fP .fi .RE .RE .TP \fBzshexit\fP در نقطه‌ای اجرا می‌شود که شل اصلی در شرف خروج عادی است\&. این تابع با خروج زیرشل‌ها (subshells) و همچنین هنگام استفاده از تغییردهندهٔ پیش‌فرمان \fBexec\fP قبل از یک دستور خارجی، فراخوانی نمی‌شود\&. همچنین، بر خلاف \fBTRAPEXIT\fP، هنگام خروج توابع فراخوانی نمی‌گردد\&. .PP.SS "توابع تله (Trap Functions)" .PP توابع زیر به صورت ویژه‌ای مدیریت می‌شوند اما آرایه‌های قلاب (hook) متناظر ندارند\&. .PP .PD 0 .TP .PD \fBTRAP\fP\fINAL\fP اگر تعریف شده و غیرتهی (non\-null) باشد، هر زمان که شل سیگنال \fBSIG\fP\fINAL\fP را دریافت کند (که در آن \fINAL\fP نام سیگنالی است که برای دستور توکار \fBkill\fP مشخص می‌شود)، این تابع اجرا خواهد شد\&. شماره سیگنال به عنوان نخستین پارامتر به تابع ارسال می‌شود\&. .RS .PP اگر تابعی به این شکل تعریف شده و تهی (null) باشد، شل و فرآیندهای ایجادشده توسط آن، \fBSIG\fP\fINAL\fP را نادیده خواهند گرفت\&. .PP وضعیت بازگشتی از تابع به صورت ویژه‌ای رسیدگی می‌شود\&. اگر صفر باشد، فرض می‌شود که سیگنال مدیریت شده است و اجرای برنامه به صورت عادی ادامه می‌یابد\&. در غیر این صورت، شل مانند زمانی که دچار وقفه شده رفتار خواهد کرد، با این تفاوت که وضعیت بازگشتی تله حفظ می‌شود\&. .PP برنامه‌هایی که با سیگنال‌های دریافت‌نشده خاتمه می‌یابند، معمولاً وضعیت ۱۲۸ به علاوه شماره سیگنال را برمی‌گردانند\&. بنابراین قطعه کد زیر باعث می‌شود گرداننده \fBSIGINT\fP پیامی را چاپ کند و سپس اثر معمول این سیگنال را تقلید نماید\&. .PP .RS .nf \fBTRAPINT() { print "Caught SIGINT, aborting\&." return $(( 128 + $1 )) }\fP .fi .RE .PP توابع \fBTRAPZERR\fP، \fBTRAPDEBUG\fP و \fBTRAPEXIT\fP هرگز درون تله‌های دیگر اجرا نمی‌شوند\&. .RE .TP \fBTRAPDEBUG\fP اگر گزینه \fBDEBUG_BEFORE_CMD\fP فعال باشد (که به طور پیش‌فرض هست)، پیش از هر دستور اجرا می‌شود؛ در غیر این صورت پس از هر دستور اجرا خواهد شد\&. برای جزئیات مربوط به امکانات اضافی ارائه‌شده در تله‌های دیباگ، توضیحات دستور توکار \fBtrap\fP را در \fIzshbuiltins\fP(1) ببینید\&. .TP \fBTRAPEXIT\fP هنگامی که شل خارج می‌شود، یا چنانچه درون یک تابع تعریف شده باشد، هنگام خروج تابع جاری اجرا می‌شود\&. مقدار \fB$?\fP در آغاز اجرا، وضعیت خروج شل یا وضعیت بازگشتی تابع در حال خروج است\&. .TP \fBTRAPZERR\fP هر زمان که یک دستور وضعیت خروج غیرصفر داشته باشد اجرا می‌شود\&. با این حال، اگر دستور در یک زیرلیست و به دنبال آن `\fB&&\fP\&' یا `\fB||\fP' آمده باشد، تابع اجرا نخواهد شد؛ تنها دستور پایانی در زیرلیستی از این نوع باعث اجرای تله می‌شود\&. تابع \fBTRAPERR\fP در سیستم‌هایی که فاقد \fBSIGERR\fP هستند (که حالت معمول است)، مانند \fBTRAPZERR\fP عمل می‌کند\&. .PP توابعی که با `\fBTRAP\fP\&' آغاز می‌شوند را می‌توان به کمک دستور توکار \fBtrap\fP نیز تعریف کرد: این کار ممکن است برای برخی کاربردها ارجح باشد\&. تنظیم یک تله با یک قالب، هرگونه تله از قالب دیگر را برای همان سیگنال حذف می‌کند؛ همچنین حذف یک تله در هر یک از این قالب‌ها، تمام تله‌های مربوط به همان سیگنال را حذف خواهد کرد\&. قالب‌های .PP .RS .nf \fBTRAPNAL() { # code }\fP .fi .RE .PP («تله‌های تابعی») و .PP .RS .nf \fBtrap \&' # code \&' NAL\fP .fi .RE .PP («تله‌های لیستی») در بیشتر جنبه‌ها معادل یکدیگرند، به استثنای موارد زیر: .PP .PD 0 .TP .PD \(bu تله‌های تابعی دارای تمام ویژگی‌های توابع معمولی هستند، در فهرست توابع ظاهر می‌شوند و با بافت تابعی خودشان فراخوانی می‌گردند، نه بافتی که تله در آن برانگیخته شده است\&. .TP \(bu وضعیت بازگشتی از تله‌های تابعی خاص است، در حالی که بازگشت (return) از یک تله لیستی باعث می‌شود بافت پیرامونی با وضعیت داده‌شده بازگردد\&. .TP \(bu تله‌های تابعی بر اساس رفتار zsh در زیرشل‌ها (subshells) بازنشانی نمی‌شوند؛ تله‌های لیستی بر اساس رفتار POSIX بازنشانی می‌شوند\&. .\" Yodl file: Zsh/jobs.yo .SH "کارها (JOBS)" اگر گزینه \fBMONITOR\fP فعال باشد، یک شل تعاملی یک \fIکار (job)\fP را به هر خط لوله (pipeline) اختصاص می‌دهد\&. شل جدولی از کارهای جاری را نگه می‌دارد که با دستور \fBjobs\fP چاپ می‌شود، و اعداد صحیح کوچکی را به آن‌ها اختصاص می‌دهد\&. هنگامی که یک کار به صورت ناهمگام با `\fB&\fP\&' آغاز می‌شود، شل خطی شبیه به این را در خروجی خطای استاندارد چاپ می‌کند: .PP .RS .nf \fB[1] 1234\fP .fi .RE .PP که نشان می‌دهد کاری که به طور ناهمگام آغاز شده است، کار شماره ۱ بوده و دارای یک فرآیند (سطح بالا) بوده است که شناسه فرآیند (PID) آن ۱۲۳۴ است\&. .PP اگر کاری با `\fB&|\fP\&' یا `\fB&!\fP' آغاز شود، آن کار بلافاصله واگذار (disown) می‌شود\&. پس از راه‌اندازی، جایی در جدول کارها ندارد و مشمول ویژگی‌های کنترل کاری که در اینجا شرح داده شده است نمی‌شود\&. .PP اگر در حال اجرای کاری هستید و می‌خواهید کار دیگری انجام دهید، می‌توانید کلید ^Z (کنترل-Z) را فشار دهید که سیگنال \fBTSTP\fP را به کار جاری ارسال می‌کند: این کلید را می‌توان با گزینه \fBsusp\fP دستور خارجی \fBstty\fP بازتعریف کرد\&. شل معمولاً نشان می‌دهد که کار معلق شده است (`suspended\&') و اعلان (prompt) دیگری را چاپ می‌کند\&. سپس می‌توانید وضعیت این کار را تغییر دهید، آن را با دستور \fBbg\fP در پس‌زمینه قرار دهید، یا دستورهای دیگری را اجرا کنید و در نهایت با دستور پیش‌زمینه \fBfg\fP، کار را دوباره به پیش‌زمینه بیاورید\&. کلید ^Z بلافاصله اعمال می‌شود و مانند یک وقفه است از این نظر که خروجی معلق و ورودی خوانده‌نشده هنگام فشرده شدن آن دور ریخته می‌شوند\&. .PP کاری که در پس‌زمینه اجرا می‌شود، در صورت تلاش برای خواندن از ترمینال معلق خواهد شد\&. .PP توجه داشته باشید که اگر کار در حال اجرا در پیش‌زمینه یک تابع شل باشد، معلق کردن آن موجب انشعاب (fork) شل خواهد شد\&. این کار برای جداسازی وضعیت تابع از وضعیت شل والد که کنترل کار را انجام می‌دهد ضروری است، تا شل والد بتواند به اعلان خط فرمان بازگردد\&. در نتیجه، حتی اگر از \fBfg\fP برای ادامه کار استفاده شود، تابع دیگر بخشی از شل والد نخواهد بود و هر متغیری که توسط تابع تنظیم شود در شل والد قابل مشاهده نخواهد بود\&. بنابراین رفتار آن با حالتی که تابع هرگز معلق نشده بود تفاوت دارد\&. Zsh از این نظر با بسیاری از شل‌های دیگر متفاوت است\&. .PP یک اثر جانبی اضافی این است که استفاده از \fBdisown\fP با کاری که با معلق کردن کد شل به این شیوه ایجاد شده است به تأخیر می‌افتد: کار تنها زمانی می‌تواند واگذار (disown) شود که هر فرآیندی که از شل والد شروع شده خاتمه یافته باشد\&. در آن نقطه، کار واگذارشده بی‌صدا از فهرست کارها ناپدید می‌شود\&. .PP همین رفتار زمانی نیز رخ می‌دهد که شل در حال اجرای کد به عنوان سمت راست یک خط لوله یا هر ساختار پیچیده شل مانند \fBif\fP، \fBfor\fP و غیره باشد، تا بتوان کل بلوک کد را به عنوان یک کار واحد مدیریت کرد\&. کارهای پس‌زمینه به طور معمول مجاز به تولید خروجی هستند، اما این امکان را می‌توان با اجرای دستور `\fBstty tostop\fP\&' غیرفعال کرد\&. اگر این گزینه tty را تنظیم کنید، کارهای پس‌زمینه هنگام تلاش برای تولید خروجی، دقیقاً مانند زمانی که سعی در خواندن ورودی دارند، معلق خواهند شد\&. .PP هنگامی که دستوری معلق شده و سپس با دستورات توکار \fBfg\fP یا \fBwait\fP ادامه می‌یابد، zsh حالت‌های tty را که در هنگام تعلیق فعال بودند بازیابی می‌کند\&. این موضوع (به‌طور عامدانه) در صورتی که دستور از طریق `\fBkill \-CONT\fP\&' ادامه یابد و همچنین زمانی که با \fBbg\fP ادامه می‌یابد، اعمال نمی‌شود\&. .PP روش‌های گوناگونی برای ارجاع به کارها در شل وجود دارد\&. می‌توان با شناسه فرآیند هر یک از فرآیندهای کار یا با یکی از موارد زیر به یک کار ارجاع داد: .PP .PD 0 .TP \fB%\fP\fInumber\fP کار با شماره داده‌شده\&. .TP \fB%\fP\fIstring\fP آخرین کاری که خط فرمان آن با \fIstring\fP آغاز می‌شود\&. .TP \fB%?\fP\fIstring\fP آخرین کاری که خط فرمان آن شامل \fIstring\fP است\&. .TP \fB%%\fP کار جاری\&. .TP \fB%+\fP معادل `\fB%%\fP\&'\&. .TP \fB%\-\fP کار قبلی\&. .PD .PP شل بلافاصله از هرگونه تغییر وضعیت فرآیندها مطلع می‌شود\&. معمولاً هرگاه کاری مسدود شود به طوری که پیشرفت بیشتری ممکن نباشد، شما را مطلع می‌کند\&. اگر گزینه \fBNOTIFY\fP تنظیم نشده باشد، تا لحظاتی پیش از چاپ اعلان خط فرمان منتظر می‌ماند و سپس به شما اطلاع می‌دهد\&. تمام چنین اعلان‌هایی مستقیماً به ترمینال ارسال می‌شوند، نه به خروجی استاندارد یا خطای استاندارد\&..PP هنگامی که حالت پایش (monitor mode) فعال است، هر کار پس‌زمینه‌ای که پایان می‌یابد، هر تلهٔ (trap) تنظیم‌شده برای \fBCHLD\fP را فراخوانی می‌کند\&. .PP هنگامی که تلاش می‌کنید در زمان اجرای کارهای در حال اجرا یا تعلیق‌شده از پوسته خارج شوید، به شما هشدار داده خواهد شد که «You have suspended (running) jobs»\&. می‌توانید از دستور \fBjobs\fP برای دیدن آن‌ها استفاده کنید\&. اگر این کار را انجام دهید یا بلافاصله دوباره برای خروج تلاش کنید، پوسته برای بار دوم به شما هشدار نخواهد داد؛ کارهای معلق خاتمه می‌یابند، و در صورتی که گزینهٔ \fBHUP\fP تنظیم شده باشد، به کارهای در حال اجرا یک سیگنال \fBSIGHUP\fP ارسال خواهد شد\&. .PP برای جلوگیری از پایان دادن به کارهای در حال اجرا توسط پوسته، یا از دستور \fInohup\fP(1) استفاده کنید یا از دستور توکار \fBdisown\fP\&. .SH "سیگنال‌ها (SIGNALS)" سیگنال‌های \fBINT\fP و \fBQUIT\fP برای یک دستور فراخوانی‌شده نادیده گرفته می‌شوند، اگر پس از دستور «\fB&\fP» آمده باشد و گزینهٔ \fBMONITOR\fP فعال نباشد\&. خودِ پوسته همیشه سیگنال \fBQUIT\fP را نادیده می‌گیرد\&. در غیر این صورت، سیگنال‌ها مقادیری را دارند که پوسته از والد خود به ارث برده است (اما به توابع ویژهٔ \fBTRAP\fP\fINAL\fP در بخش «Functions» مراجعه کنید)\&. .PP برخی از کارها، به غیر از آن‌هایی که صراحتاً به پس‌زمینه فرستاده شده‌اند، توسط پوسته به صورت ناهمگام اجرا می‌شوند؛ حتی در مواردی که پوسته معمولاً منتظر چنین کارهایی می‌ماند، یک دستور صریح \fBexit\fP یا خروج به دلیل فعال بودن گزینهٔ \fBERR_EXIT\fP باعث می‌شود که پوسته بدون انتظار خارج شود\&. نمونه‌هایی از این کارهای ناهمگام عبارتند از جایگزینی فرایند (process substitution)، بخش PROCESS SUBSTITUTION را در صفحهٔ راهنمای \fIzshexpn\fP(1) ببینید، و فرایندهای پردازشگر multios، بخش MULTIOS را در صفحهٔ راهنمای \fIzshmisc\fP(1) ببینید\&. .\" Yodl file: Zsh/arith.yo .SH "ارزیابی محاسباتی (ARITHMETIC EVALUATION)" پوسته می‌تواند محاسبات عدد صحیح و ممیز شناور را با استفاده از دستور توکار \fBlet\fP، یا از طریق جایگزینی به شکل \fB$((\fP\fI\&.\&.\&.\fP\fB))\fP انجام دهد\&. برای اعداد صحیح، در صورت در دسترس بودن، پوسته معمولاً با دقت ۸ بایتی کامپایل می‌شود، در غیر این صورت دقت ۴ بایت خواهد بود\&. این مورد را می‌توان به عنوان مثال با اجرای دستور «\fBprint \- $(( 12345678901 ))\fP» بررسی کرد؛ اگر عدد بدون تغییر نمایش داده شود، دقت محاسباتی حداقل ۸ بایت است\&. محاسبات ممیز شناور همیشه از نوع «double» با هر دقتی که توسط کامپایلر و کتابخانه ارائه می‌شود، استفاده می‌کند\&. .PP دستور توکار \fBlet\fP عبارات حسابی را به عنوان آرگومان می‌پذیرد؛ هر کدام به صورت جداگانه ارزیابی می‌شوند\&. از آنجا که بسیاری از عملگرهای محاسباتی و همچنین فاصله‌ها نیازمند نقل‌قول هستند، یک شکل جایگزین ارائه شده است: برای هر دستوری که با «\fB((\fP» آغاز شود، تمامی نویسه‌ها تا «\fB))\fP» متناظر با آن به عنوان یک عبارت درون نقل‌قول دوتایی در نظر گرفته می‌شوند و بسط حسابی مشابه یک آرگومان برای \fBlet\fP روی آن صورت می‌گیرد\&. به طور دقیق‌تر، «\fB((\fP\fI\&.\&.\&.\fP\fB))\fP» معادل «\fBlet "\fP\fI\&.\&.\&.\fP\fB"\fP» است\&. وضعیت بازگشتی در صورتی که مقدار محاسباتی عبارت غیرصفر باشد ۰، اگر صفر باشد ۱، و در صورت بروز خطا ۲ است\&. .PP به عنوان مثال، عبارت زیر .PP .RS .nf \fB(( val = 2 + 1 ))\fP .fi .RE .PP معادل است با .PP .RS .nf \fBlet "val = 2 + 1"\fP .fi .RE .PP که هر دو مقدار ۳ را به متغیر پوستهٔ \fBval\fP انتساب داده و وضعیت خروج صفر برمی‌گردانند\&. .PP اعداد صحیح می‌توانند در مبناهایی به غیر از ۱۰ باشند\&. پیشوند «\fB0x\fP» یا «\fB0X\fP» نشان‌دهندهٔ مبنای ۱۶ و پیشوند «\fB0b\fP» یا «\fB0B\fP» نشان‌دهندهٔ دودویی است\&. اعداد صحیح همچنین می‌توانند به شکل «\fIbase\fP\fB#\fP\fIn\fP» باشند، که در آن \fIbase\fP عددی ده‌دهی بین دو و سی‌وشش است که مبنای محاسباتی را مشخص می‌کند و \fIn\fP عددی در آن مبنا است (برای مثال، «\fB16#ff\fP» برابر ۲۵۵ در مبنای ۱۶ است)\&. پیشوند \fIbase\fP\fB#\fP می‌تواند حذف شود، که در این حالت مبنای ۱۰ به کار می‌رود\&. به منظور سازگاری با گذشته، قالب «\fB[\fP\fIbase\fP\fB]\fP\fIn\fP» نیز پذیرفته می‌شود\&. .PP یک عبارت عدد صحیح یا مبنایی که به شکل «\fIbase\fP\fB#\fP\fIn\fP» داده شده است، می‌تواند پس از رقم آغازین شامل زیرخط‌ها («\fB_\fP») برای راهنمایی بصری باشد؛ این موارد در محاسبات نادیده گرفته می‌شوند\&. نمونه‌هایی از این دست عبارتند از \fB1_000_000\fP یا \fB0xffff_ffff\fP که به ترتیب معادل \fB1000000\fP و \fB0xffffffff\fP هستند\&. .PP همچنین می‌توان مبنایی را برای استفاده در خروجی به شکل «\fB[#\fP\fIbase\fP\fB]\fP»، برای مثال «\fB[#16]\fP»، مشخص کرد\&. این مورد هنگام چاپ خروجی جایگزینی‌های محاسباتی یا هنگام انتساب به پارامترهای اسکالر به کار می‌رود، اما پارامتری که صراحتاً به عنوان عدد صحیح یا ممیز شناور تعریف شده باشد تحت تأثیر قرار نخواهد گرفت\&. اگر یک متغیر عدد صحیح به طور ضمنی توسط یک عبارت محاسباتی تعریف شود، هر مبنایی که بدین طریق مشخص شده باشد به عنوان مبنای محاسباتی خروجیِ متغیر تنظیم می‌شود، درست مانند اینکه گزینهٔ «\fB\-i\fP \fIbase\fP» در دستور توکار \fBtypeset\fP استفاده شده باشد\&. این عبارت هیچ حق تقدمی ندارد و اگر بیش از یک بار در یک عبارت ریاضی بیاید، آخرین موردی که دیده شده اعمال می‌شود\&. برای وضوح، توصیه می‌شود که در آغاز عبارت قرار گیرد\&. به عنوان مثال: .PP .RS .nf \fBtypeset \-i 16 y print $(( [#8] x = 32, y = 32 )) print $x $y\fP .fi .RE .PP ابتدا «\fB8#40\fP»، راست‌ترین مقدار در مبنای خروجی ارائه‌شده، و سپس «\fB8#40 16#20\fP» را در خروجی چاپ می‌کند، زیرا \fBy\fP صراحتاً دارای مبنای خروجی ۱۶ اعلان شده است، در حالی که نوعِ \fBx\fP (با فرض اینکه از قبل وجود نداشته است) به طور ضمنی با ارزیابی محاسباتی تعیین شده و مبنای خروجی ۸ را دریافت می‌کند\&. .PP می‌توان \fIbase\fP را با یک زیرخط جایگزین کرد یا پس از آن یک زیرخط آورد، که خود می‌تواند با یک عدد صحیح مثبت دنبال شود (اگر قید نشود، مقدار ۳ استفاده می‌شود)\&. این امر مشخص می‌کند که برای وضوح بصری، باید زیرخط‌هایی جهت گروه‌بندی ارقام عدد در رشتهٔ خروجی درج شوند\&. عدد صحیحِ پس از آن، تعداد ارقامی را که باید با هم گروه‌بندی شوند مشخص می‌کند\&. برای مثال: .PP .RS .nf \fBsetopt cbases print $(( [#16_4] 65536 ** 2 ))\fP .fi .RE .PP مقدار «\fB0x1_0000_0000\fP» را چاپ می‌کند\&. .PP این قابلیت می‌تواند برای اعداد ممیز شناور نیز استفاده شود، که در این حالت مبنا باید حذف شود؛ گروه‌بندی ارقام در جهت دور شدن از ممیز انجام می‌شود\&. برای مثال، .PP .RS .nf \fBzmodload zsh/mathfunc print $(( [#_] sqrt(1e7) ))\fP .fi .RE .PP مقدار «\fB3_162\&.277_660_168_379_5\fP» را در خروجی نمایش می‌دهد (تعداد رقم‌های اعشاری نمایش‌داده‌شده ممکن است متفاوت باشد)\&. .PP اگر گزینهٔ \fBC_BASES\fP تنظیم شده باشد، اعداد مبنای ۱۶ در قالب استاندارد C خارج می‌شوند، برای مثال «\fB0xFF\fP» به جای قالب معمول «\fB16#FF\fP»\&. اگر گزینهٔ \fBOCTAL_ZEROES\fP نیز تنظیم شده باشد (به صورت پیش‌فرض تنظیم نیست)، رفتار مشابهی با اعداد مبنای هشت خواهد شد و به جای «\fB8#77\fP» به صورت «\fB077\fP» نمایش می‌یابند\&. این گزینه اثری بر خروجی مبناهایی غیر از ۱۶ و ۸ ندارد، و این قالب‌ها همیشه در ورودی معتبر و قابل تشخیص هستند\&. .PP هنگامی که یک مبنای خروجی با استفاده از نحو «\fB[#\fP\fIbase\fP\fB]\fP» مشخص می‌شود، در صورت نیاز پیشوند مناسبِ مبنا در خروجی ظاهر خواهد شد تا مقدار خروجی نحوی معتبر برای ورودی باشد\&. اگر \fB#\fP دو بار تکرار شود، برای مثال «\fB[##16]\fP»، هیچ پیشوند مبنایی در خروجی درج نمی‌شود\&. .PP ثابت‌های ممیز شناور با وجود ممیز اعشاری یا توان (نماد علمی) شناسایی می‌شوند\&. ممیز اعشاری می‌تواند نخستین نویسهٔ مقدار ثابت باشد، اما نویسهٔ توان \fBe\fP یا \fBE\fP نمی‌تواند در ابتدا بیاید، چرا که به عنوان نام پارامتر در نظر گرفته می‌شود\&. تمام بخش‌های عددی (قبل و بعد از ممیز و در توان) می‌توانند پس از رقم آغازین شامل زیرخط‌هایی برای وضوح بصری باشند؛ این موارد در محاسبات نادیده گرفته می‌شوند\&. .PP یک عبارت محاسباتی تقریباً از همان نحو و شرکت‌پذیریِ عبارات در زبان C بهره می‌برد\&. .PP در حالت بومیِ عملکرد، عملگرهای زیر پشتیبانی می‌شوند (به ترتیب اولویت کاهشی فهرست شده‌اند): .PP .PD 0 .TP \fB+ \- ! ~ ++ \-\-\fP مثبت/منفی یگانی، NOT منطقی، متمم، {پیش،پس}{افزایش،کاهش} .TP \fB<< >>\fP شیفت بیتی به چپ، راست .TP \fB&\fP AND بیتی .TP \fB^\fP XOR بیتی .TP \fB|\fP OR بیتی .TP \fB**\fP به توان رساندن .TP \fB* / %\fP ضرب، تقسیم، باقی‌مانده (پیمانه) .TP \fB+ \-\fP جمع، تفریق .TP \fB< > <= >=\fP مقایسه .TP \fB== !=\fP برابری و نابرابری.TP \fB&&\fP AND منطقی .TP \fB|| ^^\fP OR و XOR منطقی .TP \fB? :\fP عملگر سه‌تایی .TP \fB= += \-= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=\fP انتساب .TP \fB,\fP عملگر کاما .PD .PP عملگرهای `\fB&&\fP\&'، `\fB||\fP'، `\fB&&=\fP' و `\fB||=\fP' از نوع اتصال‌کوتاه (short\-circuiting) هستند و در عملگر سه‌تایی تنها یکی از دو عبارت پسین ارزیابی می‌شود\&. به اولویت عملگرهای بیتی AND، OR و XOR دقت کنید\&. .PP با گزینهٔ \fBC_PRECEDENCES\fP اولویت‌ها (و نه دیگر ویژگی‌های) عملگرها تغییر یافته و مشابه بیشتر زبان‌های دیگری می‌شود که از عملگرهای مربوطه پشتیبانی می‌کنند: .PP .PD 0 .TP \fB+ \- ! ~ ++ \-\-\fP مثبت/منفی یکانی، NOT منطقی، متمم، {پیش،پس}{افزایش،کاهش} .TP \fB**\fP توان‌رسانی .TP \fB* / %\fP ضرب، تقسیم، باقی‌مانده (modulus) .TP \fB+ \-\fP جمع، تفریق .TP \fB<< >>\fP شیفت بیتی به چپ، راست .TP \fB< > <= >=\fP مقایسه .TP \fB== !=\fP برابری و نابرابری .TP \fB&\fP AND بیتی .TP \fB^\fP XOR بیتی .TP \fB|\fP OR بیتی .TP \fB&&\fP AND منطقی .TP \fB^^\fP XOR منطقی .TP \fB||\fP OR منطقی .TP \fB? :\fP عملگر سه‌تایی .TP \fB= += \-= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=\fP انتساب .TP \fB,\fP عملگر کاما .PD .PP توجه داشته باشید که اولویت توان‌رسانی در هر دو حالت پایین‌تر از عملگرهای یکانی است؛ از این رو `\fB\-3**2\fP\&' برابر با `\fB9\fP' ارزیابی می‌شود، نه `\fB\-9\fP\&'\&. در صورت نیاز از پرانتز استفاده کنید: `\fB\-(3**2)\fP'\&. این رفتار برای سازگاری با سایر شل‌ها است\&. .PP توابع ریاضی را می‌توان با نحو `\fIfunc\fP\fB(\fP\fIargs\fP\fB)\fP\&' فراخوانی کرد، که در آن خود تابع تعیین می‌کند آیا \fIargs\fP به عنوان یک رشته یا به عنوان فهرستی از عبارات حسابی جدا شده با کاما استفاده شود\&. در حال حاضر شل به طور پیش‌فرض هیچ تابع ریاضی تعریف نمی‌کند، اما ماژول \fBzsh/mathfunc\fP را می‌توان با دستور توکار \fBzmodload\fP بارگذاری کرد تا توابع ریاضی استاندارد ممیز شناور را ارائه دهد\&. .PP عبارتی به شکل `\fB##\fP\fIx\fP\&' که در آن \fIx\fP هر دنباله‌ای از نویسه‌ها مانند `\fBa\fP\&'، `\fB^A\fP' یا `\fB\eM\-\eC\-x\fP' است، مقدار این نویسه را می‌دهد و عبارتی به شکل `\fB#\fP\fIname\fP\&' مقدار نخستین نویسه از محتوای پارامتر \fIname\fP را برمی‌گرداند\&. مقادیر نویسه‌ها مطابق با مجموعه نویسه‌های مورد استفاده در محلی (locale) جاری است؛ برای مدیریت نویسه‌های چندبایتی، گزینهٔ \fBMULTIBYTE\fP باید فعال باشد\&. توجه داشته باشید که این ساختار با `\fB$#\fP\fIname\fP\&' متفاوت است، که یک جایگزینی پارامتر استاندارد است و طول پارامتر \fIname\fP را برمی‌گرداند\&. عبارت `\fB#\e\fP\&' به جای `\fB##\fP' پذیرفته می‌شود، اما استفاده از آن منسوخ شده است\&. .PP پارامترهای نام‌گذاری‌شده و آرایه‌های نمایه‌دار را می‌توان بدون استفاده از نحو بسط پارامتر، با نام آن‌ها درون یک عبارت حسابی مورد ارجاع قرار داد\&. برای مثال، .PP .RS .nf \fB((val2 = val1 * 2))\fP .fi .RE .PP دو برابر مقدار \fB$val1\fP را به پارامتری با نام \fBval2\fP انتساب می‌دهد\&. .PP نمایش داخلی عدد صحیح برای یک پارامتر نام‌گذاری‌شده را می‌توان با دستور توکار \fBinteger\fP مشخص کرد\&. ارزیابی حسابی بر روی مقدار هر انتساب به یک پارامتر نام‌گذاری‌شده که به این شکل به عنوان صحیح اعلان شده است، انجام می‌شود\&. انتساب یک عدد ممیز شناور به یک عدد صحیح منجر به گرد کردن به سمت صفر می‌شود\&. .PP به همین ترتیب، اعداد ممیز شناور را می‌توان با دستور توکار \fBfloat\fP اعلان کرد؛ دو نوع وجود دارد که تنها در قالب خروجی‌شان متفاوتند، همان‌طور که برای دستور توکار \fBtypeset\fP شرح داده شده است\&. قالب خروجی را می‌توان با استفاده از جایگزینی حسابی به جای جایگزینی پارامتر دور زد، یعنی `\fB${\fP\fIfloat\fP\fB}\fP\&' از قالب تعریف‌شده استفاده می‌کند، اما `\fB$((\fP\fIfloat\fP\fB))\fP\&' از یک قالب عمومی ممیز شناور بهره می‌برد\&. .PP ارتقای مقادیر عدد صحیح به ممیز شناور در صورت نیاز انجام می‌شود\&. علاوه بر این، اگر به هر عملگری که به عدد صحیح نیاز دارد (`\fB&\fP\&'، `\fB|\fP'، `\fB^\fP'، `\fB<<\fP'، `\fB>>\fP' و معادل‌های انتسابی آن‌ها) یک آرگومان ممیز شناور داده شود، مقدار به طور خودکار به سمت صفر گرد می‌شود، به جز برای `\fB~\fP\&' که به سمت پایین گرد می‌کند\&. .PP کاربران باید توجه داشته باشند که مانند بسیاری از زبان‌های برنامه‌نویسی دیگر (اما برعکس نرم‌افزارهای طراحی‌شده برای محاسبات)، ارزیابی یک عبارت در zsh جزء به جزء انجام می‌شود و ارتقای اعداد صحیح به ممیز شناور در عباراتی که تنها حاوی اعداد صحیح هستند رخ نمی‌دهد\&. نتیجهٔ معمول این امر این است که تقسیمی مانند \fB6/8\fP بریده (truncated) می‌شود که در این حالت به سمت ۰ گرد می‌گردد\&. گزینهٔ شل \fBFORCE_FLOAT\fP را می‌توان در اسکریپت‌ها یا توابعی به کار برد که در سرتاسر آن‌ها به ارزیابی ممیز شناور نیاز است\&. .PP متغیرهای نرده‌ای (scalar) می‌توانند در زمان‌های مختلف مقادیر عدد صحیح یا ممیز شناور را در خود نگه دارند؛ در این حالت هیچ سابقه‌ای از نوع عددی ذخیره نمی‌شود\&. .PP اگر متغیری برای نخستین بار در یک زمینهٔ عددی بدون اعلان قبلی مقداردهی شود، نوع آن به طور ضمنی \fBinteger\fP یا \fBfloat\fP تعیین می‌شود و این نوع را تا زمانی که صریحاً تغییر یابد یا تا پایان حوزه (scope) حفظ می‌کند\&. این امر می‌تواند پیامدهای پیش‌بینی‌نشده‌ای داشته باشد\&. برای مثال، در حلقهٔ .PP .RS .nf \fBfor (( f = 0; f < 1; f += 0\&.1 )); do # use $f done\fP .fi .RE .PP اگر \fBf\fP از پیش اعلان نشده باشد، اولین انتساب باعث ایجاد آن به عنوان یک عدد صحیح می‌شود و در نتیجه عملیات `\fBf += 0\&.1\fP\&' همواره موجب بریده شدن نتیجه به صفر خواهد شد، به طوری که حلقه با شکست مواجه می‌شود\&. یک راهکار ساده این است که مقداردهی اولیه را به `\fBf = 0\&.0\fP\&' تغییر دهید\&. بنابراین بهتر است متغیرهای عددی با انواع صریح اعلان شوند\&. .\" Yodl file: Zsh/cond.yo.SH "عبارت‌های شرطی (CONDITIONAL EXPRESSIONS)" یک \fIعبارت شرطی\fP همراه با دستور مرکب \fB[[\fP برای آزمایش مشخصه‌های فایل‌ها و مقایسهٔ رشته‌ها به کار می‌رود\&. هر عبارت می‌تواند از یک یا چند مورد از عبارت‌های یگانی یا دودویی زیر ساخته شود: .PP .PD 0 .TP .PD \fB\-a\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد\&. .TP \fB\-b\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک فایل ویژهٔ بلوکی باشد\&. .TP \fB\-c\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک فایل ویژهٔ نویسه‌ای باشد\&. .TP \fB\-d\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک دایرکتوری باشد\&. .TP \fB\-e\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد\&. .TP \fB\-f\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک فایل عادی باشد\&. .TP \fB\-g\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و بیت setgid آن تنظیم شده باشد\&. .TP \fB\-h\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک پیوند نمادین باشد\&. .TP \fB\-k\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و بیت sticky آن تنظیم شده باشد\&. .TP \fB\-n\fP \fIstring\fP درست است اگر طول \fIstring\fP غیرصفر باشد\&. .TP \fB\-o\fP \fIoption\fP درست است اگر گزینهٔ \fIoption\fP فعال باشد\&. \fIoption\fP می‌تواند یک نویسهٔ تنها باشد، که در این صورت نام یک گزینهٔ تک‌حرفی است\&. (بخش `Specifying Options\&' را ببینید\&.) .RS .PP هنگامی که هیچ گزینه‌ای با نام \fIoption\fP وجود نداشته باشد، و گزینهٔ \fBPOSIX_BUILTINS\fP تنظیم نشده باشد، مقدار ۳ را همراه با یک هشدار بازمی‌گرداند\&. اگر آن گزینه تنظیم شده باشد، مقدار ۱ را بدون هیچ هشداری بازمی‌گرداند\&. .RE .TP \fB\-p\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک فایل ویژهٔ FIFO (لولهٔ نام‌گذاری‌شده) باشد\&. .TP \fB\-r\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و توسط فرایند جاری قابل خواندن باشد\&. .TP \fB\-s\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و اندازهٔ آن بزرگ‌تر از صفر باشد\&. .TP \fB\-t\fP \fIfd\fP درست است اگر توصیف‌گر فایل با شمارهٔ \fIfd\fP باز بوده و با یک دستگاه ترمینال مرتبط باشد\&. (نکته: \fIfd\fP اختیاری نیست) .TP \fB\-u\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و بیت setuid آن تنظیم شده باشد\&. .TP \fB\-v\fP \fIvarname\fP درست است اگر متغیر پوستهٔ \fIvarname\fP تنظیم شده باشد\&. .TP \fB\-w\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و توسط فرایند جاری قابل نوشتن باشد\&. .TP \fB\-x\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و توسط فرایند جاری قابل اجرا باشد\&. اگر \fIfile\fP وجود داشته باشد و یک دایرکتوری باشد، به این معنی است که فرایند جاری اجازهٔ جستجو در آن دایرکتوری را دارد\&. .TP \fB\-z\fP \fIstring\fP درست است اگر طول \fIstring\fP صفر باشد\&. .TP \fB\-L\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک پیوند نمادین باشد\&. .TP \fB\-O\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و متعلق به شناسهٔ کاربری مؤثر (effective UID) این فرایند باشد\&. .TP \fB\-G\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و گروه آن با شناسهٔ گروهی مؤثر (effective GID) این فرایند مطابقت داشته باشد\&. .TP \fB\-S\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و یک سوکت باشد\&. .TP \fB\-N\fP \fIfile\fP درست است اگر \fIfile\fP وجود داشته باشد و زمان دسترسی به آن، جدیدتر از زمان اصلاح آن نباشد\&. .TP \fIfile1\fP \fB\-nt\fP \fIfile2\fP درست است اگر \fIfile1\fP وجود داشته باشد و از \fIfile2\fP جدیدتر باشد\&. .TP \fIfile1\fP \fB\-ot\fP \fIfile2\fP درست است اگر \fIfile1\fP وجود داشته باشد و از \fIfile2\fP قدیمی‌تر باشد\&. .TP \fIfile1\fP \fB\-ef\fP \fIfile2\fP درست است اگر \fIfile1\fP و \fIfile2\fP وجود داشته باشند و به همان فایل یکسان اشاره کنند\&. .TP .PD 0 \fIstring\fP \fB=\fP \fIpattern\fP .TP .PD \fIstring\fP \fB==\fP \fIpattern\fP درست است اگر \fIstring\fP با \fIpattern\fP مطابقت داشته باشد\&. این دو حالت دقیقاً معادل یکدیگرند\&. حالت `\fB=\fP\&' نحو سنتی پوسته است (و از این رو تنها حالتی است که عموماً به همراه دستورهای توکار \fBtest\fP و \fB[\fP استفاده می‌شود)؛ حالت `\fB==\fP\&' سازگاری با سایر زبان‌های رایانه‌ای را فراهم می‌آورد\&. .TP \fIstring\fP \fB!=\fP \fIpattern\fP درست است اگر \fIstring\fP با \fIpattern\fP مطابقت نداشته باشد\&. .TP \fIstring\fP \fB=~\fP \fIregexp\fP درست است اگر \fIstring\fP با عبارت باقاعدهٔ \fIregexp\fP مطابقت داشته باشد\&. اگر گزینهٔ \fBRE_MATCH_PCRE\fP تنظیم شده باشد، \fIregexp\fP به عنوان یک عبارت باقاعدهٔ PCRE با استفاده از ماژول \fBzsh/pcre\fP ارزیابی می‌شود، در غیر این صورت به عنوان یک عبارت باقاعدهٔ گسترش‌یافتهٔ POSIX با استفاده از ماژول \fBzsh/regex\fP ارزیابی می‌گردد\&. در صورت تطابق موفقیت‌آمیز، برخی متغیرها به‌روزرسانی خواهند شد؛ اگر تطابق ناموفق باشد هیچ متغیری تغییر نمی‌کند\&. .RS .PP اگر گزینهٔ \fBBASH_REMATCH\fP تنظیم نشده باشد، پارامتر اسکالر \fBMATCH\fP بر روی زیررشته‌ای که با الگو مطابقت یافته تنظیم می‌شود و پارامترهای صحیح \fBMBEGIN\fP و \fBMEND\fP به ترتیب روی اندیس شروع و پایان تطابق در \fIstring\fP تنظیم می‌شوند، به طوری که اگر \fIstring\fP در متغیر \fBvar\fP ذخیره شده باشد، عبارت `\fB${var[$MBEGIN,$MEND]}\fP\&' دقیقاً همانند `\fB$MATCH\fP' خواهد بود\&. تنظیمات گزینهٔ \fBKSH_ARRAYS\fP رعایت می‌شود\&. به همین ترتیب، آرایهٔ \fBmatch\fP روی زیررشته‌هایی که با زیرعبارت‌های پرانتزدار تطابق یافته‌اند، و آرایه‌های \fBmbegin\fP و \fBmend\fP به ترتیب روی اندیس‌های موقعیت آغاز و پایان زیررشته‌ها درون \fIstring\fP تنظیم می‌شوند\&. اگر هیچ زیرعبارت پرانتزداری وجود نداشته باشد، این آرایه‌ها مقداردهی نمی‌شوند\&. برای نمونه، اگر رشتهٔ `\fBa short string\fP\&' در برابر عبارت باقاعدهٔ `\fBs(\&.\&.\&.)t\fP\&' ارزیابی شود، آنگاه (با فرض اینکه گزینهٔ \fBKSH_ARRAYS\fP تنظیم نشده باشد) \fBMATCH\fP، \fBMBEGIN\fP و \fBMEND\fP به ترتیب برابر با `\fBshort\fP\&'، \fB3\fP و \fB7\fP خواهند بود، در حالی که \fBmatch\fP، \fBmbegin\fP و \fBmend\fP آرایه‌های تک‌عضوی شامل رشته‌های `\fBhor\fP\&'، `\fB4\fP' و `\fB6\fP' خواهند بود\&. .PP اگر گزینهٔ \fBBASH_REMATCH\fP تنظیم شده باشد، آرایهٔ \fBBASH_REMATCH\fP روی زیررشته‌ای که با الگو مطابقت کرده، و به دنبال آن زیررشته‌هایی که با زیرعبارت‌های پرانتزدار درون الگو مطابقت یافته‌اند، تنظیم می‌شود\&. .RE .TP \fIstring1\fP \fB<\fP \fIstring2\fP درست است اگر \fIstring1\fP بر اساس مقدار ASCII نویسه‌هایشان قبل از \fIstring2\fP بیاید\&. .TP \fIstring1\fP \fB>\fP \fIstring2\fP درست است اگر \fIstring1\fP بر اساس مقدار ASCII نویسه‌هایشان بعد از \fIstring2\fP بیاید\&. .TP \fIexp1\fP \fB\-eq\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی برابر با \fIexp2\fP باشد\&. توجه داشته باشید که برای مقایسه‌های صرفاً عددی، استفاده از دستور توکار \fB((\fP\fI\&.\&.\&.\fP\fB))\fP که در بخش `ARITHMETIC EVALUATION\&' شرح داده شده، بسیار راحت‌تر از عبارت‌های شرطی است\&. .TP \fIexp1\fP \fB\-ne\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی با \fIexp2\fP برابر نباشد\&. .TP \fIexp1\fP \fB\-lt\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی کمتر از \fIexp2\fP باشد\&. .TP \fIexp1\fP \fB\-gt\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی بزرگ‌تر از \fIexp2\fP باشد\&. .TP \fIexp1\fP \fB\-le\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی کمتر یا مساوی با \fIexp2\fP باشد\&. .TP \fIexp1\fP \fB\-ge\fP \fIexp2\fP درست است اگر \fIexp1\fP از نظر عددی بزرگ‌تر یا مساوی با \fIexp2\fP باشد\&. .TP \fB(\fP \fIexp\fP \fB)\fP درست است اگر \fIexp\fP درست باشد\&. .TP \fB!\fP \fIexp\fP درست است اگر \fIexp\fP نادرست باشد\&. .TP \fIexp1\fP \fB&&\fP \fIexp2\fP درست است اگر هر دو \fIexp1\fP و \fIexp2\fP درست باشند\&. .TP \fIexp1\fP \fB||\fP \fIexp2\fP درست است اگر دست‌کم یکی از \fIexp1\fP یا \fIexp2\fP درست باشد\&. .PP برای سازگاری، اگر تنها یک آرگومان وجود داشته باشد که از نظر نحوی عملگر خاصی نباشد، معمولاً یک متغیر، این شرط به عنوان آزمایشی برای این بررسی می‌شود که آیا عبارت به یک رشته با طول غیرصفر بسط می‌یابد یا خیر\&. به بیان دیگر، \fB[[ $var ]]\fP همانند \fB[[ \-n $var ]]\fP است\&. توصیه می‌شود در صورت امکان، از شکل دوم که صریح‌تر است استفاده شود\&..PP بسط عادی شل روی آرگومان‌های \fIfile\fP، \fIstring\fP و \fIpattern\fP انجام می‌شود، اما نتیجهٔ هر بسط، همانند اثر نقل‌قول دوگانه (double quotes)، محدود به یک کلمهٔ واحد است\&. .PP تولید نام فایل (Filename generation) روی هیچ شکلی از آرگومان‌ها در شرط‌ها اعمال نمی‌شود\&. با این حال، در هر حالتی که بسط عادی شل معتبر باشد و زمانی که گزینهٔ \fBEXTENDED_GLOB\fP فعال است، می‌توان با استفاده از یک توصیف‌کنندهٔ صریح glob به شکل \fB(#q)\fP در انتهای رشته، آن را اجبار کرد\&. یک عبارت توصیف‌کنندهٔ عادی glob می‌تواند بین «\fBq\fP\&» و پرانتز بسته قرار گیرد؛ در صورتی که عبارتی درج نشود، این عبارت هیچ اثری فراتر از واداشتن به تولید نام فایل ندارد\&. نتایج تولید نام فایل همانند نتایج سایر اشکال بسط، برای تشکیل یک کلمهٔ واحد به یکدیگر می‌پیوندند\&. .PP این استفادهٔ ویژه از تولید نام فایل فقط با نحو \fB[[\fP در دسترس است\&. اگر شرط درون دستورهای توکار \fB[\fP یا \fBtest\fP رخ دهد، عمل globbing به جای آن به عنوان بخشی از بسط عادی خط فرمان پیش از ارزیابی شرط انجام می‌شود\&. در این حالت ممکن است چندین کلمه تولید شود که به احتمال زیاد نحو دستور test را برهم می‌زند\&. .PP برای مثال، .PP .RS .nf \fB[[ \-n file*(#qN) ]]\fP .fi .RE .PP تنها در صورتی وضعیت خروج صفر تولید می‌کند که حداقل یک فایل در دایرکتوری جاری با رشتهٔ «\fBfile\fP\&» آغاز شود\&. توصیف‌کنندهٔ تطبیق الگوی \fBN\fP تضمین می‌کند که در صورت نبود فایلی منطبق، عبارت خالی باشد\&. .PP نویسه‌های عام الگو برای آرگومان‌های \fIpattern\fP فعال هستند؛ الگوها همان مواردی هستند که برای تولید نام فایل استفاده می‌شوند، \fIzshexpn\fP(1) را ببینید، اما رفتار ویژه‌ای برای «\fB/\fP\&» یا نقطه‌های ابتدایی وجود ندارد و هیچ توصیف‌کنندهٔ globای مجاز نیست\&. .PP در هر یک از عبارت‌های فوق، اگر \fIfile\fP به شکل «\fB/dev/fd/\fP\fIn\fP\&» باشد که در آن \fIn\fP یک عدد صحیح است، آزمایش روی فایل بازی اعمال می‌شود که شماره توصیف‌گر (descriptor) آن \fIn\fP است، حتی اگر سیستم زیرین از دایرکتوری \fB/dev/fd\fP پشتیبانی نکند\&. .PP در شکل‌هایی که مقایسهٔ عددی انجام می‌دهند، عبارت‌های \fIexp\fP تحت بسط محاسباتی قرار می‌گیرند، گویی درون \fB$((\fP\fI\&.\&.\&.\fP\fB))\fP محصور شده‌اند\&. .PP برای مثال، عبارت زیر: .PP .RS .nf \fB[[ ( \-f foo || \-f bar ) && $report = y* ]] && print File exists\&.\fP .fi .RE .PP بررسی می‌کند که آیا فایل \fBfoo\fP یا فایل \fBbar\fP وجود دارد یا خیر، و اگر چنین باشد، آیا مقدار پارامتر \fBreport\fP با «\fBy\fP\&» آغاز می‌شود یا خیر؛ اگر کل شرط درست باشد، پیام «\fBFile exists\&.\fP\&» چاپ می‌شود\&. .\" Yodl file: Zsh/prompt.yo .SH "بسط توالی‌های اعلان (EXPANSION OF PROMPT SEQUENCES)" توالی‌های اعلان تحت نوع خاصی از بسط قرار می‌گیرند\&. این نوع بسط با استفاده از گزینهٔ \fB\-P\fP در دستور توکار \fBprint\fP نیز در دسترس است\&. .PP اگر گزینهٔ \fBPROMPT_SUBST\fP تنظیم شده باشد، رشتهٔ اعلان ابتدا تحت \fIبسط پارامتر\fP، \fIجایگزینی دستور\fP و \fIبسط محاسباتی\fP قرار می‌گیرد\&. \fIzshexpn\fP(1) را ببینید\&. توالی‌های گریز خاصی ممکن است در رشتهٔ اعلان شناسایی شوند\&. .PP اگر گزینهٔ \fBPROMPT_BANG\fP تنظیم شده باشد، نویسهٔ «\fB!\fP\&» در اعلان با شمارهٔ رویداد تاریخچهٔ جاری جایگزین می‌شود\&. در این حالت یک «\fB!\fP\&» لفظی می‌تواند به صورت «\fB!!\fP\&» نمایش داده شود\&. .PP اگر گزینهٔ \fBPROMPT_PERCENT\fP تنظیم شده باشد، توالی‌های گریز خاصی که با «\fB%\fP\&» آغاز می‌شوند بسط می‌یابند\&. بسیاری از گریزها با یک نویسهٔ منفرد دنبال می‌شوند، هرچند برخی از آن‌ها یک آرگومان عدد صحیح اختیاری می‌پذیرند که باید بین «\fB%\fP\&» و نویسهٔ بعدی توالی قرار گیرد\&. توالی‌های گریز پیچیده‌تری نیز برای ارائهٔ بسط شرطی موجود هستند\&. .PP .SH "گریزهای ساده اعلان (SIMPLE PROMPT ESCAPES)" .PP .SS "نویسه‌های خاص (Special characters)" .PD 0 .TP .PD \fB%%\fP یک «\fB%\fP\&»\&. .TP \fB%)\fP یک «\fB)\fP\&»\&. .PP .SS "اطلاعات ورود به سیستم (Login information)" .PD 0 .TP .PD \fB%l\fP خطی (tty) که کاربر به آن وارد شده است، بدون پیشوند «\fB/dev/\fP\&»\&. اگر نام با «\fB/dev/tty\fP\&» آغاز شود، آن پیشوند حذف می‌شود\&. .TP \fB%M\fP نام کامل میزبان ماشین\&. .TP \fB%m\fP نام میزبان تا نخستین «\fB\&.\fP\&»\&. یک عدد صحیح می‌تواند پس از «\fB%\fP\&» بیاید تا مشخص کند چه تعداد از مؤلفه‌های نام میزبان مورد نظر است\&. با یک عدد صحیح منفی، مؤلفه‌های انتهایی نام میزبان نمایش داده می‌شوند\&. .TP \fB%n\fP \fB$USERNAME\fP\&. .TP \fB%y\fP خطی (tty) که کاربر به آن وارد شده است، بدون پیشوند «\fB/dev/\fP\&»\&. این مورد با نام‌های «\fB/dev/tty\fP\&» رفتار ویژه‌ای ندارد\&. .PP.SS "وضعیت پوسته (Shell state)" .PD 0 .TP .PD \fB%#\fP اگر پوسته با دسترسی ممتاز اجرا شود یک «\fB#\fP\&»، و در غیر این صورت یک «\fB%\fP». معادل با «\fB%(!\&.#\&.%%)\fP\&». تعریف «ممتاز» (دارای دسترسی ویژه) برای این منظور بدین معناست که شناسهٔ کاربری مؤثر (effective user ID) صفر باشد، یا در صورت پشتیبانی از قابلیت‌های POSIX\&.1e، حداقل یک قابلیت در بردار قابلیت‌های مؤثر (Effective) یا ارث‌بر (Inheritable) فعال شده باشد. .TP \fB%?\fP وضعیت بازگشتی آخرین دستور اجرا شده درست پیش از اعلان (prompt). .TP \fB%_\fP وضعیت تجزیه‌کننده (parser)، یعنی ساختارهای پوسته (مانند «\fBif\fP\&» و «\fBfor\fP\&») که در خط فرمان آغاز شده‌اند. در صورت ارائهٔ یک عدد صحیح، به همان تعداد رشته چاپ خواهد شد؛ عدد صفر، منفی یا عدم تعیین عدد صحیح به معنای چاپ تمامی موارد موجود است. این قابلیت بیشترین کاربرد را در اعلان‌های \fBPS2\fP برای خطوط ادامه‌دار و \fBPS4\fP برای اشکال‌زدایی با گزینهٔ \fBXTRACE\fP دارد؛ در حالت دوم به‌صورت غیرتعاملی نیز کار خواهد کرد. .TP \fB%^\fP وضعیت تجزیه‌کننده به‌صورت معکوس. این مورد به‌جز ترتیب رشته‌ها مشابه «\fB%_\fP\&» است. معمولاً در \fBRPS2\fP به کار می‌رود. .TP .PD 0 \fB%d\fP .TP .PD \fB%/\fP دایرکتوری کاری فعلی. اگر یک عدد صحیح به دنبال «\fB%\fP\&» بیاید، تعداد مؤلفه‌های انتهایی دایرکتوری کاری فعلی را برای نمایش مشخص می‌کند؛ صفر به معنای کل مسیر است. یک عدد صحیح منفی مؤلفه‌های ابتدایی را مشخص می‌کند، به عنوان مثال \fB%\-1d\fP مؤلفهٔ نخست را مشخص می‌سازد. .TP \fB%~\fP همانند \fB%d\fP و \fB%/\fP، اما اگر دایرکتوری کاری فعلی با \fB$HOME\fP آغاز شود، آن بخش با یک «\fB~\fP\&» جایگزین می‌شود. افزون بر این، اگر یک دایرکتوری نام‌گذاری‌شده پیشوند آن باشد، آن بخش با یک «\fB~\fP\&» و به دنبال آن نام دایرکتوری جایگزین می‌شود، اما تنها اگر نتیجه از مسیر کامل کوتاه‌تر باشد؛ بخش‌های \fIDynamic\fP و \fIStatic named directories\fP را در \fIzshexpn\fP(1) ببینید. .TP \fB%e\fP عمق ارزیابی فایل منبع‌شده (sourced) فعلی، تابع پوسته یا \fBeval\fP. هر بار که مقدار \fB%N\fP تنظیم شود یا به مقدار قبلی بازگردد، این مقدار به ترتیب افزایش یا کاهش می‌یابد. این مورد برای اشکال‌زدایی به‌عنوان بخشی از \fB$PS4\fP بسیار سودمند است. .TP .PD 0 \fB%h\fP .TP .PD \fB%!\fP شمارهٔ رویداد تاریخچهٔ (history) فعلی. .TP \fB%i\fP شمارهٔ خطی که در حال حاضر در اسکریپت، فایل منبع‌شده یا تابع پوستهٔ مشخص‌شده توسط \fB%N\fP در حال اجرا است. این مورد برای اشکال‌زدایی به‌عنوان بخشی از \fB$PS4\fP بیشترین کاربرد را دارد. .TP \fB%I\fP شمارهٔ خطی که در حال حاضر در فایل \fB%x\fP در حال اجرا است. این شبیه به \fB%i\fP است، اما شمارهٔ خط همیشه شمارهٔ خط در فایلی است که کد در آن تعریف شده، حتی اگر کد یک تابع پوسته باشد. .TP \fB%j\fP تعداد کارها (jobs). .TP \fB%L\fP مقدار فعلی \fB$SHLVL\fP. .TP \fB%N\fP نام اسکریپت، فایل منبع‌شده یا تابع پوسته‌ای که zsh در حال حاضر اجرا می‌کند (هرکدام که اخیراً شروع شده باشد). اگر موردی وجود نداشته باشد، این معادل پارامتر \fB$0\fP است. یک عدد صحیح می‌تواند پس از «\fB%\fP\&» بیاید تا تعداد مؤلفه‌های انتهایی مسیر را برای نمایش مشخص کند؛ صفر به معنای کل مسیر است. یک عدد صحیح منفی مؤلفه‌های ابتدایی را مشخص می‌کند. .TP \fB%x\fP نام فایل حاوی کد منبعی که در حال حاضر در حال اجرا است. این مانند \fB%N\fP عمل می‌کند، با این تفاوت که به‌جای نام توابع و دستورات eval، فایلی که در آن تعریف شده‌اند نمایش داده می‌شود. .TP .PD 0 \fB%c\fP .TP .PD 0 \fB%\&.\fP .TP .PD \fB%C\fP مؤلفهٔ انتهایی دایرکتوری کاری فعلی. یک عدد صحیح می‌تواند پس از «\fB%\fP\&» بیاید تا بیش از یک مؤلفه دریافت شود. به جز زمانی که از «\fB%C\fP\&» استفاده شود، ابتدا خلاصه‌سازی تیلدا انجام می‌گیرد. این توالی‌ها منسوخ شده‌اند زیرا \fB%c\fP و \fB%C\fP به ترتیب معادل \fB%1~\fP و \fB%1/\fP هستند، در حالی که اعداد صحیح مثبت صریح همان تأثیر دو توالی اخیر را دارند. .PP .SS "تاریخ و زمان (Date and time)" .PD 0 .TP .PD \fB%D\fP تاریخ در قالب \fIyy\fP\fB\-\fP\fImm\fP\fB\-\fP\fIdd\fP. .TP \fB%T\fP زمان فعلی روز در قالب ۲۴ ساعته. .TP .PD 0 \fB%t\fP .TP .PD \fB%@\fP زمان فعلی روز در قالب ۱۲ ساعته، به صورت am/pm. .TP \fB%*\fP زمان فعلی روز در قالب ۲۴ ساعته، همراه با ثانیه‌ها. .TP \fB%w\fP تاریخ در قالب \fIday\fP\fB\-\fP\fIdd\fP. .TP \fB%W\fP تاریخ در قالب \fImm\fP\fB/\fP\fIdd\fP\fB/\fP\fIyy\fP. .TP \fB%D{\fP\fIstring\fP\fB}\fP رشتهٔ \fIstring\fP با استفاده از تابع \fBstrftime\fP قالب‌بندی می‌شود. برای جزئیات بیشتر به \fIstrftime\fP(3) مراجعه کنید. افزونه‌های گوناگون zsh در صورتی که عدد تک‌رقمی باشد، اعدادی را بدون صفر یا فاصلهٔ ابتدایی ارائه می‌دهند: .RS .PP .PD 0 .TP \fB%f\fP روزی از ماه .TP \fB%K\fP ساعت روز بر اساس ساعت ۲۴ ساعته .TP \fB%L\fP ساعت روز بر اساس ساعت ۱۲ ساعته .PD .PP علاوه بر این، اگر سیستم از فراخوانی سیستمی POSIX \fBgettimeofday\fP پشتیبانی کند، \fB%\&.\fP کسرهای اعشاری ثانیه از مبدأ زمان (epoch) را به همراه صفرهای ابتدایی ارائه می‌دهد. به‌طور پیش‌فرض سه رقم اعشار ارائه می‌شود، اما می‌توان تا ۹ رقم را پس از \fB%\fP مشخص کرد؛ بنابراین \fB%6\&.\fP میکروثانیه‌ها و \fB%9\&.\fP نانوثانیه‌ها را در خروجی نمایش می‌دهد. (مورد اخیر نیازمند تابع \fBclock_gettime\fP با دقت نانوثانیه است؛ سیستم‌هایی که فاقد آن باشند، مقداری ضرب‌شده در توان مناسبی از ۱۰ را بازمی‌گردانند). نمونه‌ای معمول از این، قالب «\fB%D{%H:%M:%S\&.%\&.}\fP\&» است. .PP افزونهٔ گنو \fB%N\fP به‌عنوان هم‌معنی \fB%9\&.\fP در نظر گرفته می‌شود. .PP علاوه بر این، افزونهٔ گنو مبنی بر اینکه قرار گرفتن یک «\fB\-\fP\&» میان \fB%\fP و نویسهٔ قالب باعث حذف صفر یا فاصلهٔ ابتدایی می‌شود، برای نویسه‌های قالب‌بندی \fBd\fP، \fBf\fP، \fBH\fP، \fBk\fP، \fBl\fP، \fBm\fP، \fBM\fP، \fBS\fP و \fBy\fP مستقیماً توسط پوسته مدیریت می‌شود؛ سایر نویسه‌های قالب‌بندی با هر «\fB\-\fP\&» ابتدایی موجود، به تابع strftime(3) سیستم ارسال می‌شوند، بنابراین رفتار آن‌ها وابسته به سیستم است. افزونه‌های دیگر گنو (یا سایر افزونه‌ها) نیز به strftime(3) ارسال می‌شوند و در صورت پشتیبانی سیستم ممکن است کار کنند. .RE .PP.SS "جلوه‌های بصری (Visual effects)" .PD 0 .TP .PD \fB%B\fP (\fB%b\fP) شروع (پایان) حالت برجسته (boldface)\&. .TP \fB%E\fP پاک کردن تا انتهای خط\&. .TP \fB%U\fP (\fB%u\fP) شروع (پایان) حالت خط زیرین (underline)\&. .TP \fB%S\fP (\fB%s\fP) شروع (پایان) حالت برجسته‌نمایی (standout)\&. .TP \fB%F\fP (\fB%f\fP) شروع (پایان) استفاده از رنگ پیش‌زمینهٔ متفاوت، در صورت پشتیبانی توسط پایانه\&. رنگ را می‌توان به دو روش مشخص کرد: یا به‌صورت یک آرگومان عددی، طبق معمول، یا با یک دنباله درون آکولاد پس از \fB%F\fP، برای نمونه \fB%F{red}\fP\&. در حالت دوم مقادیر مجاز همان‌هایی هستند که برای صفت \fBfg\fP در \fBzle_highlight\fP شرح داده شده است؛ بخش \fIبرجسته‌سازی نویسه (Character Highlighting)\fP در \fIzshzle\fP(1) را ببینید\&. این بدان معناست که رنگ‌های عددی در قالب دوم نیز مجاز هستند\&. .TP \fB%K\fP (\fB%k\fP) شروع (پایان) استفاده از رنگ پس‌زمینهٔ متفاوت\&. نحو آن مشابه \fB%F\fP و \fB%f\fP است\&. .TP \fB%{\fP\&.\&.\&.\fB%}\fP گنجاندن یک رشته به عنوان یک توالی گریز (escape sequence) دقیق\&. رشتهٔ درون آکولادها نباید موقعیت مکان‌نما را تغییر دهد\&. جفت‌های آکولاد می‌توانند به‌صورت تودرتو باشند\&. .RS .PP با یک آرگومان عددی مثبت بین \fB%\fP و \fB{\fP همانند آنچه در زیر برای \fB%G\fP شرح داده شده رفتار می‌شود\&. .RE .TP \fB%G\fP درون یک توالی \fB%{\fP\&.\&.\&.\fB%}\fP، گنجاندن یک «glitch»؛ یعنی فرض می‌شود که پهنای یک نویسهٔ منفرد خروجی داده خواهد شد\&. این در زمانی مفید است که نویسه‌هایی خروجی داده می‌شوند که در غیر این صورت پوسته نمی‌تواند آن‌ها را به‌درستی مدیریت کند، مانند مجموعه نویسه‌های جایگزین در برخی پایانه‌ها\&. نویسه‌های مورد نظر را می‌توان درون یک توالی \fB%{\fP\&.\&.\&.\fB%}\fP همراه با تعداد مناسبی از توالی‌های \fB%G\fP گنجاند تا پهنای صحیح مشخص شود\&. یک عدد صحیح بین «\fB%\fP» و «\fBG\fP» نشان‌دهندهٔ پهنای نویسه‌ای غیر از یک است\&. بنابراین \fB%{\fP\fIseq\fP\fB%2G%}\fP مقدار \fIseq\fP را خروجی می‌دهد و فرض می‌کند که پهنای دو نویسهٔ استاندارد را اشغال می‌کند\&. .RS .PP استفاده‌های متعدد از \fB%G\fP به شیوهٔ بدیهی انباشته می‌شوند؛ موقعیت \fB%G\fP بی‌اهمیت است\&. اعداد صحیح منفی مدیریت نمی‌شوند\&. .PP توجه داشته باشید زمانی که کوتاه‌سازی اعلان استفاده می‌شود، توصیه می‌شود که خروجی در هر گروه \fB%{\fP\&.\&.\&.\fB%}\fP به نویسه‌های تکی تقسیم شود تا نقطهٔ کوتاه‌سازی صحیح پیدا شود\&. .RE .PP .SH "زیررشته‌های شرطی در اعلان‌ها (CONDITIONAL SUBSTRINGS IN PROMPTS)" .PD 0 .TP .PD \fB%v\fP مقدار نخستین عنصر از پارامتر آرایه‌ای \fBpsvar\fP\&. قرار دادن یک عدد صحیح پس از «\fB%\fP»، آن عنصر از آرایه را ارائه می‌دهد\&. اعداد صحیح منفی از انتهای آرایه شمارش می‌شوند\&. .TP \fB%(\fP\fIx\fP\fB\&.\fP\fItrue\-text\fP\fB\&.\fP\fIfalse\-text\fP\fB)\fP یک عبارت سه‌تایی را مشخص می‌کند\&. نویسهٔ پس از \fIx\fP دلخواه است؛ از همان نویسه برای جداسازی متنِ نتیجهٔ «درست» از نتیجهٔ «نادرست» استفاده می‌شود\&. این جداکننده نمی‌تواند در \fItrue\-text\fP ظاهر شود، مگر به عنوان بخشی از یک توالی گریز %\-escape\&. یک «\fB)\fP» می‌تواند در \fIfalse\-text\fP به‌صورت «\fB%)\fP» ظاهر شود\&. هر دو \fItrue\-text\fP و \fIfalse\-text\fP می‌توانند شامل توالی‌های گریز با تودرتویی دلخواه، از جمله عبارت‌های سه‌تایی بیشتر باشند\&. .RS .PP پرانتز چپ می‌تواند با یک عدد صحیح مثبت \fIn\fP پیش‌آیند یا پس‌آیند شود که پیش‌فرض آن صفر است\&. یک عدد صحیح منفی در \-1 ضرب خواهد شد، مگر در حالتی که برای «\fBl\fP» در زیر ذکر شده است\&. نویسهٔ آزمون \fIx\fP می‌تواند هر یک از موارد زیر باشد: .PP .PD 0 .TP \fB!\fP درست است اگر پوسته با دسترسی‌های ویژه (privileges) در حال اجرا باشد\&. .TP \fB#\fP درست است اگر uid مؤثر فرایند فعلی برابر \fIn\fP باشد\&. .TP \fB?\fP درست است اگر وضعیت خروج آخرین دستور \fIn\fP باشد\&. .TP \fB_\fP درست است اگر دست‌کم \fIn\fP سازهٔ پوسته شروع شده باشد\&. .TP \fBC\fP .TP \fB/\fP درست است اگر مسیر مطلق فعلی دست‌کم \fIn\fP عنصر نسبت به دایرکتوری ریشه داشته باشد؛ بنابراین \fB/\fP به عنوان ۰ عنصر شمرده می‌شود\&. .TP \fBc\fP .TP \fB\&.\fP .TP \fB~\fP درست است اگر مسیر فعلی، با جایگزینی پیشوند، دست‌کم \fIn\fP عنصر نسبت به دایرکتوری ریشه داشته باشد؛ بنابراین \fB/\fP به عنوان ۰ عنصر شمرده می‌شود\&. .TP \fBD\fP درست است اگر ماه برابر با \fIn\fP باشد (ژانویه = ۰)\&. .TP \fBd\fP درست است اگر روز ماه برابر با \fIn\fP باشد\&. .TP \fBe\fP درست است اگر عمق ارزیابی دست‌کم \fIn\fP باشد\&. .TP \fBg\fP درست است اگر gid مؤثر فرایند فعلی برابر با \fIn\fP باشد\&. .TP \fBj\fP درست است اگر تعداد کارها دست‌کم \fIn\fP باشد\&. .TP \fBL\fP درست است اگر پارامتر \fBSHLVL\fP دست‌کم \fIn\fP باشد\&. .TP \fBl\fP درست است اگر دست‌کم \fIn\fP نویسه قبلاً روی خط فعلی چاپ شده باشد\&. هنگامی که \fIn\fP منفی است، درست است اگر دست‌کم \fBabs\fP\fB(\fP\fIn\fP\fB)\fP نویسه پیش از حاشیهٔ مقابل باقی مانده باشد (بنابراین حاشیهٔ چپ برای \fBRPROMPT\fP)\&. .TP \fBS\fP درست است اگر پارامتر \fBSECONDS\fP دست‌کم \fIn\fP باشد\&. .TP \fBT\fP درست است اگر زمان بر حسب ساعت برابر با \fIn\fP باشد\&. .TP \fBt\fP درست است اگر زمان بر حسب دقیقه برابر با \fIn\fP باشد\&. .TP \fBv\fP درست است اگر آرایهٔ \fBpsvar\fP دست‌کم \fIn\fP عنصر داشته باشد\&. .TP \fBV\fP درست است اگر عنصر \fIn\fP از آرایهٔ \fBpsvar\fP تنظیم شده و غیرخالی باشد\&. .TP \fBw\fP درست است اگر روز هفته برابر با \fIn\fP باشد (یکشنبه = ۰)\&. .PD .RE .TP .PD 0 \fB%<\fP\fIstring\fP\fB<\fP .TP .PD 0 \fB%>\fP\fIstring\fP\fB>\fP .TP .PD \fB%[\fP\fIxstring\fP\fB]\fP رفتار کوتاه‌سازی را برای باقیماندهٔ رشتهٔ اعلان مشخص می‌کند\&. قالب سوم که منسوخ شده است، معادل با «\fB%\fP\fIxstringx\fP» است، یعنی \fIx\fP می‌تواند «\fB<\fP» یا «\fB>\fP» باشد\&. مقدار \fIstring\fP به جای بخش بریده‌شده از هر رشته نمایش داده خواهد شد؛ توجه داشته باشید که این رشته تحت بسط اعلان قرار نمی‌گیرد\&. .RS .PP آرگومان عددی، که در حالت سوم می‌تواند بلافاصله پس از «\fB[\fP» ظاهر شود، حداکثر طول مجاز رشته‌های مختلفی را که می‌توانند در اعلان نمایش داده شوند، مشخص می‌کند\&. در دو حالت نخست، این آرگومان عددی می‌تواند منفی باشد، که در این حالت طول کوتاه‌سازی با کم کردن مقدار مطلق آرگومان عددی از تعداد موقعیت‌های نویسهٔ باقیمانده روی خط اعلان فعلی تعیین می‌شود\&. اگر این کار منجر به یک طول صفر یا منفی شود، طول ۱ استفاده می‌شود\&. به عبارت دیگر، یک آرگومان منفی ترتیبی می‌دهد که پس از کوتاه‌سازی، دست‌کم \fIn\fP نویسه پیش از حاشیهٔ راست (حاشیهٔ چپ برای \fBRPROMPT\fP) باقی بماند\&. .PP قالب‌های دارای «\fB<\fP» از سمت چپ رشته کوتاه می‌کنند، و قالب‌های دارای «\fB>\fP» از سمت راست رشته کوتاه می‌کنند\&. برای نمونه، اگر دایرکتوری فعلی «\fB/home/pike\fP» باشد، اعلان «\fB%8<\&.\&.<%/\fP» به «\fB\&.\&.e/pike\fP» بسط می‌یابد\&. در این رشته، نویسهٔ پایانی («\fB<\fP»، «\fB>\fP» یا «\fB]\fP»)، یا در واقع هر نویسه‌ای، می‌تواند توسط یک «\fB\e\fP» پیش از آن نقل‌قول شود؛ با این حال توجه داشته باشید که هنگام استفاده از \fBprint \-P\fP، این کار باید دو بار تکرار شود زیرا علاوه بر هر بک‌اسلشی که توسط یک رشته در گیومهٔ دوتایی حذف می‌شود، رشته مشمول پردازش استاندارد \fBprint\fP نیز می‌شود: بنابراین بدترین حالت «\fBprint \-P "%<\e\e\e\e<<\&.\&.\&."\fP» است\&. .PP اگر \fIstring\fP از طول کوتاه‌سازی مشخص‌شده طولانی‌تر باشد، به‌طور کامل ظاهر می‌شود و رشتهٔ بریده‌شده را به‌طور کامل جایگزین می‌کند\&..PP بخشی از رشتهٔ اعلان که قرار است کوتاه شود، تا انتهای رشته، یا تا انتهای گروه دربرگیرندهٔ بعدی در ساختار `\fB%(\fP\&'، یا تا کوتاه‌سازی بعدی که در همان سطح گروه‌بندی با آن مواجه می‌شویم (یعنی کوتاه‌سازی‌های درون یک `\fB%(\fP\&' مجزا هستند)، هر کدام که زودتر باشد، ادامه می‌یابد\&. به‌ویژه، یک کوتاه‌سازی با آرگومان صفر (برای نمونه، `\fB%<<\fP\&')، پایان محدودهٔ رشته‌ای را که باید کوتاه شود مشخص کرده و کوتاه‌سازی را از آن نقطه به بعد خاموش می‌کند\&. برای مثال، اعلان `\fB%10<\&.\&.\&.<%~%<<%# \fP\&' نمایش کوتاه‌شده‌ای از دایرکتوری جاری، و پس از آن یک `\fB%\fP\&' یا `\fB#\fP'، و سپس یک فاصله را چاپ می‌کند\&. بدون `\fB%<<\fP\&'، آن دو نویسه نیز در رشته‌ای که باید کوتاه شود گنجانده می‌شدند\&. توجه داشته باشید که `\fB%\-0<<\fP\&' معادل `\fB%<<\fP\&' نیست، بلکه مشخص می‌کند که اعلان در حاشیهٔ راست کوتاه شود\&. .PP کوتاه‌سازی تنها درون هر خط مجزای اعلان، به‌گونه‌ای که با خطوط جدید تعبیه‌شده (در صورت وجود) مرزبندی شده باشد، اِعمال می‌شود\&. اگر طول کل هر خط از اعلان پس از کوتاه‌سازی بیشتر از عرض ترمینال باشد، یا اگر بخشی که قرار است کوتاه شود دارای خطوط جدید تعبیه‌شده باشد، رفتار کوتاه‌سازی تعریف‌نشده است و ممکن است در نسخه‌های آیندهٔ پوسته تغییر کند\&. از `\fB%\-\fP\fIn\fP\fB(l\&.\fP\fItrue\-text\fP\fB\&.\fP\fIfalse\-text\fP\fB)\fP\&' برای حذف بخش‌هایی از اعلان، هنگامی که فضای در دسترس کمتر از \fIn\fP باشد، استفاده کنید\&. .RE