| ZSHMISC(1) | General Commands Manual | ZSHMISC(1) |
نام (NAME)
zshmisc - همهچیز و حتی بیشتر از آن
دستورهای ساده و خطلولهها (SIMPLE COMMANDS & PIPELINES)
یک دستور ساده دنبالهای از انتسابهای اختیاری پارامتر است که کلماتی جداشده با نویسههای خالی (blank-separated) در پی آن میآیند، به همراه تغییرمسیرهای اختیاری که در میان آنها قرار گرفتهاند. برای شرح انتساب، ابتدای zshparam(1) را ببینید.
کلمهٔ اول دستوری است که باید اجرا شود، و کلمات باقیمانده، در صورت وجود، آرگومانهای آن دستور هستند. اگر نام دستوری مشخص شده باشد، انتسابهای پارامتر محیط دستور را هنگام اجرای آن تغییر میدهند. مقدار یک دستور ساده وضعیت خروج آن است، یا در صورتی که با یک سیگنال متوقف شده باشد، ۱۲۸ بهعلاوهٔ شمارهٔ سیگنال خواهد بود. برای مثال،
echo foo
یک دستور ساده به همراه آرگومان است.
یک خطلوله (pipeline) یا یک دستور ساده است، یا دنبالهای از دو یا چند دستور ساده که در آن هر دستور با «|» یا «|&» از دستور بعدی جدا شده است. در جایی که دستورها با «|» جدا شدهاند، خروجی استاندارد دستور اول به ورودی استاندارد دستور بعدی متصل میشود. «|&» کوتاهنوشت «2>&1 |» است که هم خروجی استاندارد و هم خطای استاندارد دستور را به ورودی استاندارد دستور بعدی متصل میکند. مقدار یک خطلوله برابر با مقدار آخرین دستور است، مگر آنکه پیش از خطلوله «!» آمده باشد که در این صورت مقدار آن نقیض منطقی مقدار آخرین دستور خواهد بود. برای مثال،
echo foo | sed 's/foo/bar/'
یک خطلوله است، که در آن خروجی («foo» به همراه یک خط جدید) از دستور اول به ورودی دستور دوم فرستاده خواهد شد.
اگر پیش از یک خطلوله «coproc» بیاید، به عنوان یک همروند (coprocess) اجرا میشود؛ یک لولهٔ دوطرفه میان آن و شل والد برقرار میگردد. شل میتواند از طریق عملگرهای تغییرمسیر «>&p» و «<&p» یا با «print -p» و «read -p» از همروند بخواند یا در آن بنویسد. پیش از یک خطلوله نمیتوان همزمان از «coproc» و «!» استفاده کرد. اگر کنترل کارها (job control) فعال باشد، میتوان با همروند بهجز در ورودی و خروجی، مانند یک کار پسزمینهٔ معمولی رفتار کرد.
یک زیرفهرست (sublist) یا یک خطلولهٔ تکی است، یا دنبالهای از دو یا چند خطلوله که با «&&» یا «||» جدا شدهاند. اگر دو خطلوله با «&&» جدا شوند، خطلولهٔ دوم تنها در صورتی اجرا میشود که خطلولهٔ اول با موفقیت پایان یابد (وضعیت صفر برگرداند). اگر دو خطلوله با «||» جدا شوند، دومی تنها در صورتی اجرا میشود که خطلولهٔ اول شکست بخورد (وضعیت غیرصفر برگرداند). هر دو عملگر اولویت یکسانی دارند و شرکتپذیر از چپ هستند. مقدار زیرفهرست برابر با مقدار آخرین خطلولهای است که اجرا شده است. برای مثال،
dmesg | grep panic && print yes
یک زیرفهرست متشکل از دو خطلوله است؛ دومی صرفاً یک دستور ساده است که تنها و تنها در صورتی اجرا خواهد شد که دستور grep وضعیت صفر بازگرداند. اگر چنین نشود، مقدار زیرفهرست همان وضعیت بازگشتی خواهد بود، و در غیر این صورت وضعیت بازگردانده شده توسط print خواهد بود (که تقریباً به طور قطع صفر است).
یک فهرست (list) دنبالهای از صفر یا چند زیرفهرست است که در آن هر زیرفهرست به «;»، «&»، «&|»، «&!» یا یک خط جدید ختم میشود. این پایاندهنده ممکن است به صورت اختیاری از آخرین زیرفهرست در فهرست حذف شود، در صورتی که فهرست به شکل یک دستور مرکب درون «(...)» یا «{...}» ظاهر شده باشد. وقتی یک زیرفهرست به «;» یا خط جدید ختم میشود، شل پیش از اجرای زیرفهرست بعدی منتظر اتمام آن میماند. اگر یک زیرفهرست به «&»، «&|» یا «&!» ختم شود، شل آخرین خطلولهٔ موجود در آن را در پسزمینه اجرا میکند و منتظر پایان یافتن آن نمیماند (به تفاوت آن با سایر شلها که کل زیرفهرست را در پسزمینه اجرا میکنند توجه کنید). یک خطلولهٔ پسزمینهشده وضعیت صفر برمیگرداند.
بهطور کلیتر، یک فهرست را میتوان به عنوان مجموعهای از هر نوع دستور شل در نظر گرفت، از جمله دستورهای مرکب زیر؛ در هر کجای توضیحات بعدی که کلمهٔ «فهرست» آمده باشد، همین مفهوم در نظر است. برای مثال، دستورهای موجود در یک تابع شل، نوع خاصی از فهرست را تشکیل میدهند.
اصلاحکنندههای پیشفرمان (PRECOMMAND MODIFIERS)
پیش از یک دستور ساده میتواند یک اصلاحکنندهٔ پیشفرمان (precommand modifier) قرار گیرد که نحوهٔ تفسیر دستور را دگرگون میکند. این اصلاحکنندهها دستورهای توکار (builtin) شل هستند، بهاستثنای nocorrect که یک کلمهٔ رزروشده است.
- -
- دستور با قرار گرفتن یک «-» در ابتدای رشتهٔ argv[0] آن اجرا میشود.
- builtin
- کلمهٔ دستور بهجای تابع شل یا دستور خارجی، به عنوان نام یک دستور توکار در نظر گرفته میشود.
- command [ -pvV ]
- کلمهٔ دستور بهجای تابع شل یا دستور توکار، به عنوان نام یک دستور خارجی در نظر گرفته میشود. اگر گزینهٔ POSIX_BUILTINS تنظیم شده باشد، دستورهای توکار نیز اجرا میشوند ولی برخی ویژگیهای خاص آنها نادیده گرفته میشود. پرچم -p باعث میشود بهجای مسیر موجود در $path، یک مسیر پیشفرض جستجو شود. با پرچم -v، دستور command مشابه whence عمل میکند و با -V، معادل whence -v خواهد بود.
- exec [ -cl ] [ -a argv0 ]
- دستور زیر به همراه تمام آرگومانهایش بهجای فرآیند جاری اجرا میشود، نه به عنوان یک زیرفرآیند. شل فرآیند جدیدی منشعب (fork) نمیکند و جایگزین میشود. شل TRAPEXIT را فراخوانی نمیکند و فایلهای zlogout را نیز بارگذاری نمیکند. گزینهها برای سازگاری با سایر شلها فراهم شدهاند.
گزینهٔ -c محیط را پاکسازی میکند.
گزینهٔ -l معادل اصلاحکنندهٔ پیشفرمان - است، تا با دستور جایگزین همانند یک شل لاگین رفتار شود؛ دستور با قرار گرفتن یک - در ابتدای رشتهٔ argv[0] آن اجرا میشود. این پرچم در صورت استفادهٔ همزمان با گزینهٔ -a هیچ اثری نخواهد داشت.
گزینهٔ -a برای مشخص کردن صریح رشتهٔ argv[0] (نام دستور آنطور که توسط خود فرآیند دیده میشود) به منظور استفاده توسط دستور جایگزین به کار میرود و مستقیماً معادل مقداردهی به متغیر محیطی ARGV0 است.
- nocorrect
- تصحیح املایی روی هیچیک از کلمات انجام نمیشود. این اصلاحکننده باید پیش از هر اصلاحکنندهٔ پیشفرمان دیگری قرار گیرد، زیرا بلافاصله، پیش از انجام هرگونه تجزیه (parse)، تفسیر میشود. این مورد در شلهای غیرتعاملی اثری ندارد.
- noglob
- تولید نام فایل (globbing) روی هیچیک از کلمات انجام نمیشود..SH "دستورهای پیچیده (COMPLEX COMMANDS)" یک دستور پیچیده در zsh یکی از موارد زیر است:
- if list then list [ elif list then list ] ... [ else list ] fi
- ابتدا list پس از if اجرا میشود، و اگر وضعیت خروج صفر بازگرداند، list پس از then اجرا میشود. در غیر این صورت، list پس از elif اجرا شده و اگر وضعیت آن صفر باشد، list پس از then اجرا میگردد. اگر هر یک از listهای elif وضعیت غیرصفر بازگردانند، list پس از else اجرا میشود.
- for name ... [ in word ... ] term do list done
- فهرست wordها را بسط داده و پارامتر name را به نوبت برابر با هر یک از آنها قرار میدهد و هر بار list را اجرا میکند. اگر `in word' حذف شود، به جای wordها از پارامترهای مکانی استفاده میشود.
بخش term شامل یک یا چند خط جدید یا ; است که پایانبخش wordها هستند، و در صورتی که `in word' حذف شده باشد اختیاری میباشند.
بیش از یک پارامتر name میتواند پیش از فهرست wordها قرار گیرد. اگر N مقدار name داده شود، در هر بار اجرای حلقه، N کلمهٔ (word) بعدی به پارامترهای متناظر اختصاص مییابند. اگر تعداد nameها بیش از wordهای باقیمانده باشد، پارامترهای باقیمانده هر یک برابر با رشتهٔ خالی تنظیم میشوند. اجرای حلقه زمانی به پایان میرسد که هیچ word باقیماندهای برای انتساب به نخستین name وجود نداشته باشد. فقط در حالتی ممکن است in به عنوان نخستین name در فهرست ظاهر شود که در غیر این صورت، به عنوان نشانهٔ پایان فهرست در نظر گرفته خواهد شد.
- for (( [expr1] ; [expr2] ; [expr3] )) do list done
- ابتدا عبارت حسابی expr1 ارزیابی میشود (بخش `Arithmetic Evaluation' را ببینید). عبارت حسابی expr2 مکرراً ارزیابی میشود تا زمانی که مقدار آن به صفر برسد و در صورت غیرصفر بودن، list اجرا شده و عبارت حسابی expr3 ارزیابی میگردد. اگر هر عبارتی حذف شود، به گونهای رفتار خواهد شد که گویی به 1 ارزیابی شده است.
- while list do list done
- تا زمانی که list پس از while وضعیت خروج صفر بازگرداند، list پس از do را اجرا میکند.
- until list do list done
- تا زمانی که list پس از until وضعیت خروج غیرصفر بازگرداند، list پس از do را اجرا میکند.
- repeat word do list done
- مقدار word بسط یافته و به عنوان یک عبارت حسابی در نظر گرفته میشود که باید به یک عدد n ارزیابی شود. سپس list به تعداد n بار اجرا میگردد.
نحو repeat به طور پیشفرض هنگامی که شل در حالت شبیهسازی یک شل دیگر آغاز به کار میکند غیرفعال است. میتوان آن را با دستور `enable -r repeat' فعال کرد.
- case word in [ [(] pattern [ | pattern ] ... ) list (;;|;&|;|) ] ... esac
- فهرست list مرتبط با نخستین pattern را که با word مطابقت دارد (در صورت وجود) اجرا میکند. ساختار الگوها همانند ساختار مورد استفاده در تولید نام فایل است. بخش `Filename Generation' را ببینید.
همچنین توجه داشته باشید، مگر آنکه گزینهٔ SH_GLOB تنظیم شده باشد، کل الگو با گزینههای جانشین توسط شل معادل با یک گروه از الگوها درون پرانتز تلقی میشود، اگرچه ممکن است فاصلهٔ خالی (whitespace) در اطراف پرانتزها و خط عمودی ظاهر شود و در این نقاط از الگو حذف خواهد شد. فاصلهٔ خالی ممکن است در جاهای دیگر الگو نیز ظاهر شود؛ این فاصلهها حذف نمیشوند. اگر گزینهٔ SH_GLOB تنظیم شده باشد، به گونهای که پرانتز باز بتواند بدون ابهام به عنوان بخشی از نحو case تلقی شود، عبارت به کلمات جداگانه تجزیه شده و با آنها به عنوان گزینههای صریح رفتار میشود (همانند دیگر شلها).
اگر list در حال اجرا به جای ;; با ;& پایان یابد، فهرست بعدی نیز اجرا میشود. قانون پایانبخش برای فهرست بعدی یعنی ;;، ;& یا ;| اعمال میشود، مگر آنکه به esac برسد.
اگر list در حال اجرا با ;| پایان یابد، شل به پویش patternها برای یافتن انطباق بعدی ادامه میدهد، list متناظر را اجرا میکند و قانون مربوط به پایانبخش متناظر یعنی ;;، ;& یا ;| را اعمال مینماید. توجه داشته باشید که word مجدداً بسط داده نمیشود؛ تمام patternهای معتبر با همان word ارزیابی میشوند.
- select name [ in word ... term ] do list done
- که در آن term یک یا چند خط جدید یا ; برای پایان دادن به wordها است. مجموعهٔ wordها را که پیش از هر یک عددی قرار گرفته است چاپ میکند. اگر in word حذف شود، از پارامترهای مکانی استفاده میکند. اعلان PROMPT3 چاپ شده و در صورتی که شل تعاملی بوده و ویرایشگر خط فعال باشد، یک سطر از آن و در غیر این صورت از ورودی استاندارد خوانده میشود. اگر این سطر شامل شمارهٔ یکی از wordهای فهرستشده باشد، پارامتر name برابر با word متناظر با این شماره تنظیم میشود. اگر این سطر خالی باشد، فهرست گزینهها مجدداً چاپ میشود. در غیر این صورت، مقدار پارامتر name برابر با null قرار میگیرد. محتوای سطر خواندهشده از ورودی استاندارد در پارامتر REPLY ذخیره میشود. به ازای هر انتخاب، list تا زمان مواجهه با break یا پایان فایل (end-of-file) اجرا میشود.
- ( list )
- فهرست list را در یک زیرشل (subshell) اجرا میکند. تلههای تنظیمشده توسط دستور توکار trap در حین اجرای list به مقادیر پیشفرض خود بازنشانی میشوند؛ استثنا در حالتی است که در صورت تنظیم گزینهٔ POSIXTRAPS، سیگنالهای نادیدهگرفتهشده همچنان نادیده گرفته خواهند شد.
- { list }
- فهرست list را اجرا میکند.
- { try-list } always { always-list }
- ابتدا try-list را اجرا میکند. صرفنظر از بروز خطاها، یا دستورهای break یا continue که در طول try-list رخ دهند، always-list را اجرا میکند. سپس اجرا از نتیجهٔ اجرای try-list ادامه مییابد؛ به عبارت دیگر، با هرگونه خطا، یا دستور break یا continue به شیوهٔ عادی رفتار میشود، گویی اصلاً always-list وجود نداشته است. به این دو بخش از کد اصطلاحاً «try block» و «always block» گفته میشود.
خطهای جدید یا نقطهویرگولهای اختیاری میتوانند پس از always ظاهر شوند؛ با این حال، توجه داشته باشید که آنها نمیتوانند میان آکولاد بستهٔ قبلی و always قرار گیرند.
یک «خطا» در این چارچوب شرایطی نظیر یک خطای نحوی است که باعث میشود شل از اجرای تابع، اسکریپت یا فهرست فعلی صرفنظر کرده و آن را متوقف کند. خطاهای نحوی که هنگام تجزیهٔ کد توسط شل رخ میدهند موجب اجرای always-list نمیشوند. برای مثال، یک بلوک if که ساختار اشتباهی در try-list دارد باعث توقف شل هنگام تجزیه میشود، بنابراین always-list اجرا نخواهد شد، در حالی که یک جایگزینی نادرست مانند ${*foo*} باعث یک خطای زمان اجرا میشود که پس از آن always-list اجرا خواهد شد.
شرایط خطا را میتوان با متغیر صحیح ویژهٔ TRY_BLOCK_ERROR بررسی و بازنشانی کرد. در خارج از یک always-list مقدار آن بیاهمیت است، اما با -1 مقداردهی اولیه میشود. درون always-list، اگر خطایی در try-list رخ داده باشد مقدار آن برابر با 1 وگرنه 0 خواهد بود. اگر TRY_BLOCK_ERROR در طول always-list برابر با 0 تنظیم شود، وضعیت خطای ناشی از try-list بازنشانی شده و اجرای شل پس از پایان always-list به طور عادی ادامه مییابد. تغییر این مقدار در طول try-list مفید نیست (مگر آنکه بخشی از یک بلوک دربرگیرندهٔ always باشد).
صرفنظر از مقدار TRY_BLOCK_ERROR، پس از پایان always-list وضعیت عادی شل یعنی $? همان مقدار بازگرداندهشده از try-list خواهد بود. این مقدار در صورت وجود خطا غیرصفر خواهد بود، حتی اگر TRY_BLOCK_ERROR برابر با صفر تنظیم شده باشد.
دستورات زیر کد مشخصشده را بدون در نظر گرفتن خطاهای ناشی از آن اجرا میکند. این یک روش جایگزین برای شیوهٔ معمول محافظت از کد از طریق اجرای آن در یک زیرشل است.
{
# 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.
هنگامی که یک بلوک try در خارج از هر تابعی رخ دهد، مواجهه با یک return یا exit در try-list موجب اجرای always-list نمیشود. در عوض، شل بلافاصله پس از اجرای هر تلهٔ EXIT خارج میشود. در غیر این صورت، برخورد با یک دستور return در try-list درست مانند break و continue موجب اجرای always-list خواهد شد.
- function [ -T ] word ... [ () ] [ term ] { list }
- word ... () [ term ] { list }
- word ... () [ term ] command
- که در آن term یک یا چند خط جدید یا ; است. تابعی را تعریف میکند که با هر یک از wordها ارجاعپذیر است. معمولاً تنها یک word ارائه میشود؛ چندین word معمولاً فقط برای تنظیم تلهها مفید هستند. بدنهٔ تابع همان list میان { و } است. بخش `Functions' را ببینید.
گزینههای function معانی زیر را دارند:
- -T
- ردیابی (tracing) را برای این تابع فعال میکند، همانند اینکه با functions -T مشخص شده باشد. مستندات گزینهٔ -f در دستور توکار typeset را در zshbuiltins(1) ببینید..PP اگر گزینهٔ SH_GLOB برای سازگاری با سایر پوستهها تنظیم شده باشد، در صورتی که تنها یک word وجود داشته باشد، فاصله میتواند بین پرانتز چپ و راست قرار گیرد؛ در غیر این صورت، در چنین حالتی با پرانتزها بهصورت تشکیلدهندهٔ یک الگوی جانشینی (globbing pattern) رفتار خواهد شد.
در هر یک از شکلهای بالا، تغییر مسیر (redirection) میتواند در خارج از بدنهٔ تابع قرار گیرد، برای مثال
func() { ... } 2>&1
تغییر مسیر همراه با تابع ذخیره میشود و هر زمان که تابع اجرا شود اعمال میگردد. هر متغیری در تغییر مسیر، در هنگام اجرای تابع اما خارج از حوزهٔ (scope) تابع بسط مییابد.
- time [ pipeline ]
- دستور خطلولهای pipeline اجرا شده و آمار زمانبندی به شکلی که توسط پارامتر TIMEFMT مشخص شده، در خطای استاندارد گزارش میشود. اگر pipeline حذف شود، آمار مربوط به فرآیند پوسته و فرزندان آن چاپ میشود.
- [[ exp ]]
- عبارت شرطی exp را ارزیابی کرده و در صورت درست بودن آن، وضعیت خروج صفر برمیگرداند. برای شرح exp بخش `Conditional Expressions' را ببینید.
شکلهای جایگزین برای دستورهای پیچیده (ALTERNATE FORMS FOR COMPLEX COMMANDS)
بسیاری از دستورهای پیچیدهٔ zsh شکلهای جایگزینی دارند. این شکلها غیراستاندارد بوده و احتمالاً حتی برای برنامهنویسان باتجربهٔ پوسته نیز بدیهی نخواهند بود؛ در هر جایی که قابلیت حمل کد پوسته اهمیت دارد، نباید از آنها استفاده شود.
نسخههای کوتاه زیر تنها در صورتی کار میکنند که sublist به شکل `{ list }' باشد یا اینکه گزینهٔ SHORT_LOOPS تنظیم شده باشد. برای دستورهای if، while و until، در هر دوی این موارد بخش آزمون حلقه نیز باید بهدرستی محدود شده باشد، مانند `[[ ... ]]' یا `(( ... ))'، در غیر این صورت پایان آزمون شناسایی نخواهد شد. برای دستورهای for، repeat، case و select چنین شکل خاصی برای آرگومانها الزامی نیست، اما شرط دیگر (شکل خاص sublist یا استفاده از گزینهٔ SHORT_LOOPS) همچنان اعمال میشود. گزینهٔ SHORT_REPEAT برای فعال کردن نسخهٔ کوتاه تنها برای دستور repeat در دسترس است.
- if list { list } [ elif list { list } ] ... [ else { list } ]
- شکلی جایگزین از if. این قواعد به این معنی است که
if [[ -o ignorebraces ]] {
print yes
}
کار میکند، اما
if true { # Does not work!
print yes
}
کار نمیکند، زیرا آزمون بهدرستی محدود نشده است.
- if list sublist
- یک شکل کوتاه از if جایگزین. همان محدودیتها روی شکل list همانند شکل پیشین اعمال میشود.
- for name ... ( word ... ) sublist
- یک شکل کوتاه از for.
- for name ... [ in word ... ] term sublist
- که در آن term حداقل یک خط جدید یا ; است. شکل کوتاه دیگری از for.
- for (( [expr1] ; [expr2] ; [expr3] )) sublist
- یک شکل کوتاه از دستور حسابی for.
- foreach name ... ( word ... ) list end
- شکل دیگری از for.
- while list { list }
- شکلی جایگزین از while. به محدودیتهای شکل list که در بالا ذکر شد توجه کنید.
- until list { list }
- شکلی جایگزین از until. به محدودیتهای شکل list که در بالا ذکر شد توجه کنید.
- repeat word sublist
- این یک شکل کوتاه از repeat است.
- case word { [ [(] pattern [ | pattern ] ... ) list (;;|;&|;|) ] ... }
- شکلی جایگزین از case.
- select name [ in word ... term ] sublist
- که در آن term حداقل یک خط جدید یا ; است. یک شکل کوتاه از select.
- function word ... [ () ] [ term ] sublist
- این یک شکل کوتاه از function است.
کلمات رزروشده (RESERVED WORDS)
کلمات زیر در صورت استفاده بهعنوان اولین کلمهٔ یک دستور کلمات رزروشده شناخته میشوند، مگر اینکه نقلقول شده یا با استفاده از disable -r غیرفعال شده باشند:
do 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
علاوه بر این، در صورتی که نه گزینهٔ IGNORE_BRACES و نه گزینهٔ IGNORE_CLOSE_BRACES تنظیم نشده باشند، `}' در هر موقعیتی شناخته میشود..SH "خطاها (ERRORS)" برخی خطاها توسط پوسته به عنوان خطای مهلک در نظر گرفته میشوند: در یک پوستهٔ تعاملی، این خطاها باعث بازگشت کنترل به خط فرمان میشوند، و در یک پوستهٔ غیرتعاملی باعث توقف و خروج کامل پوسته (abort) میگردند. در نسخههای قدیمیتر zsh، یک پوستهٔ غیرتعاملی که در حال اجرای یک اسکریپت بود کاملاً متوقف نمیشد، بلکه اجرای اسکریپت را از دستور بعدی خواندهشده از سر میگرفت و باقیماندهٔ هرگونه تابع یا ساختار پوسته مانند حلقهها یا شرطها را نادیده میگرفت؛ این رفتار تا حدی غیرمنطقی را میتوان با تنظیم گزینهٔ CONTINUE_ON_ERROR بازیابی کرد.
خطاهای مهلکی که در پوستههای غیرتعاملی یافت میشوند عبارتند از:
- •
- شکست در تجزیهٔ گزینههای پوسته که هنگام فراخوانی پوسته ارسال شدهاند
- •
- شکست در تغییر گزینهها با دستور داخلی set
- •
- انواع خطاهای تجزیه، از جمله عدم موفقیت در تجزیهٔ عبارتهای ریاضی
- •
- شکست در تنظیم یا تغییر رفتار متغیرها با typeset، local، declare، export، integer، float
- •
- اجرای ساختارهای کنترل حلقه در موقعیتهای نادرست (continue، break)
- •
- تلاش برای استفاده از عبارات باقاعده در صورت در دسترس نبودن ماژول عبارت باقاعده
- •
- عملیات غیرمجاز در هنگام تنظیم بودن گزینهٔ RESTRICTED
- •
- شکست در ایجاد pipe مورد نیاز برای یک خط لوله (pipeline)
- •
- شکست در ایجاد یک multio
- •
- شکست در بارگذاری خودکار (autoload) ماژول مورد نیاز برای یک قابلیت اعلانشدهٔ پوسته
- •
- خطا در ایجاد جایگزینیهای دستور یا فرایند
- •
- خطاهای نحوی در توصیفکنندههای glob (همان glob qualifiers)
- •
- خطاهای تولید فایل (file generation) در صورتی که توسط گزینهٔ BAD_PATTERN مهار نشده باشند
- •
- همهٔ الگوهای نادرست استفادهشده برای تطبیق درون دستورهای case
- •
- شکست در تولید فایل در صورتی که ناشی از NOMATCH یا گزینههای مشابه نباشد
- •
- تمام خطاهای تولید فایل در مواردی که الگو برای ایجاد یک multio استفاده شده باشد
- •
- خطاهای حافظه در صورت تشخیص توسط پوسته
- •
- اندیسهای نامعتبر برای متغیرهای پوسته
- •
- تلاش برای انتساب مقدار به متغیرهای فقطخواندنی (read-only)
- •
- خطاهای منطقی مربوط به متغیرها مانند انتساب مقدار به نوع نادرست
- •
- استفاده از نامهای نامعتبر برای متغیرها
- •
- خطا در نحو جایگزینی متغیرها
- •
- شکست در تبدیل نویسهها در عبارتهای $'...'
اگر گزینهٔ POSIX_BUILTINS تنظیم شده باشد، طبق آنچه در استاندارد POSIX مشخص شده است، خطاهای بیشتری در ارتباط با دستورهای داخلی پوسته به عنوان خطای مهلک در نظر گرفته میشوند.
کامنتها (COMMENTS)
در پوستههای غیرتعاملی، یا در پوستههای تعاملی هنگامی که گزینهٔ INTERACTIVE_COMMENTS تنظیم شده باشد، کلمهای که با نویسهٔ سوم پارامتر histchars (بهطور پیشفرض `#') آغاز شود، باعث نادیده گرفته شدن آن کلمه و تمام نویسههای پس از آن تا خط جدید (newline) میگردد.
نامهای مستعار (ALIASING)
هر کلمه واجد شرایط در ورودی پوسته بررسی میشود تا مشخص گردد آیا نام مستعاری (alias) برای آن تعریف شده است یا خیر. در این صورت، اگر در موقعیت دستور باشد (اگر بتواند نخستین کلمه از یک دستور ساده باشد)، یا اگر نام مستعار از نوع سراسری (global) باشد، با متن نام مستعار جایگزین میشود. اگر متن جایگزین به یک فاصله ختم شود، کلمهٔ بعدی در ورودی پوسته همیشه برای اهداف گسترش نام مستعار واجد شرایط خواهد بود.
در نحو تعریف تابع سازگار با sh به صورت `word () ...'، قرار گرفتن کلمهای حاصل از گسترش نام مستعار به عنوان نام تابع (word) یک خطا محسوب میشود، مگر اینکه گزینهٔ ALIAS_FUNC_DEF تنظیم شده باشد.
یک نام مستعار با استفاده از دستور داخلی alias تعریف میشود؛ نامهای مستعار سراسری را میتوان با استفاده از گزینهٔ -g در این دستور داخلی تعریف کرد.
یک کلمه به صورت زیر تعریف میشود:
- •
- هر رشتهٔ ساده یا الگوی glob
- •
- هر رشتهٔ نقلقولشده، با استفاده از هر روش نقلقول (توجه داشته باشید که برای واجد شرایط بودن، نقلقولها باید بخشی از تعریف نام مستعار باشند)
- •
- هر ارجاع به پارامتر یا جایگزینی دستور
- •
- هر دنبالهای از موارد پیشگفته که بدون فاصلهٔ سفید یا نشانههای دیگر میانشان به هم متصل شده باشند
- •
- هر کلمهٔ رزروشده (case، do، else و غیره)
- •
- در نامگذاری مستعار سراسری، هر جداکنندهٔ دستور، هر عملگر تغییر مسیر، و `(' یا `)' هنگامی که بخشی از یک الگوی glob نباشند
گسترش نام مستعار بر روی ورودی پوسته پیش از هر گسترش دیگری به جز گسترش تاریخچه (history expansion) انجام میشود. بنابراین، اگر نام مستعاری برای کلمهٔ foo تعریف شده باشد، میتوان با نقلقول کردن بخشی از کلمه، مانند \foo، از گسترش نام مستعار جلوگیری کرد. هر نوعی از نقلقول کارساز است، اگرچه هیچ چیز مانع از تعریف یک نام مستعار برای شکل نقلقولشده مانند \foo نیز نمیشود.
بهویژه، توجه داشته باشید که هنگام استفاده از unalias برای حذف نامهای مستعار سراسری، باید از نقلقول استفاده شود:
% alias -g foo=bar % unalias foo unalias: no such hash table element: bar % unalias \foo %
هنگامی که POSIX_ALIASES تنظیم شده باشد، تنها رشتههای ساده و فاقد نقلقول برای نامگذاری مستعار واجد شرایط هستند. دستور داخلی alias نامهای مستعار غیرمجاز را رد نمیکند، اما آنها گسترش نمییابند.
برای استفاده به همراه تکمیل خودکار (completion)، که بکاسلش ابتداییِ پیش از یک نویسهٔ غیرخاص را حذف میکند، ممکن است نقلقول کردن کلمه با شروع یک نقلقول تکی، یعنی 'foo مناسبتر باشد؛ تکمیل خودکار به طور خودکار نقلقول تکی پایانی را اضافه خواهد کرد.
اگرچه نامهای مستعار را میتوان به شیوههایی به کار برد که نحو عادی پوسته را دگرگون کند، اما هر رشتهای از نویسههای غیرفاصلهای نمیتواند به عنوان نام مستعار استفاده شود.
هر مجموعهای از نویسهها که در بالا به عنوان کلمه فهرست نشده باشد، یک کلمه محسوب نمیشود؛ از این رو هیچ تلاشی برای بسط آن به عنوان نام مستعار صورت نمیگیرد، صرفنظر از اینکه چگونه تعریف شده باشد (یعنی از طریق دستور توکار یا پارامتر ویژهٔ aliases که در بخش THE ZSH/PARAMETER MODULE در zshmodules(1) شرح داده شده است). با این حال، همانطور که در بالا دربارهٔ POSIX_ALIASES اشاره شد، پوسته در زمان ایجاد نام مستعار، تلاشی برای استنتاج اینکه آیا رشته با یک کلمه مطابقت دارد یا خیر، انجام نمیدهد.
برای نمونه، عبارتی حاوی یک = در ابتدای خط فرمان، یک انتساب است و نمیتواند به عنوان نام مستعار بسط یابد؛ یک = تنها یک انتساب نیست، اما فقط با استفاده از پارامتر میتوان آن را به عنوان نام مستعار تنظیم کرد، زیرا در غیر این صورت = به عنوان بخشی از نحو دستور توکار تلقی میشود.
در حال حاضر امکان ایجاد نام مستعار برای نشانهٔ «((» که عبارات حسابی را آغاز میکند وجود ندارد، زیرا تا زمانی که یک عبارت کامل تجزیه نشود، نمیتوان آن را از دو نشانهٔ متوالی «(» که زیرپوستههای تودرتو را معرفی میکنند تشخیص داد. همچنین، اگر برای یک جداکننده مانند && نام مستعار تعیین شود، \&& به دو نشانهٔ \& و & تبدیل میشود که هر کدام ممکن است جداگانه نام مستعار داشته باشند. همین موضوع برای \<<، \>| و غیره نیز صدق میکند.
مشکل رایجی در ارتباط با نامهای مستعار وجود دارد که با کد زیر نشان داده شده است:
alias echobar='echo bar'; echobar
این دستور پیامی چاپ میکند مبنی بر اینکه فرمان echobar یافت نشد. این اتفاق به این دلیل رخ میدهد که نامهای مستعار هنگام خوانده شدن کد بسط مییابند؛ کل خط به یکباره خوانده میشود، به طوری که هنگام اجرای echobar برای بسط نام مستعار تازهتعریفشده خیلی دیر است. این مورد اغلب در اسکریپتهای پوسته، توابع و کدهایی که با «source» یا «.» اجرا میشوند مشکلساز است. در نتیجه، در کدهای غیرتعاملی استفاده از توابع به جای نامهای مستعار توصیه میشود.
نقلقول (QUOTING)
یک نویسه میتواند با قرار گرفتن یک «\» پیش از آن، نقلقول شود (یعنی به گونهای در نظر گرفته شود که معنای دقیق خودش را نشان دهد). یک «\» که بلافاصله پس از آن یک خط جدید بیاید، نادیده گرفته میشود.
رشتهای که بین «$'» و «'» محصور شده باشد، به همان شیوهای پردازش میشود که آرگومانهای رشتهای دستور توکار print پردازش میشوند، و رشتهٔ حاصل کاملاً نقلقولشده در نظر گرفته میشود. یک نویسهٔ تحتاللفظی «'» میتواند با استفاده از توالی گریز «\'» در رشته گنجانده شود.
تمام نویسههای محصور بین یک جفت نقلقول تکی ('') که پیش از آن «$» نیامده باشد، نقلقول میشوند. یک علامت نقلقول تکی نمیتواند درون نقلقولهای تکی دیگر قرار گیرد مگر اینکه گزینهٔ RC_QUOTES تنظیم شده باشد، که در این صورت یک جفت نقلقول تکی به یک علامت نقلقول تکی تبدیل میشود. برای نمونه،
print ''''
در صورتی که RC_QUOTES تنظیم نشده باشد به جز یک خط جدید چیزی خروجی نمیدهد، اما اگر تنظیم شده باشد، یک علامت نقلقول تکی در خروجی چاپ میکند.
درون نقلقولهای دوتایی ("")، جایگزینی پارامتر و فرمان انجام میگیرد، و «\» نویسههای «\»، «`»، «"»، «$» و اولین نویسهٔ $histchars (پیشفرض «!») را نقلقول میکند.
تغییر مسیر (REDIRECTION)
اگر پس از یک دستور & بیاید و کنترل شغل فعال نباشد، ورودی استاندارد پیشفرض برای آن دستور، فایل خالی /dev/null خواهد بود. در غیر این صورت، محیط اجرای یک دستور شامل توصیفکنندههای فایلِ پوستهٔ فراخوان است، به همان صورتی که توسط مشخصات ورودی/خروجی تغییر یافتهاند.
موارد زیر ممکن است در هر کجای یک دستور ساده ظاهر شوند یا قبل یا بعد از یک دستور پیچیده بیایند. بسط پیش از استفاده از word یا digit رخ میدهد، مگر در مواردی که در ادامه ذکر شده است. اگر نتیجهٔ جایگزینی روی word بیش از یک نام فایل تولید کند، تغییر مسیر به نوبت برای هر نام فایل مجزا انجام میشود.
- < word
- فایل word را برای خواندن به عنوان ورودی استاندارد باز میکند. اگر فایل وجود نداشته باشد، باز کردن فایل با این شیوه یک خطا است.
- <> word
- فایل word را برای خواندن و نوشتن به عنوان ورودی استاندارد باز میکند. اگر فایل وجود نداشته باشد، ایجاد میشود.
- > word
- فایل word را برای نوشتن به عنوان خروجی استاندارد باز میکند. اگر فایل وجود نداشته باشد، ایجاد میشود. اگر فایل وجود داشته باشد و گزینهٔ CLOBBER تنظیم نشده باشد، این کار باعث ایجاد خطا میشود؛ در غیر این صورت، اندازهٔ آن به صفر کاهش مییابد.
- >| word
- >! word
- مشابه > است، با این تفاوت که اگر فایل وجود داشته باشد، بدون در نظر گرفتن CLOBBER اندازهٔ آن به صفر کاهش مییابد.
- >> word
- فایل word را برای نوشتن در حالت الحاق به عنوان خروجی استاندارد باز میکند. اگر فایل وجود نداشته باشد و هر دو گزینهٔ CLOBBER و APPEND_CREATE تنظیم نشده باشند، این کار باعث خطا میشود؛ در غیر این صورت، فایل ایجاد میشود.
- >>| word
- >>! word
- مشابه >> است، با این تفاوت که اگر فایل وجود نداشته باشد، بدون در نظر گرفتن CLOBBER و APPEND_CREATE ایجاد میشود.
- <<[-] word
- ورودی پوسته تا خطی که دقیقاً همانند word باشد، یا تا رسیدن به پایان فایل (end-of-file) خوانده میشود. هیچ بسط پارامتر، جایگزینی فرمان یا تولید نام فایلی روی word انجام نمیشود. سند حاصل که یک here-document نامیده میشود، ورودی استاندارد قرار میگیرد.
اگر هر نویسهای از word با نقلقولهای تکی، دوتایی یا یک «\» نقلقول شده باشد، هیچ تفسیری روی نویسههای سند انجام نمیشود. در غیر این صورت، جایگزینی پارامتر و فرمان انجام میگیرد، «\» که پس از آن یک خط جدید بیاید حذف میشود، و برای نقلقول کردن نویسههای «\»، «$»، «`» و اولین نویسهٔ word باید از «\» استفاده شود.
توجه داشته باشید که خود word دستخوش بسط پوسته نمیشود. نقلقولهای وارونه در word اثر معمول خود را ندارند؛ بلکه مشابه نقلقولهای دوتایی رفتار میکنند، با این تفاوت که خود نقلقولهای وارونه بدون تغییر منتقل میشوند. (این اطلاعات جهت تکمیل مطلب آورده شده است و استفاده از نقلقول وارونه توصیه نمیشود.) نقلقولها در قالب $'...' اثر استاندارد خود را در بسط ارجاعات دارای بکاسلش به نویسههای ویژه دارند.
اگر از <<- استفاده شود، تمام تبهای ابتدای خطوط از word و از سند حذف میشوند.
- <<< word
- بسط پوسته را روی word انجام داده و نتیجه را به ورودی استاندارد میفرستد. این ویژگی با عنوان here-string شناخته میشود. این مورد را با استفاده از word در here-documentهای بالا مقایسه کنید که در آن word دستخوش بسط پوسته نمیشود. نتیجه دارای یک خط جدید در انتها خواهد بود.
- <& number
- >& number
- ورودی/خروجی استاندارد از توصیفکنندهٔ فایل number تکثیر میشود (به dup2(2) مراجعه کنید).
- <& -
- >& -
- ورودی/خروجی استاندارد را میبندد.
- <& p
- >& p
- ورودی/خروجی از/به همروند به ورودی/خروجی استاندارد منتقل میشود.
- >& word
- &> word
- (به جز مواردی که «>& word» با یکی از نحوهای بالا مطابقت داشته باشد؛ برای جلوگیری از این ابهام همیشه میتوان از «&>» استفاده کرد.) هر دو خروجی استاندارد و خطای استاندارد (توصیفکنندهٔ فایل ۲) را به شیوهٔ «> word» تغییر مسیر میدهد. توجه داشته باشید که در حضور multios، این دستور اثری مشابه «> word 2>&1» ندارد (به بخش زیر مراجعه کنید)..TP >&| word
- >&! word
- &>| word
- &>! word
- هم خروجی استاندارد و هم خطای استاندارد (توصیفکننده فایل ۲) را به شیوهٔ `>| word' تغییر مسیر میدهد.
- >>& word
- &>> word
- هم خروجی استاندارد و هم خطای استاندارد (توصیفکننده فایل ۲) را به شیوهٔ `>> word' تغییر مسیر میدهد.
- >>&| word
- >>&! word
- &>>| word
- &>>! word
- هم خروجی استاندارد و هم خطای استاندارد (توصیفکننده فایل ۲) را به شیوهٔ `>>| word' تغییر مسیر میدهد.
اگر یکی از موارد بالا با یک رقم شروع شود، توصیفکننده فایل مورد اشاره همان رقمی خواهد بود که مشخص شده است، به جای مقدار پیشفرض 0 یا 1. ترتیب مشخص شدن تغییر مسیرها حائز اهمیت است. پوسته هر تغییر مسیر را بر اساس ارتباط (file descriptor, file) در زمان ارزیابی بررسی میکند. برای مثال:
... 1>fname 2>&1
ابتدا توصیفکننده فایل 1 را به فایل fname مرتبط میکند. سپس توصیفکننده فایل 2 را به فایلی که به توصیفکننده فایل 1 مرتبط است (یعنی fname) مرتبط میسازد. اگر ترتیب تغییر مسیرها معکوس میبود، توصیفکننده فایل 2 به ترمینال مرتبط میشد (با فرض اینکه توصیفکننده فایل 1 قبلاً به آن مرتبط شده بود) و سپس توصیفکننده فایل 1 به فایل fname مرتبط میگشت.
جداکنندهٔ دستور `|&' که در بخش Simple Commands & Pipelines در zshmisc(1) توضیح داده شده است، کوتهنوشتی برای `2>&1 |' میباشد.
شکلهای مختلف جایگزینی فرایند (Process Substitution)، یعنی `<(list)' و `=(list)' برای ورودی و `>(list)' برای خروجی، اغلب همراه با تغییر مسیر استفاده میشوند. به عنوان مثال، اگر word در یک تغییر مسیر خروجی به شکل `>(list)' باشد، آنگاه خروجی از طریق یک لوله به دستوری که توسط list مشخص شده فرستاده میشود. بخش Process Substitution در zshexpn(1) را ببینید.
باز کردن توصیفکنندههای فایل با استفاده از پارامترها (OPENING FILE DESCRIPTORS USING PARAMETERS)
هنگامی که پوسته در حال تجزیهٔ آرگومانهای یک دستور است و گزینهٔ پوستهٔ IGNORE_BRACES تنظیم نشده باشد، شکل متفاوتی از تغییر مسیر مجاز خواهد بود: به جای یک رقم قبل از عملگر، یک شناسهٔ معتبر پوسته قرار میگیرد که در آکولاد محصور شده است. پوسته یک توصیفکننده فایل جدید باز میکند که تضمین میشود حداقل 10 باشد و پارامتری را که نام آن همان شناسه است، برابر با توصیفکننده فایلِ بازشده قرار میدهد. هیچ فاصله یا نویسهٔ خالی بین آکولاد بسته و نویسهٔ تغییر مسیر مجاز نیست. برای مثال:
... {myfd}>&1
این کار یک توصیفکننده فایل جدید باز میکند که همتای (duplicate) توصیفکننده فایل 1 است و پارامتر myfd را برابر با شمارهٔ توصیفکننده فایل قرار میدهد که حداقل 10 خواهد بود. میتوان با استفاده از نحو >&$myfd در این توصیفکننده فایل جدید نوشت. توصیفکننده فایل در زیرپوستهها (subshells) و برنامههای اجرایی خارجی منشعبشده (forked) باز باقی میماند.
نحو {varid}>&-، برای مثال {myfd}>&-، میتواند برای بستن توصیفکننده فایلی که به این شیوه باز شده است به کار رود. توجه داشته باشید که در این حالت، پارامتر ارائهشده توسط varid باید از قبل روی یک توصیفکننده فایل تنظیم شده باشد.
اگر پارامتر فقطخواندنی (readonly) باشد، باز کردن یا بستن توصیفکننده فایل به این شیوه یک خطا محسوب میشود. با این حال، در صورتی که param فقطخواندنی باشد، خواندن یا نوشتن روی یک توصیفکننده فایل با استفاده از <&$param یا >&$param خطایی ایجاد نمیکند.
اگر گزینهٔ CLOBBER تنظیم نشده باشد (unset باشد)، باز کردن توصیفکننده فایل با استفاده از پارامتری که قبلاً روی یک توصیفکننده فایل بازِ تخصیصیافته توسط این سازوکار تنظیم شده است، یک خطا به شمار میآید. حذف مقدار پارامتر (unset کردن آن) پیش از استفاده برای تخصیص توصیفکننده فایل، از بروز این خطا جلوگیری میکند.
توجه داشته باشید که این سازوکار صرفاً یک توصیفکننده فایل را تخصیص میدهد یا میبندد؛ هیچ تغییر مسیری به یا از آن انجام نمیدهد. معمولاً تخصیص یک توصیفکننده فایل قبل از استفاده به عنوان آرگومان برای exec راحتتر است. این نحو در هیچ حالتی هنگام استفاده در اطراف دستورهای مرکب مانند زیرپوستههای داخل پرانتز یا حلقهها کار نمیکند، جایی که آکولاد باز به عنوان بخشی از فهرست دستورهایی تفسیر میشود که باید در پوستهٔ فعلی اجرا گردند.
موارد زیر یک توالی معمول از تخصیص، استفاده و بستن یک توصیفکننده فایل را نشان میدهد:
integer myfd
exec {myfd}>~/logs/mylogfile.txt
print This is a log message. >&$myfd
exec {myfd}>&-
توجه داشته باشید که بسط متغیر در عبارت >&$myfd در نقطهای رخ میدهد که تغییر مسیر باز میشود. این زمان پس از بسط آرگومانهای دستور و پس از پردازش هرگونه تغییر مسیر در سمت چپ خط فرمان است..SH "MULTIOS" اگر کاربر تلاش کند یک توصیفگر فایل (file descriptor) را بیش از یک بار برای نوشتن باز کند، در صورتی که گزینهٔ MULTIOS تنظیم شده باشد (که به طور پیشفرض چنین است)، شل توصیفگر فایل را به عنوان یک لوله (pipe) به فرایندی باز میکند که ورودی خود را مانند tee در تمام خروجیهای مشخصشده کپی میکند. بنابراین:
date >foo >bar
تاریخ را در دو فایل با نامهای `foo' و `bar' مینویسد. توجه داشته باشید که لوله یک تغییرمسیر ضمنی است؛ بنابراین
date >foo | cat
تاریخ را در فایل `foo' نوشته و همچنین با pipe به cat میفرستد.
توجه داشته باشید که شل تمام فایلهای مورد استفاده در فرایند multio را فوراً باز میکند، نه در نقطهای که قرار است در آنها نوشته شود.
همچنین توجه داشته باشید که تغییرمسیرها همواره به ترتیب گسترش مییابند. این امر صرفنظر از وضعیت تنظیم گزینهٔ MULTIOS رخ میدهد، اما با فعال بودن این گزینه، پیامدهای دیگری نیز به همراه دارد. به عنوان مثال، معنی عبارت >&1 پس از یک تغییرمسیر قبلی تغییر خواهد کرد:
date >&1 >output
در مورد بالا، عبارت >&1 به خروجی استاندارد در آغاز سطر اشاره دارد؛ نتیجه شبیه به دستور tee است. با این حال، حالت زیر را در نظر بگیرید:
date >output >&1
از آنجا که تغییرمسیرها به ترتیب ارزیابی میشوند، هنگام مواجهه با >&1 خروجی استاندارد روی فایل output تنظیم شده و بنابراین نسخهٔ دیگری از خروجی به آن فایل فرستاده میشود. بعید است که هدف چنین چیزی بوده باشد.
اگر گزینهٔ MULTIOS تنظیم شده باشد، کلمهٔ بعد از عملگر تغییرمسیر نیز مشمول تولید نام فایل (globbing) میشود. بنابراین
: > *
تمام فایلهای دایرکتوری فعلی را (با فرض اینکه حداقل یک فایل وجود داشته باشد) خالی (truncate) خواهد کرد. (بدون گزینهٔ MULTIOS، فایلی خالی با نام `*' ایجاد میکرد.) به طور مشابه، میتوانید انجام دهید:
echo exit 0 >> *.sh
اگر کاربر تلاش کند یک توصیفگر فایل را بیش از یک بار برای خواندن باز کند، در صورتی که گزینهٔ MULTIOS تنظیم شده باشد، شل توصیفگر فایل را به عنوان یک لوله به فرایندی باز میکند که تمام ورودیهای مشخصشده را به ترتیبی که تعیین شدهاند در خروجی خود کپی میکند. باید توجه داشت که هر فایل فوراً باز میشود، نه در لحظهای که قرار است خوانده شود: این رفتار با cat متفاوت است، بنابراین اگر رفتاری دقیقاً استاندارد مورد نیاز است، باید به جای آن از cat استفاده شود.
بنابراین
sort <foo <fubar
یا حتی
sort <f{oo,ubar}
معادل با `cat foo fubar | sort' است.
گسترش آرگومان تغییرمسیر در لحظهٔ باز شدن تغییرمسیر رخ میدهد، در همان نقطهای که در بالا برای گسترش متغیر در >&$myfd توضیح داده شد.
توجه داشته باشید که لوله یک تغییرمسیر ضمنی است؛ بنابراین
cat bar | sort <foo
معادل با `cat bar foo | sort' است (به ترتیب ورودیها توجه داشته باشید).
اگر گزینهٔ MULTIOS غیرفعال (unset) باشد، هر تغییرمسیر جایگزین تغییرمسیر قبلی برای آن توصیفگر فایل میشود. با این حال، تمام فایلهایی که تغییرمسیر به سمت آنها انجام شده در عمل باز میشوند، بنابراین
echo Hello > bar > baz
هنگامی که MULTIOS غیرفعال باشد، `bar' را کوتاه (truncate) کرده و `Hello' را درون `baz' مینویسد.
هنگامی که یک multio خروجی به یک برنامهٔ خارجی متصل میشود، مشکلی پیش میآید. یک مثال ساده این را نشان میدهد:
cat file >file1 >file2 cat file1 file2
در اینجا، ممکن است `cat' دوم محتوای کامل file1 و file2 را نمایش ندهد (یعنی محتوای اصلی file که دو بار تکرار شده است).
دلیل این امر آن است که فرایندهای multio پس از انشعاب یافتن (fork) فرایند cat از شل والد ایجاد میشوند، بنابراین شل والد منتظر نمیماند تا فرایندهای multio نوشتن دادهها را به پایان برسانند. این بدان معنی است که دستور نشاندادهشده میتواند قبل از نوشته شدن کامل file1 و file2 خاتمه یابد. به عنوان یک راهکار، میتوان فرایند cat را به عنوان بخشی از یک کار (job) در شل فعلی اجرا کرد:
{ cat file } >file >file2
در اینجا، کار {...} مکث خواهد کرد تا منتظر نوشته شدن هر دو فایل بماند. هنگامی که یک دستور ساده شامل یک یا چند عملگر تغییرمسیر و صفر یا چند انتساب پارامتر باشد، اما نام دستوری وجود نداشته باشد، zsh میتواند به چندین شیوه رفتار کند.
اگر پارامتر NULLCMD تنظیم نشده باشد یا گزینهٔ CSH_NULLCMD تنظیم شده باشد، یک خطا رخ میدهد. این رفتار csh است و CSH_NULLCMD هنگام شبیهسازی csh بهطور پیشفرض تنظیم است.
اگر گزینهٔ SH_NULLCMD تنظیم شده باشد، دستور توکار `:' به عنوان یک دستور با تغییرمسیرهای دادهشده درج میشود. این حالت پیشفرض هنگام شبیهسازی sh یا ksh است.
در غیر این صورت، اگر پارامتر NULLCMD تنظیم شده باشد، مقدار آن به عنوان دستوری با تغییرمسیرهای دادهشده استفاده خواهد شد. اگر هر دو پارامتر NULLCMD و READNULLCMD تنظیم شده باشند، هنگامی که تغییرمسیر از نوع ورودی باشد، مقدار دومی به جای اولی استفاده خواهد شد. مقدار پیشفرض برای NULLCMD برابر با `cat' و برای READNULLCMD برابر با `more'' است. بنابراین
< file
محتویات file را در خروجی استاندارد نشان میدهد، و اگر خروجی یک پایانه باشد، صفحهبندی میشود. NULLCMD و READNULLCMD ممکن است به توابع پوسته اشاره کنند.
اجرای دستور (COMMAND EXECUTION)
اگر نام یک دستور حاوی هیچ خط موری (اسلش) نباشد، پوسته تلاش میکند آن را پیدا کند. اگر تابع پوستهای با آن نام وجود داشته باشد، تابع همانطور که در بخش `Functions' توضیح داده شده فراخوانی میشود. اگر یک دستور توکار پوسته با آن نام وجود داشته باشد، آن دستور توکار فراخوانی میگردد.
در غیر این صورت، پوسته هر عنصر از $path را برای یافتن دایرکتوری حاوی یک فایل اجرایی با آن نام جستجو میکند.
اگر اجرا شکست بخورد: یک پیام خطا چاپ میشود، و یکی از مقادیر زیر بازگردانده میشود.
- 127
- جستجو ناموفق بود. پیام خطا `command not found: cmd' است.
- 126
- فایل اجرایی مجوزهای کافی ندارد، یک دایرکتوری یا فایل ویژه است، یا اینکه اسکریپت نبوده و در قالبی ناشناخته برای سیستمعامل قرار دارد. شرایط دقیق و پیام خطا وابسته به سیستمعامل هستند؛ به execve(2) مراجعه کنید.
اگر اجرا به دلیل این که فایل در قالب اجرایی نیست با شکست مواجه شود، و فایل یک دایرکتوری نباشد، فرض میشود که یک اسکریپت پوسته است. /bin/sh برای اجرای آن فراخوانی (spawn) میشود. اگر برنامه فایلی باشد که با `#!' آغاز میشود، باقیماندهٔ خط اول یک مفسر را برای برنامه مشخص میکند. در سیستمعاملهایی که این قالب اجرایی را در هسته مدیریت نمیکنند، پوسته مفسر مشخصشده را اجرا خواهد کرد.
اگر هیچ دستور خارجی پیدا نشود اما تابعی به نام command_not_found_handler وجود داشته باشد، پوسته این تابع را به همراه تمام آرگومانهای خط فرمان اجرا میکند. وضعیت بازگشتی تابع، به وضعیت دستور تبدیل میشود. توجه داشته باشید که این گرداننده در یک زیرپوسته (subshell) منشعبشده (forked) برای اجرای یک دستور خارجی اجرا میگردد، بنابراین تغییرات در دایرکتوریها، پارامترهای پوسته و غیره هیچ اثری بر پوستهٔ اصلی ندارند.
توابع (FUNCTIONS)
توابع پوسته با کلمهٔ کلیدی رزروشدهٔ function یا نحو ویژهٔ `funcname ()' تعریف میشوند. توابع پوسته خوانده شده و به صورت داخلی ذخیره میگردند. نامهای مستعار (Alias) هنگام خواندهشدن تابع برطرف میشوند. توابع مانند دستورها با آرگومانهایی که به عنوان پارامترهای موضعی منتقل میشوند، اجرا میگردند. (بخش `Command Execution' را ببینید.)
توابع در همان فرایند فراخواننده اجرا میشوند و در تمام فایلها و دایرکتوری کاری فعلی با فراخواننده سهیم هستند. تلهای (trap) روی EXIT که درون تابع تنظیم شود، پس از اتمام کار تابع در محیط فراخواننده اجرا میگردد.
دستور توکار return برای بازگشت از فراخوانیهای تابع استفاده میشود.
شناسههای توابع را میتوان با دستور توکار functions فهرست کرد. توابع را میتوان با دستور توکار unfunction لغو تعریف کرد.
بارگذاری خودکار توابع (AUTOLOADING FUNCTIONS)
یک تابع میتواند با استفاده از دستور توکار autoload (یا `functions -u' یا `typeset -fu') به عنوان undefined (تعریفنشده) نشانهگذاری شود. چنین تابعی هیچ بدنهای ندارد. هنگامی که تابع برای نخستین بار اجرا میشود، پوسته با استفاده از عناصر متغیر fpath به دنبال تعریف آن میگردد. بنابراین برای تعریف توابع جهت بارگذاری خودکار، یک توالی معمول به این صورت است:
fpath=(~/myfuncs $fpath) autoload myfunc1 myfunc2 ...
اگر به دستور توکار autoload یا معادل آن، گزینهٔ -U داده شود، بسط معمول نامهای مستعار هنگام خواندن نادیده گرفته میشود. این کار برای استفاده از توابعی که همراه با توزیع zsh عرضه میشوند توصیه میگردد. توجه داشته باشید برای توابعی که از پیش با دستور توکار zcompile کامپایل شدهاند، پرچم -U باید هنگام ایجاد فایل .zwc ارائه شود، زیرا اطلاعات مربوطه درون این فایل کامپایل میشود.
به ازای هر element در fpath، پوسته به دنبال سه فایل احتمالی میگردد که جدیدترین آنها برای بارگذاری تعریف تابع استفاده میشود:
- element.zwc
- فایلی ایجادشده با دستور توکار zcompile که انتظار میرود شامل تعاریف تمام توابع موجود در دایرکتوری با نام element باشد. با این فایل به همان شیوهٔ یک دایرکتوری حاوی فایلهای توابع رفتار میشود و برای تعریف تابع مورد جستجو قرار میگیرد. اگر تعریف پیدا نشود، جستجو برای تعریف با دو احتمال دیگر که در زیر شرح داده شده ادامه مییابد.
اگر element از پیش شامل پسوند .zwc باشد (یعنی پسوند صراحتاً توسط کاربر مشخص شده باشد)، element برای یافتن تعریف تابع بدون مقایسهٔ قدمت زمانیاش با فایلهای دیگر جستجو میشود؛ در واقع، نیازی به وجود هیچ دایرکتوریای به نام element بدون این پسوند نیست. بنابراین گنجاندن عنصری مانند `/usr/local/funcs.zwc' در fpath سرعت جستجوی توابع را بالا میبرد، اما این عیب را دارد که توابع گنجاندهشده باید قبل از اینکه پوسته متوجه تغییراتی شود، صراحتاً به صورت دستی مجدداً کامپایل گردند.
- element/function.zwc
- فایلی ایجادشده با zcompile که انتظار میرود حاوی تعریف function باشد. ممکن است تعاریف توابع دیگری را نیز شامل شود، اما آنها نه بارگذاری میشوند و نه اجرا؛ فایلی که بدین صورت یافت شود تنها برای یافتن تعریف function جستجو میشود.
- element/function
- فایلی از متن دستورات zsh که به عنوان تعریف function در نظر گرفته میشود.
به طور خلاصه، ترتیب جستجو به این صورت است: نخست، در والدین دایرکتوریهای موجود در fpath برای یافتن جدیدترین مورد بین یک دایرکتوری کامپایلشده یا یک دایرکتوری در fpath؛ دوم، اگر بیش از یکی از این موارد شامل تعریفی برای تابع مورد نظر باشد، چپترین مورد در fpath انتخاب میشود؛ و سوم، در داخل یک دایرکتوری، جدیدترین مورد بین یک تابع کامپایلشده یا تعریف یک تابع معمولی استفاده میشود.
اگر گزینهٔ KSH_AUTOLOAD تنظیم شده باشد، یا فایل فقط شامل یک تعریف ساده از تابع باشد، محتویات فایل اجرا خواهد شد. این کار به طور معمول تابع مورد نظر را تعریف میکند، اما ممکن است مقداردهی اولیهای را نیز انجام دهد که در بستر اجرای تابع اجرا میشود، و بنابراین ممکن است پارامترهای محلی تعریف کند. اگر با بارگذاری فایل، تابع تعریف نشود یک خطا محسوب میشود.
در غیر این صورت، بدنهٔ تابع (بدون `funcname() {...}' در اطراف آن) به عنوان کل محتوای فایل در نظر گرفته میشود. این ساختار اجازه میدهد تا از فایل مستقیماً به عنوان یک اسکریپت پوستهٔ اجرایی استفاده شود. اگر پردازش فایل منجر به تعریف مجدد تابع شود، خود تابع دوباره اجرا نمیگردد. برای وادار کردن پوسته به انجام مقداردهی اولیه و سپس فراخوانی تابع تعریفشده، فایل علاوه بر یک تعریف کامل از تابع (که برای فراخوانیهای بعدی تابع نگهداشته میشود)، باید شامل کد مقداردهی اولیه (که اجرا شده و سپس کنار گذاشته میشود) و یک فراخوانی تابع پوسته به همراه هرگونه آرگومان در انتها باشد.
برای مثال، فرض کنید فایل بارگذاری خودکار func شامل این موارد باشد:
func() { print This is func; }
print func is initialized
آنگاه اجرای `func; func' با تنظیم بودن KSH_AUTOLOAD در اولین فراخوانی هر دو پیام را تولید میکند، اما در فراخوانی دوم و پس از آن، تنها پیام `This is func' را چاپ مینماید. بدون تنظیم بودن KSH_AUTOLOAD، پیام مقداردهی اولیه در فراخوانی نخست، و پیام دیگر در دومین و فراخوانیهای بعدی تولید خواهد شد.
همچنین میتوان تابعی ایجاد کرد که به عنوان بارگذاری خودکار نشانهگذاری نشده است، اما تعریف خود را با جستجو در fpath بارگذاری میکند، این کار با استفاده از `autoload -X' درون یک تابع پوسته انجام میشود. برای مثال، موارد زیر معادل یکدیگرند:
myfunc() {
autoload -X
}
myfunc args...
و.PP
unfunction myfunc # if myfunc was defined autoload myfunc myfunc args...
در واقع، دستور functions عبارت `builtin autoload -X' را به عنوان بدنهٔ یک تابع بارگذاریخودکار (autoloaded) در خروجی قرار میدهد. این کار به این منظور انجام میشود که
eval "$(functions)"
نتیجهای معقول تولید کند. یک تابع بارگذاریخودکارِ واقعی را میتوان با وجود توضیح `# undefined' در بدنه شناسایی کرد، زیرا تمام توضیحات از توابع تعریفشده حذف میشوند.
برای بارگذاری تعریف یک تابع بارگذاریخودکارِ myfunc بدون اجرای myfunc، از دستور زیر استفاده کنید:
autoload +X myfunc
توابع ناشناس (ANONYMOUS FUNCTIONS)
اگر نامی برای یک تابع مشخص نشود، آن تابع «ناشناس» (`anonymous') است و به شکل ویژهای با آن رفتار میشود. هر دو شکل تعریف تابع را میتوان به کار برد: یک `()' بدون هیچ نامی پیش از آن، یا عبارت `function' که بلافاصله پس از آن یک آکولاد باز قرار گرفته باشد. تابع بیدرنگ در همان نقطهٔ تعریف اجرا میشود و برای استفادههای بعدی ذخیره نمیگردد. نام تابع برابر با `(anon)' تنظیم میشود.
آرگومانهای تابع را میتوان به صورت کلماتی پس از آکولادِ بستهٔ تعریفکنندهٔ تابع تعیین کرد؛ از این رو در صورت عدم وجود آنها، هیچ آرگومانی (به جز $0) مقداردهی نخواهد شد. این مورد با نحوهٔ تجزیهٔ سایر توابع تفاوت دارد: پس از تعاریف توابع عادی ممکن است کلمات کلیدی خاصی مانند `else' یا `fi' بیایند، در حالی که در توابع ناشناس با آنها به عنوان آرگومان رفتار خواهد شد؛ بنابراین برای واداشتن شل به تفسیر آنها به عنوان کلمه کلیدی، به یک خط جدید (newline) یا نقطه-ویرگول نیاز است.
همچنین توجه داشته باشید که فهرست آرگومانهای هر اسکریپت یا تابع دربرگیرنده پنهان میشود (همانطور که در مورد هر تابع دیگری که در این نقطه فراخوانی شود صدق میکند).
تغییرمسیرها را میتوان به همان روشی که بر روی ساختارهای شلِ جاری محصور در آکولاد اعمال میشوند، بر توابع ناشناس نیز اعمال کرد. کاربرد اصلی توابع ناشناس، فراهم کردن یک محدوده (scope) برای متغیرهای محلی است. این قابلیت بهویژه در فایلهای راهاندازی (start-up files) بسیار سودمند است چرا که این فایلها محدودهٔ متغیر محلی مخصوص به خود را ارائه نمیدهند.
برای مثال،
variable=outside
function {
local variable=inside
print "I am $variable with arguments $*"
} this and that
print "I am $variable"
خروجی زیر را تولید میکند:
I am inside with arguments this and that I am outside
توجه داشته باشید که تعاریف تابعی با آرگومانهایی که به هیچ منبسط (expand) میشوند، برای مثال `name=; function $name { ... }'، به عنوان توابع ناشناس در نظر گرفته نمیشوند. در عوض، مانند تعاریف تابع عادی با آنها برخورد میشود که در آن، تعریف تابع بدون اعلام هیچ پیامی نادیده گرفته میشود.
توابع ویژه (SPECIAL FUNCTIONS)
توابع خاصی در صورت تعریف شدن، معنای ویژهای برای شل دارند.
توابع قلاب (Hook Functions)
برای توابع زیر، این امکان وجود دارد که آرایهای تعریف شود که نامی یکسان با تابع داشته و عبارت `_functions' به انتهای آن افزوده شده باشد. هر عنصری در چنین آرایهای به عنوان نام تابعی برای اجرا در نظر گرفته میشود؛ این تابع در همان زمینه (context) و با همان آرگومانها و همان مقدار اولیهٔ $? مانند تابع پایه اجرا میشود. برای مثال، اگر $chpwd_functions آرایهای حاوی مقادیر `mychpwd' و `chpwd_save_dirstack' باشد، شل تلاش میکند توابع `chpwd'، `mychpwd' و `chpwd_save_dirstack' را به همان ترتیب اجرا کند. هر تابعی که وجود نداشته باشد، بدون اخطار نادیده گرفته میشود. تابعی که از طریق این سازوکار یافته شود در جاهای دیگر به عنوان یک تابع قلاب (hook function) شناخته میشود. بروز خطا در هر یک از توابع باعث میشود توابع بعدی اجرا نشوند. علاوه بر این توجه داشته باشید که خطا در یک قلاب precmd باعث میشود تابع periodic که بلافاصله پس از آن قرار دارد اجرا نشود (اگرچه ممکن است در فرصت بعدی اجرا گردد).
- chpwd
- هر زمان که دایرکتوری کاری جاری تغییر کند اجرا میشود.
- periodic
- اگر پارامتر PERIOD تنظیم شده باشد، این تابع هر $PERIOD ثانیه یکبار، درست پیش از اعلان خط فرمان (prompt) اجرا میشود. توجه داشته باشید که اگر با استفاده از آرایهٔ periodic_functions چندین تابع تعریف شده باشند، تنها یک دورهٔ زمانی برای کل مجموعه توابع اعمال میشود، و با تغییر لیست توابع، زمانبندیِ تعیینشده بازنشانی نمیگردد. بنابراین این مجموعه توابع همواره با یکدیگر فراخوانی میشوند.
- precmd
- پیش از هر اعلان خط فرمان اجرا میشود. توجه داشته باشید که توابع پیشفرمان (precommand) صرفاً به دلیل بازترسیم مجدد خط فرمان، مثلاً هنگام نمایش اعلان خروج یک کار (job)، دوباره اجرا نمیشوند.
- preexec
- درست پس از خوانده شدن یک دستور و زمانی که در شرف اجرا است، اجرا میشود. اگر سازوکار تاریخچه فعال باشد (صرفنظر از اینکه خط از بافر تاریخچه کنار گذاشته شده باشد یا خیر)، رشتهای که کاربر تایپ کرده به عنوان آرگومان اول ارسال میشود، در غیر این صورت یک رشتهٔ خالی خواهد بود. دستور واقعی که اجرا خواهد شد (شامل نامهای مستعار گسترشیافته) در دو شکل مختلف ارسال میشود: آرگومان دوم یک نسخهٔ تکخطی و با اندازهٔ محدود از دستور است (که مواردی مانند بدنهٔ توابع در آن حذف شدهاند)؛ آرگومان سوم شامل متن کاملِ دستوری است که اجرا میشود.
- zshaddhistory
- هنگامی که یک خط تاریخچه به صورت تعاملی خوانده شده است، اما پیش از آنکه اجرا شود، اجرا میگردد. تنها آرگومان آن، خط کامل تاریخچه است (به گونهای که هر کاراکتر خط جدیدِ پایانی همچنان در آن وجود خواهد داشت).
اگر هر یک از توابع قلاب، وضعیت ۱ (یا هر مقدار غیرصفر دیگری به جز ۲، هرچند این مورد برای نسخههای آیندهٔ شل تضمین نشده است) را برگرداند، خط تاریخچه ذخیره نخواهد شد، اگرچه تا زمان اجرای خط بعدی در تاریخچه باقی میماند و به شما اجازه میدهد فوراً از آن استفاده مجدد کرده یا آن را ویرایش کنید.
اگر هر یک از توابع قلاب، وضعیت ۲ را برگرداند، خط تاریخچه در فهرست تاریخچهٔ داخلی ذخیره میشود، اما در فایل تاریخچه نوشته نمیشود. در صورت بروز تعارض، اولین مقدار وضعیت غیرصفر ملاک عمل خواهد بود.
یک تابع قلاب میتواند `fc -p ...' را فراخوانی کند تا زمینهٔ تاریخچه را تغییر دهد تا تاریخچه در فایلی متفاوت از آنچه در پارامتر سراسری HISTFILE آمده ذخیره شود. با این مورد به صورت ویژه رفتار میشود: زمینهٔ تاریخچه پس از پایان پردازش خط تاریخچه، به صورت خودکار بازیابی میشود.
تابع مثال زیر در صورت تنظیم بودن یکی از گزینههای INC_APPEND_HISTORY یا SHARE_HISTORY عمل میکند تا خط بلافاصله پس از افزودن مدخل تاریخچه، نوشته شود. این تابع ابتدا خط تاریخچه را با حذف کاراکتر خط جدید به تاریخچهٔ عادی اضافه میکند که معمولاً رفتار درستی است. سپس زمینهٔ تاریخچه را تغییر میدهد تا خط در یک فایل تاریخچه در دایرکتوری جاری نوشته شود.
zshaddhistory() {
print -sr -- ${1%%$'\n'}
fc -p .zsh_local_history
}
- zshexit
- در نقطهای اجرا میشود که شل اصلی در شرف خروج عادی است. این تابع با خروج زیرشلها (subshells) و همچنین هنگام استفاده از تغییردهندهٔ پیشفرمان exec قبل از یک دستور خارجی، فراخوانی نمیشود. همچنین، بر خلاف TRAPEXIT، هنگام خروج توابع فراخوانی نمیگردد.
توابع زیر به صورت ویژهای مدیریت میشوند اما آرایههای قلاب (hook) متناظر ندارند.
- TRAPNAL
- اگر تعریف شده و غیرتهی (non-null) باشد، هر زمان که شل سیگنال SIGNAL را دریافت کند (که در آن NAL نام سیگنالی است که برای دستور توکار kill مشخص میشود)، این تابع اجرا خواهد شد. شماره سیگنال به عنوان نخستین پارامتر به تابع ارسال میشود.
اگر تابعی به این شکل تعریف شده و تهی (null) باشد، شل و فرآیندهای ایجادشده توسط آن، SIGNAL را نادیده خواهند گرفت.
وضعیت بازگشتی از تابع به صورت ویژهای رسیدگی میشود. اگر صفر باشد، فرض میشود که سیگنال مدیریت شده است و اجرای برنامه به صورت عادی ادامه مییابد. در غیر این صورت، شل مانند زمانی که دچار وقفه شده رفتار خواهد کرد، با این تفاوت که وضعیت بازگشتی تله حفظ میشود.
برنامههایی که با سیگنالهای دریافتنشده خاتمه مییابند، معمولاً وضعیت ۱۲۸ به علاوه شماره سیگنال را برمیگردانند. بنابراین قطعه کد زیر باعث میشود گرداننده SIGINT پیامی را چاپ کند و سپس اثر معمول این سیگنال را تقلید نماید.
TRAPINT() {
print "Caught SIGINT, aborting."
return $(( 128 + $1 ))
}
توابع TRAPZERR، TRAPDEBUG و TRAPEXIT هرگز درون تلههای دیگر اجرا نمیشوند.
- TRAPDEBUG
- اگر گزینه DEBUG_BEFORE_CMD فعال باشد (که به طور پیشفرض هست)، پیش از هر دستور اجرا میشود؛ در غیر این صورت پس از هر دستور اجرا خواهد شد. برای جزئیات مربوط به امکانات اضافی ارائهشده در تلههای دیباگ، توضیحات دستور توکار trap را در zshbuiltins(1) ببینید.
- TRAPEXIT
- هنگامی که شل خارج میشود، یا چنانچه درون یک تابع تعریف شده باشد، هنگام خروج تابع جاری اجرا میشود. مقدار $? در آغاز اجرا، وضعیت خروج شل یا وضعیت بازگشتی تابع در حال خروج است.
- TRAPZERR
- هر زمان که یک دستور وضعیت خروج غیرصفر داشته باشد اجرا میشود. با این حال، اگر دستور در یک زیرلیست و به دنبال آن `&&' یا `||' آمده باشد، تابع اجرا نخواهد شد؛ تنها دستور پایانی در زیرلیستی از این نوع باعث اجرای تله میشود. تابع TRAPERR در سیستمهایی که فاقد SIGERR هستند (که حالت معمول است)، مانند TRAPZERR عمل میکند.
توابعی که با `TRAP' آغاز میشوند را میتوان به کمک دستور توکار trap نیز تعریف کرد: این کار ممکن است برای برخی کاربردها ارجح باشد. تنظیم یک تله با یک قالب، هرگونه تله از قالب دیگر را برای همان سیگنال حذف میکند؛ همچنین حذف یک تله در هر یک از این قالبها، تمام تلههای مربوط به همان سیگنال را حذف خواهد کرد. قالبهای
TRAPNAL() {
# code
}
(«تلههای تابعی») و
trap ' # code ' NAL
(«تلههای لیستی») در بیشتر جنبهها معادل یکدیگرند، به استثنای موارد زیر:
- •
- تلههای تابعی دارای تمام ویژگیهای توابع معمولی هستند، در فهرست توابع ظاهر میشوند و با بافت تابعی خودشان فراخوانی میگردند، نه بافتی که تله در آن برانگیخته شده است.
- •
- وضعیت بازگشتی از تلههای تابعی خاص است، در حالی که بازگشت (return) از یک تله لیستی باعث میشود بافت پیرامونی با وضعیت دادهشده بازگردد.
- •
- تلههای تابعی بر اساس رفتار zsh در زیرشلها (subshells) بازنشانی نمیشوند؛ تلههای لیستی بر اساس رفتار POSIX بازنشانی میشوند.
کارها (JOBS)
اگر گزینه MONITOR فعال باشد، یک شل تعاملی یک کار (job) را به هر خط لوله (pipeline) اختصاص میدهد. شل جدولی از کارهای جاری را نگه میدارد که با دستور jobs چاپ میشود، و اعداد صحیح کوچکی را به آنها اختصاص میدهد. هنگامی که یک کار به صورت ناهمگام با `&' آغاز میشود، شل خطی شبیه به این را در خروجی خطای استاندارد چاپ میکند:
[1] 1234
که نشان میدهد کاری که به طور ناهمگام آغاز شده است، کار شماره ۱ بوده و دارای یک فرآیند (سطح بالا) بوده است که شناسه فرآیند (PID) آن ۱۲۳۴ است.
اگر کاری با `&|' یا `&!' آغاز شود، آن کار بلافاصله واگذار (disown) میشود. پس از راهاندازی، جایی در جدول کارها ندارد و مشمول ویژگیهای کنترل کاری که در اینجا شرح داده شده است نمیشود.
اگر در حال اجرای کاری هستید و میخواهید کار دیگری انجام دهید، میتوانید کلید ^Z (کنترل-Z) را فشار دهید که سیگنال TSTP را به کار جاری ارسال میکند: این کلید را میتوان با گزینه susp دستور خارجی stty بازتعریف کرد. شل معمولاً نشان میدهد که کار معلق شده است (`suspended') و اعلان (prompt) دیگری را چاپ میکند. سپس میتوانید وضعیت این کار را تغییر دهید، آن را با دستور bg در پسزمینه قرار دهید، یا دستورهای دیگری را اجرا کنید و در نهایت با دستور پیشزمینه fg، کار را دوباره به پیشزمینه بیاورید. کلید ^Z بلافاصله اعمال میشود و مانند یک وقفه است از این نظر که خروجی معلق و ورودی خواندهنشده هنگام فشرده شدن آن دور ریخته میشوند.
کاری که در پسزمینه اجرا میشود، در صورت تلاش برای خواندن از ترمینال معلق خواهد شد.
توجه داشته باشید که اگر کار در حال اجرا در پیشزمینه یک تابع شل باشد، معلق کردن آن موجب انشعاب (fork) شل خواهد شد. این کار برای جداسازی وضعیت تابع از وضعیت شل والد که کنترل کار را انجام میدهد ضروری است، تا شل والد بتواند به اعلان خط فرمان بازگردد. در نتیجه، حتی اگر از fg برای ادامه کار استفاده شود، تابع دیگر بخشی از شل والد نخواهد بود و هر متغیری که توسط تابع تنظیم شود در شل والد قابل مشاهده نخواهد بود. بنابراین رفتار آن با حالتی که تابع هرگز معلق نشده بود تفاوت دارد. Zsh از این نظر با بسیاری از شلهای دیگر متفاوت است.
یک اثر جانبی اضافی این است که استفاده از disown با کاری که با معلق کردن کد شل به این شیوه ایجاد شده است به تأخیر میافتد: کار تنها زمانی میتواند واگذار (disown) شود که هر فرآیندی که از شل والد شروع شده خاتمه یافته باشد. در آن نقطه، کار واگذارشده بیصدا از فهرست کارها ناپدید میشود.
همین رفتار زمانی نیز رخ میدهد که شل در حال اجرای کد به عنوان سمت راست یک خط لوله یا هر ساختار پیچیده شل مانند if، for و غیره باشد، تا بتوان کل بلوک کد را به عنوان یک کار واحد مدیریت کرد. کارهای پسزمینه به طور معمول مجاز به تولید خروجی هستند، اما این امکان را میتوان با اجرای دستور `stty tostop' غیرفعال کرد. اگر این گزینه tty را تنظیم کنید، کارهای پسزمینه هنگام تلاش برای تولید خروجی، دقیقاً مانند زمانی که سعی در خواندن ورودی دارند، معلق خواهند شد.
هنگامی که دستوری معلق شده و سپس با دستورات توکار fg یا wait ادامه مییابد، zsh حالتهای tty را که در هنگام تعلیق فعال بودند بازیابی میکند. این موضوع (بهطور عامدانه) در صورتی که دستور از طریق `kill -CONT' ادامه یابد و همچنین زمانی که با bg ادامه مییابد، اعمال نمیشود.
روشهای گوناگونی برای ارجاع به کارها در شل وجود دارد. میتوان با شناسه فرآیند هر یک از فرآیندهای کار یا با یکی از موارد زیر به یک کار ارجاع داد:
- %number
- کار با شماره دادهشده.
- %string
- آخرین کاری که خط فرمان آن با string آغاز میشود.
- %?string
- آخرین کاری که خط فرمان آن شامل string است.
- %%
- کار جاری.
- %+
- معادل `%%'.
- %-
- کار قبلی.
شل بلافاصله از هرگونه تغییر وضعیت فرآیندها مطلع میشود. معمولاً هرگاه کاری مسدود شود به طوری که پیشرفت بیشتری ممکن نباشد، شما را مطلع میکند. اگر گزینه NOTIFY تنظیم نشده باشد، تا لحظاتی پیش از چاپ اعلان خط فرمان منتظر میماند و سپس به شما اطلاع میدهد. تمام چنین اعلانهایی مستقیماً به ترمینال ارسال میشوند، نه به خروجی استاندارد یا خطای استاندارد..PP هنگامی که حالت پایش (monitor mode) فعال است، هر کار پسزمینهای که پایان مییابد، هر تلهٔ (trap) تنظیمشده برای CHLD را فراخوانی میکند.
هنگامی که تلاش میکنید در زمان اجرای کارهای در حال اجرا یا تعلیقشده از پوسته خارج شوید، به شما هشدار داده خواهد شد که «You have suspended (running) jobs». میتوانید از دستور jobs برای دیدن آنها استفاده کنید. اگر این کار را انجام دهید یا بلافاصله دوباره برای خروج تلاش کنید، پوسته برای بار دوم به شما هشدار نخواهد داد؛ کارهای معلق خاتمه مییابند، و در صورتی که گزینهٔ HUP تنظیم شده باشد، به کارهای در حال اجرا یک سیگنال SIGHUP ارسال خواهد شد.
برای جلوگیری از پایان دادن به کارهای در حال اجرا توسط پوسته، یا از دستور nohup(1) استفاده کنید یا از دستور توکار disown.
سیگنالها (SIGNALS)
سیگنالهای INT و QUIT برای یک دستور فراخوانیشده نادیده گرفته میشوند، اگر پس از دستور «&» آمده باشد و گزینهٔ MONITOR فعال نباشد. خودِ پوسته همیشه سیگنال QUIT را نادیده میگیرد. در غیر این صورت، سیگنالها مقادیری را دارند که پوسته از والد خود به ارث برده است (اما به توابع ویژهٔ TRAPNAL در بخش «Functions» مراجعه کنید).
برخی از کارها، به غیر از آنهایی که صراحتاً به پسزمینه فرستاده شدهاند، توسط پوسته به صورت ناهمگام اجرا میشوند؛ حتی در مواردی که پوسته معمولاً منتظر چنین کارهایی میماند، یک دستور صریح exit یا خروج به دلیل فعال بودن گزینهٔ ERR_EXIT باعث میشود که پوسته بدون انتظار خارج شود. نمونههایی از این کارهای ناهمگام عبارتند از جایگزینی فرایند (process substitution)، بخش PROCESS SUBSTITUTION را در صفحهٔ راهنمای zshexpn(1) ببینید، و فرایندهای پردازشگر multios، بخش MULTIOS را در صفحهٔ راهنمای zshmisc(1) ببینید.
ارزیابی محاسباتی (ARITHMETIC EVALUATION)
پوسته میتواند محاسبات عدد صحیح و ممیز شناور را با استفاده از دستور توکار let، یا از طریق جایگزینی به شکل $((...)) انجام دهد. برای اعداد صحیح، در صورت در دسترس بودن، پوسته معمولاً با دقت ۸ بایتی کامپایل میشود، در غیر این صورت دقت ۴ بایت خواهد بود. این مورد را میتوان به عنوان مثال با اجرای دستور «print - $(( 12345678901 ))» بررسی کرد؛ اگر عدد بدون تغییر نمایش داده شود، دقت محاسباتی حداقل ۸ بایت است. محاسبات ممیز شناور همیشه از نوع «double» با هر دقتی که توسط کامپایلر و کتابخانه ارائه میشود، استفاده میکند.
دستور توکار let عبارات حسابی را به عنوان آرگومان میپذیرد؛ هر کدام به صورت جداگانه ارزیابی میشوند. از آنجا که بسیاری از عملگرهای محاسباتی و همچنین فاصلهها نیازمند نقلقول هستند، یک شکل جایگزین ارائه شده است: برای هر دستوری که با «((» آغاز شود، تمامی نویسهها تا «))» متناظر با آن به عنوان یک عبارت درون نقلقول دوتایی در نظر گرفته میشوند و بسط حسابی مشابه یک آرگومان برای let روی آن صورت میگیرد. به طور دقیقتر، «((...))» معادل «let "..."» است. وضعیت بازگشتی در صورتی که مقدار محاسباتی عبارت غیرصفر باشد ۰، اگر صفر باشد ۱، و در صورت بروز خطا ۲ است.
به عنوان مثال، عبارت زیر
(( val = 2 + 1 ))
معادل است با
let "val = 2 + 1"
که هر دو مقدار ۳ را به متغیر پوستهٔ val انتساب داده و وضعیت خروج صفر برمیگردانند.
اعداد صحیح میتوانند در مبناهایی به غیر از ۱۰ باشند. پیشوند «0x» یا «0X» نشاندهندهٔ مبنای ۱۶ و پیشوند «0b» یا «0B» نشاندهندهٔ دودویی است. اعداد صحیح همچنین میتوانند به شکل «base#n» باشند، که در آن base عددی دهدهی بین دو و سیوشش است که مبنای محاسباتی را مشخص میکند و n عددی در آن مبنا است (برای مثال، «16#ff» برابر ۲۵۵ در مبنای ۱۶ است). پیشوند base# میتواند حذف شود، که در این حالت مبنای ۱۰ به کار میرود. به منظور سازگاری با گذشته، قالب «[base]n» نیز پذیرفته میشود.
یک عبارت عدد صحیح یا مبنایی که به شکل «base#n» داده شده است، میتواند پس از رقم آغازین شامل زیرخطها («_») برای راهنمایی بصری باشد؛ این موارد در محاسبات نادیده گرفته میشوند. نمونههایی از این دست عبارتند از 1_000_000 یا 0xffff_ffff که به ترتیب معادل 1000000 و 0xffffffff هستند.
همچنین میتوان مبنایی را برای استفاده در خروجی به شکل «[#base]»، برای مثال «[#16]»، مشخص کرد. این مورد هنگام چاپ خروجی جایگزینیهای محاسباتی یا هنگام انتساب به پارامترهای اسکالر به کار میرود، اما پارامتری که صراحتاً به عنوان عدد صحیح یا ممیز شناور تعریف شده باشد تحت تأثیر قرار نخواهد گرفت. اگر یک متغیر عدد صحیح به طور ضمنی توسط یک عبارت محاسباتی تعریف شود، هر مبنایی که بدین طریق مشخص شده باشد به عنوان مبنای محاسباتی خروجیِ متغیر تنظیم میشود، درست مانند اینکه گزینهٔ «-i base» در دستور توکار typeset استفاده شده باشد. این عبارت هیچ حق تقدمی ندارد و اگر بیش از یک بار در یک عبارت ریاضی بیاید، آخرین موردی که دیده شده اعمال میشود. برای وضوح، توصیه میشود که در آغاز عبارت قرار گیرد. به عنوان مثال:
typeset -i 16 y print $(( [#8] x = 32, y = 32 )) print $x $y
ابتدا «8#40»، راستترین مقدار در مبنای خروجی ارائهشده، و سپس «8#40 16#20» را در خروجی چاپ میکند، زیرا y صراحتاً دارای مبنای خروجی ۱۶ اعلان شده است، در حالی که نوعِ x (با فرض اینکه از قبل وجود نداشته است) به طور ضمنی با ارزیابی محاسباتی تعیین شده و مبنای خروجی ۸ را دریافت میکند.
میتوان base را با یک زیرخط جایگزین کرد یا پس از آن یک زیرخط آورد، که خود میتواند با یک عدد صحیح مثبت دنبال شود (اگر قید نشود، مقدار ۳ استفاده میشود). این امر مشخص میکند که برای وضوح بصری، باید زیرخطهایی جهت گروهبندی ارقام عدد در رشتهٔ خروجی درج شوند. عدد صحیحِ پس از آن، تعداد ارقامی را که باید با هم گروهبندی شوند مشخص میکند. برای مثال:
setopt cbases print $(( [#16_4] 65536 ** 2 ))
مقدار «0x1_0000_0000» را چاپ میکند.
این قابلیت میتواند برای اعداد ممیز شناور نیز استفاده شود، که در این حالت مبنا باید حذف شود؛ گروهبندی ارقام در جهت دور شدن از ممیز انجام میشود. برای مثال،
zmodload zsh/mathfunc print $(( [#_] sqrt(1e7) ))
مقدار «3_162.277_660_168_379_5» را در خروجی نمایش میدهد (تعداد رقمهای اعشاری نمایشدادهشده ممکن است متفاوت باشد).
اگر گزینهٔ C_BASES تنظیم شده باشد، اعداد مبنای ۱۶ در قالب استاندارد C خارج میشوند، برای مثال «0xFF» به جای قالب معمول «16#FF». اگر گزینهٔ OCTAL_ZEROES نیز تنظیم شده باشد (به صورت پیشفرض تنظیم نیست)، رفتار مشابهی با اعداد مبنای هشت خواهد شد و به جای «8#77» به صورت «077» نمایش مییابند. این گزینه اثری بر خروجی مبناهایی غیر از ۱۶ و ۸ ندارد، و این قالبها همیشه در ورودی معتبر و قابل تشخیص هستند.
هنگامی که یک مبنای خروجی با استفاده از نحو «[#base]» مشخص میشود، در صورت نیاز پیشوند مناسبِ مبنا در خروجی ظاهر خواهد شد تا مقدار خروجی نحوی معتبر برای ورودی باشد. اگر # دو بار تکرار شود، برای مثال «[##16]»، هیچ پیشوند مبنایی در خروجی درج نمیشود.
ثابتهای ممیز شناور با وجود ممیز اعشاری یا توان (نماد علمی) شناسایی میشوند. ممیز اعشاری میتواند نخستین نویسهٔ مقدار ثابت باشد، اما نویسهٔ توان e یا E نمیتواند در ابتدا بیاید، چرا که به عنوان نام پارامتر در نظر گرفته میشود. تمام بخشهای عددی (قبل و بعد از ممیز و در توان) میتوانند پس از رقم آغازین شامل زیرخطهایی برای وضوح بصری باشند؛ این موارد در محاسبات نادیده گرفته میشوند.
یک عبارت محاسباتی تقریباً از همان نحو و شرکتپذیریِ عبارات در زبان C بهره میبرد.
در حالت بومیِ عملکرد، عملگرهای زیر پشتیبانی میشوند (به ترتیب اولویت کاهشی فهرست شدهاند):
- + - ! ~ ++ --
- مثبت/منفی یگانی، NOT منطقی، متمم، {پیش،پس}{افزایش،کاهش}
- << >>
- شیفت بیتی به چپ، راست
- &
- AND بیتی
- ^
- XOR بیتی
- |
- OR بیتی
- **
- به توان رساندن
- * / %
- ضرب، تقسیم، باقیمانده (پیمانه)
- + -
- جمع، تفریق
- < > <= >=
- مقایسه
- == !=
- برابری و نابرابری.TP && AND منطقی
- || ^^
- OR و XOR منطقی
- ? :
- عملگر سهتایی
- = += -= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=
- انتساب
- ,
- عملگر کاما
عملگرهای `&&'، `||'، `&&=' و `||=' از نوع اتصالکوتاه (short-circuiting) هستند و در عملگر سهتایی تنها یکی از دو عبارت پسین ارزیابی میشود. به اولویت عملگرهای بیتی AND، OR و XOR دقت کنید.
با گزینهٔ C_PRECEDENCES اولویتها (و نه دیگر ویژگیهای) عملگرها تغییر یافته و مشابه بیشتر زبانهای دیگری میشود که از عملگرهای مربوطه پشتیبانی میکنند:
- + - ! ~ ++ --
- مثبت/منفی یکانی، NOT منطقی، متمم، {پیش،پس}{افزایش،کاهش}
- **
- توانرسانی
- * / %
- ضرب، تقسیم، باقیمانده (modulus)
- + -
- جمع، تفریق
- << >>
- شیفت بیتی به چپ، راست
- < > <= >=
- مقایسه
- == !=
- برابری و نابرابری
- &
- AND بیتی
- ^
- XOR بیتی
- |
- OR بیتی
- &&
- AND منطقی
- ^^
- XOR منطقی
- ||
- OR منطقی
- ? :
- عملگر سهتایی
- = += -= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=
- انتساب
- ,
- عملگر کاما
توجه داشته باشید که اولویت توانرسانی در هر دو حالت پایینتر از عملگرهای یکانی است؛ از این رو `-3**2' برابر با `9' ارزیابی میشود، نه `-9'. در صورت نیاز از پرانتز استفاده کنید: `-(3**2)'. این رفتار برای سازگاری با سایر شلها است.
توابع ریاضی را میتوان با نحو `func(args)' فراخوانی کرد، که در آن خود تابع تعیین میکند آیا args به عنوان یک رشته یا به عنوان فهرستی از عبارات حسابی جدا شده با کاما استفاده شود. در حال حاضر شل به طور پیشفرض هیچ تابع ریاضی تعریف نمیکند، اما ماژول zsh/mathfunc را میتوان با دستور توکار zmodload بارگذاری کرد تا توابع ریاضی استاندارد ممیز شناور را ارائه دهد.
عبارتی به شکل `##x' که در آن x هر دنبالهای از نویسهها مانند `a'، `^A' یا `\M-\C-x' است، مقدار این نویسه را میدهد و عبارتی به شکل `#name' مقدار نخستین نویسه از محتوای پارامتر name را برمیگرداند. مقادیر نویسهها مطابق با مجموعه نویسههای مورد استفاده در محلی (locale) جاری است؛ برای مدیریت نویسههای چندبایتی، گزینهٔ MULTIBYTE باید فعال باشد. توجه داشته باشید که این ساختار با `$#name' متفاوت است، که یک جایگزینی پارامتر استاندارد است و طول پارامتر name را برمیگرداند. عبارت `#\' به جای `##' پذیرفته میشود، اما استفاده از آن منسوخ شده است.
پارامترهای نامگذاریشده و آرایههای نمایهدار را میتوان بدون استفاده از نحو بسط پارامتر، با نام آنها درون یک عبارت حسابی مورد ارجاع قرار داد. برای مثال،
((val2 = val1 * 2))
دو برابر مقدار $val1 را به پارامتری با نام val2 انتساب میدهد.
نمایش داخلی عدد صحیح برای یک پارامتر نامگذاریشده را میتوان با دستور توکار integer مشخص کرد. ارزیابی حسابی بر روی مقدار هر انتساب به یک پارامتر نامگذاریشده که به این شکل به عنوان صحیح اعلان شده است، انجام میشود. انتساب یک عدد ممیز شناور به یک عدد صحیح منجر به گرد کردن به سمت صفر میشود.
به همین ترتیب، اعداد ممیز شناور را میتوان با دستور توکار float اعلان کرد؛ دو نوع وجود دارد که تنها در قالب خروجیشان متفاوتند، همانطور که برای دستور توکار typeset شرح داده شده است. قالب خروجی را میتوان با استفاده از جایگزینی حسابی به جای جایگزینی پارامتر دور زد، یعنی `${float}' از قالب تعریفشده استفاده میکند، اما `$((float))' از یک قالب عمومی ممیز شناور بهره میبرد.
ارتقای مقادیر عدد صحیح به ممیز شناور در صورت نیاز انجام میشود. علاوه بر این، اگر به هر عملگری که به عدد صحیح نیاز دارد (`&'، `|'، `^'، `<<'، `>>' و معادلهای انتسابی آنها) یک آرگومان ممیز شناور داده شود، مقدار به طور خودکار به سمت صفر گرد میشود، به جز برای `~' که به سمت پایین گرد میکند.
کاربران باید توجه داشته باشند که مانند بسیاری از زبانهای برنامهنویسی دیگر (اما برعکس نرمافزارهای طراحیشده برای محاسبات)، ارزیابی یک عبارت در zsh جزء به جزء انجام میشود و ارتقای اعداد صحیح به ممیز شناور در عباراتی که تنها حاوی اعداد صحیح هستند رخ نمیدهد. نتیجهٔ معمول این امر این است که تقسیمی مانند 6/8 بریده (truncated) میشود که در این حالت به سمت ۰ گرد میگردد. گزینهٔ شل FORCE_FLOAT را میتوان در اسکریپتها یا توابعی به کار برد که در سرتاسر آنها به ارزیابی ممیز شناور نیاز است.
متغیرهای نردهای (scalar) میتوانند در زمانهای مختلف مقادیر عدد صحیح یا ممیز شناور را در خود نگه دارند؛ در این حالت هیچ سابقهای از نوع عددی ذخیره نمیشود.
اگر متغیری برای نخستین بار در یک زمینهٔ عددی بدون اعلان قبلی مقداردهی شود، نوع آن به طور ضمنی integer یا float تعیین میشود و این نوع را تا زمانی که صریحاً تغییر یابد یا تا پایان حوزه (scope) حفظ میکند. این امر میتواند پیامدهای پیشبینینشدهای داشته باشد. برای مثال، در حلقهٔ
for (( f = 0; f < 1; f += 0.1 )); do # use $f done
اگر f از پیش اعلان نشده باشد، اولین انتساب باعث ایجاد آن به عنوان یک عدد صحیح میشود و در نتیجه عملیات `f += 0.1' همواره موجب بریده شدن نتیجه به صفر خواهد شد، به طوری که حلقه با شکست مواجه میشود. یک راهکار ساده این است که مقداردهی اولیه را به `f = 0.0' تغییر دهید. بنابراین بهتر است متغیرهای عددی با انواع صریح اعلان شوند. یک عبارت شرطی همراه با دستور مرکب [[ برای آزمایش مشخصههای فایلها و مقایسهٔ رشتهها به کار میرود. هر عبارت میتواند از یک یا چند مورد از عبارتهای یگانی یا دودویی زیر ساخته شود:
- -a file
- درست است اگر file وجود داشته باشد.
- -b file
- درست است اگر file وجود داشته باشد و یک فایل ویژهٔ بلوکی باشد.
- -c file
- درست است اگر file وجود داشته باشد و یک فایل ویژهٔ نویسهای باشد.
- -d file
- درست است اگر file وجود داشته باشد و یک دایرکتوری باشد.
- -e file
- درست است اگر file وجود داشته باشد.
- -f file
- درست است اگر file وجود داشته باشد و یک فایل عادی باشد.
- -g file
- درست است اگر file وجود داشته باشد و بیت setgid آن تنظیم شده باشد.
- -h file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین باشد.
- -k file
- درست است اگر file وجود داشته باشد و بیت sticky آن تنظیم شده باشد.
- -n string
- درست است اگر طول string غیرصفر باشد.
- -o option
- درست است اگر گزینهٔ option فعال باشد. option میتواند یک نویسهٔ تنها باشد، که در این صورت نام یک گزینهٔ تکحرفی است. (بخش `Specifying Options' را ببینید.)
هنگامی که هیچ گزینهای با نام option وجود نداشته باشد، و گزینهٔ POSIX_BUILTINS تنظیم نشده باشد، مقدار ۳ را همراه با یک هشدار بازمیگرداند. اگر آن گزینه تنظیم شده باشد، مقدار ۱ را بدون هیچ هشداری بازمیگرداند.
- -p file
- درست است اگر file وجود داشته باشد و یک فایل ویژهٔ FIFO (لولهٔ نامگذاریشده) باشد.
- -r file
- درست است اگر file وجود داشته باشد و توسط فرایند جاری قابل خواندن باشد.
- -s file
- درست است اگر file وجود داشته باشد و اندازهٔ آن بزرگتر از صفر باشد.
- -t fd
- درست است اگر توصیفگر فایل با شمارهٔ fd باز بوده و با یک دستگاه ترمینال مرتبط باشد. (نکته: fd اختیاری نیست)
- -u file
- درست است اگر file وجود داشته باشد و بیت setuid آن تنظیم شده باشد.
- -v varname
- درست است اگر متغیر پوستهٔ varname تنظیم شده باشد.
- -w file
- درست است اگر file وجود داشته باشد و توسط فرایند جاری قابل نوشتن باشد.
- -x file
- درست است اگر file وجود داشته باشد و توسط فرایند جاری قابل اجرا باشد. اگر file وجود داشته باشد و یک دایرکتوری باشد، به این معنی است که فرایند جاری اجازهٔ جستجو در آن دایرکتوری را دارد.
- -z string
- درست است اگر طول string صفر باشد.
- -L file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین باشد.
- -O file
- درست است اگر file وجود داشته باشد و متعلق به شناسهٔ کاربری مؤثر (effective UID) این فرایند باشد.
- -G file
- درست است اگر file وجود داشته باشد و گروه آن با شناسهٔ گروهی مؤثر (effective GID) این فرایند مطابقت داشته باشد.
- -S file
- درست است اگر file وجود داشته باشد و یک سوکت باشد.
- -N file
- درست است اگر file وجود داشته باشد و زمان دسترسی به آن، جدیدتر از زمان اصلاح آن نباشد.
- file1 -nt file2
- درست است اگر file1 وجود داشته باشد و از file2 جدیدتر باشد.
- file1 -ot file2
- درست است اگر file1 وجود داشته باشد و از file2 قدیمیتر باشد.
- file1 -ef file2
- درست است اگر file1 و file2 وجود داشته باشند و به همان فایل یکسان اشاره کنند.
- string = pattern
- string == pattern
- درست است اگر string با pattern مطابقت داشته باشد. این دو حالت دقیقاً معادل یکدیگرند. حالت `=' نحو سنتی پوسته است (و از این رو تنها حالتی است که عموماً به همراه دستورهای توکار test و [ استفاده میشود)؛ حالت `==' سازگاری با سایر زبانهای رایانهای را فراهم میآورد.
- string != pattern
- درست است اگر string با pattern مطابقت نداشته باشد.
- string =~ regexp
- درست است اگر string با عبارت باقاعدهٔ regexp مطابقت داشته باشد. اگر گزینهٔ RE_MATCH_PCRE تنظیم شده باشد، regexp به عنوان یک عبارت باقاعدهٔ PCRE با استفاده از ماژول zsh/pcre ارزیابی میشود، در غیر این صورت به عنوان یک عبارت باقاعدهٔ گسترشیافتهٔ POSIX با استفاده از ماژول zsh/regex ارزیابی میگردد. در صورت تطابق موفقیتآمیز، برخی متغیرها بهروزرسانی خواهند شد؛ اگر تطابق ناموفق باشد هیچ متغیری تغییر نمیکند.
اگر گزینهٔ BASH_REMATCH تنظیم نشده باشد، پارامتر اسکالر MATCH بر روی زیررشتهای که با الگو مطابقت یافته تنظیم میشود و پارامترهای صحیح MBEGIN و MEND به ترتیب روی اندیس شروع و پایان تطابق در string تنظیم میشوند، به طوری که اگر string در متغیر var ذخیره شده باشد، عبارت `${var[$MBEGIN,$MEND]}' دقیقاً همانند `$MATCH' خواهد بود. تنظیمات گزینهٔ KSH_ARRAYS رعایت میشود. به همین ترتیب، آرایهٔ match روی زیررشتههایی که با زیرعبارتهای پرانتزدار تطابق یافتهاند، و آرایههای mbegin و mend به ترتیب روی اندیسهای موقعیت آغاز و پایان زیررشتهها درون string تنظیم میشوند. اگر هیچ زیرعبارت پرانتزداری وجود نداشته باشد، این آرایهها مقداردهی نمیشوند. برای نمونه، اگر رشتهٔ `a short string' در برابر عبارت باقاعدهٔ `s(...)t' ارزیابی شود، آنگاه (با فرض اینکه گزینهٔ KSH_ARRAYS تنظیم نشده باشد) MATCH، MBEGIN و MEND به ترتیب برابر با `short'، 3 و 7 خواهند بود، در حالی که match، mbegin و mend آرایههای تکعضوی شامل رشتههای `hor'، `4' و `6' خواهند بود.
اگر گزینهٔ BASH_REMATCH تنظیم شده باشد، آرایهٔ BASH_REMATCH روی زیررشتهای که با الگو مطابقت کرده، و به دنبال آن زیررشتههایی که با زیرعبارتهای پرانتزدار درون الگو مطابقت یافتهاند، تنظیم میشود.
- string1 < string2
- درست است اگر string1 بر اساس مقدار ASCII نویسههایشان قبل از string2 بیاید.
- string1 > string2
- درست است اگر string1 بر اساس مقدار ASCII نویسههایشان بعد از string2 بیاید.
- exp1 -eq exp2
- درست است اگر exp1 از نظر عددی برابر با exp2 باشد. توجه داشته باشید که برای مقایسههای صرفاً عددی، استفاده از دستور توکار ((...)) که در بخش `ARITHMETIC EVALUATION' شرح داده شده، بسیار راحتتر از عبارتهای شرطی است.
- exp1 -ne exp2
- درست است اگر exp1 از نظر عددی با exp2 برابر نباشد.
- exp1 -lt exp2
- درست است اگر exp1 از نظر عددی کمتر از exp2 باشد.
- exp1 -gt exp2
- درست است اگر exp1 از نظر عددی بزرگتر از exp2 باشد.
- exp1 -le exp2
- درست است اگر exp1 از نظر عددی کمتر یا مساوی با exp2 باشد.
- exp1 -ge exp2
- درست است اگر exp1 از نظر عددی بزرگتر یا مساوی با exp2 باشد.
- ( exp )
- درست است اگر exp درست باشد.
- ! exp
- درست است اگر exp نادرست باشد.
- exp1 && exp2
- درست است اگر هر دو exp1 و exp2 درست باشند.
- exp1 || exp2
- درست است اگر دستکم یکی از exp1 یا exp2 درست باشد.
برای سازگاری، اگر تنها یک آرگومان وجود داشته باشد که از نظر نحوی عملگر خاصی نباشد، معمولاً یک متغیر، این شرط به عنوان آزمایشی برای این بررسی میشود که آیا عبارت به یک رشته با طول غیرصفر بسط مییابد یا خیر. به بیان دیگر، [[ $var ]] همانند [[ -n $var ]] است. توصیه میشود در صورت امکان، از شکل دوم که صریحتر است استفاده شود..PP بسط عادی شل روی آرگومانهای file، string و pattern انجام میشود، اما نتیجهٔ هر بسط، همانند اثر نقلقول دوگانه (double quotes)، محدود به یک کلمهٔ واحد است.
تولید نام فایل (Filename generation) روی هیچ شکلی از آرگومانها در شرطها اعمال نمیشود. با این حال، در هر حالتی که بسط عادی شل معتبر باشد و زمانی که گزینهٔ EXTENDED_GLOB فعال است، میتوان با استفاده از یک توصیفکنندهٔ صریح glob به شکل (#q) در انتهای رشته، آن را اجبار کرد. یک عبارت توصیفکنندهٔ عادی glob میتواند بین «q» و پرانتز بسته قرار گیرد؛ در صورتی که عبارتی درج نشود، این عبارت هیچ اثری فراتر از واداشتن به تولید نام فایل ندارد. نتایج تولید نام فایل همانند نتایج سایر اشکال بسط، برای تشکیل یک کلمهٔ واحد به یکدیگر میپیوندند.
این استفادهٔ ویژه از تولید نام فایل فقط با نحو [[ در دسترس است. اگر شرط درون دستورهای توکار [ یا test رخ دهد، عمل globbing به جای آن به عنوان بخشی از بسط عادی خط فرمان پیش از ارزیابی شرط انجام میشود. در این حالت ممکن است چندین کلمه تولید شود که به احتمال زیاد نحو دستور test را برهم میزند.
برای مثال،
[[ -n file*(#qN) ]]
تنها در صورتی وضعیت خروج صفر تولید میکند که حداقل یک فایل در دایرکتوری جاری با رشتهٔ «file» آغاز شود. توصیفکنندهٔ تطبیق الگوی N تضمین میکند که در صورت نبود فایلی منطبق، عبارت خالی باشد.
نویسههای عام الگو برای آرگومانهای pattern فعال هستند؛ الگوها همان مواردی هستند که برای تولید نام فایل استفاده میشوند، zshexpn(1) را ببینید، اما رفتار ویژهای برای «/» یا نقطههای ابتدایی وجود ندارد و هیچ توصیفکنندهٔ globای مجاز نیست.
در هر یک از عبارتهای فوق، اگر file به شکل «/dev/fd/n» باشد که در آن n یک عدد صحیح است، آزمایش روی فایل بازی اعمال میشود که شماره توصیفگر (descriptor) آن n است، حتی اگر سیستم زیرین از دایرکتوری /dev/fd پشتیبانی نکند.
در شکلهایی که مقایسهٔ عددی انجام میدهند، عبارتهای exp تحت بسط محاسباتی قرار میگیرند، گویی درون $((...)) محصور شدهاند.
برای مثال، عبارت زیر:
[[ ( -f foo || -f bar ) && $report = y* ]] && print File exists.
بررسی میکند که آیا فایل foo یا فایل bar وجود دارد یا خیر، و اگر چنین باشد، آیا مقدار پارامتر report با «y» آغاز میشود یا خیر؛ اگر کل شرط درست باشد، پیام «File exists.» چاپ میشود.
بسط توالیهای اعلان (EXPANSION OF PROMPT SEQUENCES)
توالیهای اعلان تحت نوع خاصی از بسط قرار میگیرند. این نوع بسط با استفاده از گزینهٔ -P در دستور توکار print نیز در دسترس است.
اگر گزینهٔ PROMPT_SUBST تنظیم شده باشد، رشتهٔ اعلان ابتدا تحت بسط پارامتر، جایگزینی دستور و بسط محاسباتی قرار میگیرد. zshexpn(1) را ببینید.
توالیهای گریز خاصی ممکن است در رشتهٔ اعلان شناسایی شوند.
اگر گزینهٔ PROMPT_BANG تنظیم شده باشد، نویسهٔ «!» در اعلان با شمارهٔ رویداد تاریخچهٔ جاری جایگزین میشود. در این حالت یک «!» لفظی میتواند به صورت «!!» نمایش داده شود.
اگر گزینهٔ PROMPT_PERCENT تنظیم شده باشد، توالیهای گریز خاصی که با «%» آغاز میشوند بسط مییابند. بسیاری از گریزها با یک نویسهٔ منفرد دنبال میشوند، هرچند برخی از آنها یک آرگومان عدد صحیح اختیاری میپذیرند که باید بین «%» و نویسهٔ بعدی توالی قرار گیرد. توالیهای گریز پیچیدهتری نیز برای ارائهٔ بسط شرطی موجود هستند.
گریزهای ساده اعلان (SIMPLE PROMPT ESCAPES)
نویسههای خاص (Special characters)
- %%
- یک «%».
- %)
- یک «)».
اطلاعات ورود به سیستم (Login information)
- %l
- خطی (tty) که کاربر به آن وارد شده است، بدون پیشوند «/dev/». اگر نام با «/dev/tty» آغاز شود، آن پیشوند حذف میشود.
- %M
- نام کامل میزبان ماشین.
- %m
- نام میزبان تا نخستین «.». یک عدد صحیح میتواند پس از «%» بیاید تا مشخص کند چه تعداد از مؤلفههای نام میزبان مورد نظر است. با یک عدد صحیح منفی، مؤلفههای انتهایی نام میزبان نمایش داده میشوند.
- %n
- $USERNAME.
- %y
- خطی (tty) که کاربر به آن وارد شده است، بدون پیشوند «/dev/». این مورد با نامهای «/dev/tty» رفتار ویژهای ندارد.
- %#
- اگر پوسته با دسترسی ممتاز اجرا شود یک «#»، و در غیر این صورت یک «%». معادل با «%(!.#.%%)». تعریف «ممتاز» (دارای دسترسی ویژه) برای این منظور بدین معناست که شناسهٔ کاربری مؤثر (effective user ID) صفر باشد، یا در صورت پشتیبانی از قابلیتهای POSIX.1e، حداقل یک قابلیت در بردار قابلیتهای مؤثر (Effective) یا ارثبر (Inheritable) فعال شده باشد.
- %?
- وضعیت بازگشتی آخرین دستور اجرا شده درست پیش از اعلان (prompt).
- %_
- وضعیت تجزیهکننده (parser)، یعنی ساختارهای پوسته (مانند «if» و «for») که در خط فرمان آغاز شدهاند. در صورت ارائهٔ یک عدد صحیح، به همان تعداد رشته چاپ خواهد شد؛ عدد صفر، منفی یا عدم تعیین عدد صحیح به معنای چاپ تمامی موارد موجود است. این قابلیت بیشترین کاربرد را در اعلانهای PS2 برای خطوط ادامهدار و PS4 برای اشکالزدایی با گزینهٔ XTRACE دارد؛ در حالت دوم بهصورت غیرتعاملی نیز کار خواهد کرد.
- %^
- وضعیت تجزیهکننده بهصورت معکوس. این مورد بهجز ترتیب رشتهها مشابه «%_» است. معمولاً در RPS2 به کار میرود.
- %d
- %/
- دایرکتوری کاری فعلی. اگر یک عدد صحیح به دنبال «%» بیاید، تعداد مؤلفههای انتهایی دایرکتوری کاری فعلی را برای نمایش مشخص میکند؛ صفر به معنای کل مسیر است. یک عدد صحیح منفی مؤلفههای ابتدایی را مشخص میکند، به عنوان مثال %-1d مؤلفهٔ نخست را مشخص میسازد.
- %~
- همانند %d و %/، اما اگر دایرکتوری کاری فعلی با $HOME آغاز شود، آن بخش با یک «~» جایگزین میشود. افزون بر این، اگر یک دایرکتوری نامگذاریشده پیشوند آن باشد، آن بخش با یک «~» و به دنبال آن نام دایرکتوری جایگزین میشود، اما تنها اگر نتیجه از مسیر کامل کوتاهتر باشد؛ بخشهای Dynamic و Static named directories را در zshexpn(1) ببینید.
- %e
- عمق ارزیابی فایل منبعشده (sourced) فعلی، تابع پوسته یا eval. هر بار که مقدار %N تنظیم شود یا به مقدار قبلی بازگردد، این مقدار به ترتیب افزایش یا کاهش مییابد. این مورد برای اشکالزدایی بهعنوان بخشی از $PS4 بسیار سودمند است.
- %h
- %!
- شمارهٔ رویداد تاریخچهٔ (history) فعلی.
- %i
- شمارهٔ خطی که در حال حاضر در اسکریپت، فایل منبعشده یا تابع پوستهٔ مشخصشده توسط %N در حال اجرا است. این مورد برای اشکالزدایی بهعنوان بخشی از $PS4 بیشترین کاربرد را دارد.
- %I
- شمارهٔ خطی که در حال حاضر در فایل %x در حال اجرا است. این شبیه به %i است، اما شمارهٔ خط همیشه شمارهٔ خط در فایلی است که کد در آن تعریف شده، حتی اگر کد یک تابع پوسته باشد.
- %j
- تعداد کارها (jobs).
- %L
- مقدار فعلی $SHLVL.
- %N
- نام اسکریپت، فایل منبعشده یا تابع پوستهای که zsh در حال حاضر اجرا میکند (هرکدام که اخیراً شروع شده باشد). اگر موردی وجود نداشته باشد، این معادل پارامتر $0 است. یک عدد صحیح میتواند پس از «%» بیاید تا تعداد مؤلفههای انتهایی مسیر را برای نمایش مشخص کند؛ صفر به معنای کل مسیر است. یک عدد صحیح منفی مؤلفههای ابتدایی را مشخص میکند.
- %x
- نام فایل حاوی کد منبعی که در حال حاضر در حال اجرا است. این مانند %N عمل میکند، با این تفاوت که بهجای نام توابع و دستورات eval، فایلی که در آن تعریف شدهاند نمایش داده میشود.
- %c
- %.
- %C
- مؤلفهٔ انتهایی دایرکتوری کاری فعلی. یک عدد صحیح میتواند پس از «%» بیاید تا بیش از یک مؤلفه دریافت شود. به جز زمانی که از «%C» استفاده شود، ابتدا خلاصهسازی تیلدا انجام میگیرد. این توالیها منسوخ شدهاند زیرا %c و %C به ترتیب معادل %1~ و %1/ هستند، در حالی که اعداد صحیح مثبت صریح همان تأثیر دو توالی اخیر را دارند.
تاریخ و زمان (Date and time)
- %D
- تاریخ در قالب yy-mm-dd.
- %T
- زمان فعلی روز در قالب ۲۴ ساعته.
- %t
- %@
- زمان فعلی روز در قالب ۱۲ ساعته، به صورت am/pm.
- %*
- زمان فعلی روز در قالب ۲۴ ساعته، همراه با ثانیهها.
- %w
- تاریخ در قالب day-dd.
- %W
- تاریخ در قالب mm/dd/yy.
- %D{string}
- رشتهٔ string با استفاده از تابع strftime قالببندی میشود. برای جزئیات بیشتر به strftime(3) مراجعه کنید. افزونههای گوناگون zsh در صورتی که عدد تکرقمی باشد، اعدادی را بدون صفر یا فاصلهٔ ابتدایی ارائه میدهند:
- %f
- روزی از ماه
- %K
- ساعت روز بر اساس ساعت ۲۴ ساعته
- %L
- ساعت روز بر اساس ساعت ۱۲ ساعته
علاوه بر این، اگر سیستم از فراخوانی سیستمی POSIX gettimeofday پشتیبانی کند، %. کسرهای اعشاری ثانیه از مبدأ زمان (epoch) را به همراه صفرهای ابتدایی ارائه میدهد. بهطور پیشفرض سه رقم اعشار ارائه میشود، اما میتوان تا ۹ رقم را پس از % مشخص کرد؛ بنابراین %6. میکروثانیهها و %9. نانوثانیهها را در خروجی نمایش میدهد. (مورد اخیر نیازمند تابع clock_gettime با دقت نانوثانیه است؛ سیستمهایی که فاقد آن باشند، مقداری ضربشده در توان مناسبی از ۱۰ را بازمیگردانند). نمونهای معمول از این، قالب «%D{%H:%M:%S.%.}» است.
افزونهٔ گنو %N بهعنوان هممعنی %9. در نظر گرفته میشود.
علاوه بر این، افزونهٔ گنو مبنی بر اینکه قرار گرفتن یک «-» میان % و نویسهٔ قالب باعث حذف صفر یا فاصلهٔ ابتدایی میشود، برای نویسههای قالببندی d، f، H، k، l، m، M، S و y مستقیماً توسط پوسته مدیریت میشود؛ سایر نویسههای قالببندی با هر «-» ابتدایی موجود، به تابع strftime(3) سیستم ارسال میشوند، بنابراین رفتار آنها وابسته به سیستم است. افزونههای دیگر گنو (یا سایر افزونهها) نیز به strftime(3) ارسال میشوند و در صورت پشتیبانی سیستم ممکن است کار کنند.
- %B (%b)
- شروع (پایان) حالت برجسته (boldface).
- %E
- پاک کردن تا انتهای خط.
- %U (%u)
- شروع (پایان) حالت خط زیرین (underline).
- %S (%s)
- شروع (پایان) حالت برجستهنمایی (standout).
- %F (%f)
- شروع (پایان) استفاده از رنگ پیشزمینهٔ متفاوت، در صورت پشتیبانی توسط پایانه. رنگ را میتوان به دو روش مشخص کرد: یا بهصورت یک آرگومان عددی، طبق معمول، یا با یک دنباله درون آکولاد پس از %F، برای نمونه %F{red}. در حالت دوم مقادیر مجاز همانهایی هستند که برای صفت fg در zle_highlight شرح داده شده است؛ بخش برجستهسازی نویسه (Character Highlighting) در zshzle(1) را ببینید. این بدان معناست که رنگهای عددی در قالب دوم نیز مجاز هستند.
- %K (%k)
- شروع (پایان) استفاده از رنگ پسزمینهٔ متفاوت. نحو آن مشابه %F و %f است.
- %{...%}
- گنجاندن یک رشته به عنوان یک توالی گریز (escape sequence) دقیق. رشتهٔ درون آکولادها نباید موقعیت مکاننما را تغییر دهد. جفتهای آکولاد میتوانند بهصورت تودرتو باشند.
با یک آرگومان عددی مثبت بین % و { همانند آنچه در زیر برای %G شرح داده شده رفتار میشود.
- %G
- درون یک توالی %{...%}، گنجاندن یک «glitch»؛ یعنی فرض میشود که پهنای یک نویسهٔ منفرد خروجی داده خواهد شد. این در زمانی مفید است که نویسههایی خروجی داده میشوند که در غیر این صورت پوسته نمیتواند آنها را بهدرستی مدیریت کند، مانند مجموعه نویسههای جایگزین در برخی پایانهها. نویسههای مورد نظر را میتوان درون یک توالی %{...%} همراه با تعداد مناسبی از توالیهای %G گنجاند تا پهنای صحیح مشخص شود. یک عدد صحیح بین «%» و «G» نشاندهندهٔ پهنای نویسهای غیر از یک است. بنابراین %{seq%2G%} مقدار seq را خروجی میدهد و فرض میکند که پهنای دو نویسهٔ استاندارد را اشغال میکند.
استفادههای متعدد از %G به شیوهٔ بدیهی انباشته میشوند؛ موقعیت %G بیاهمیت است. اعداد صحیح منفی مدیریت نمیشوند.
توجه داشته باشید زمانی که کوتاهسازی اعلان استفاده میشود، توصیه میشود که خروجی در هر گروه %{...%} به نویسههای تکی تقسیم شود تا نقطهٔ کوتاهسازی صحیح پیدا شود.
زیررشتههای شرطی در اعلانها (CONDITIONAL SUBSTRINGS IN PROMPTS)
- %v
- مقدار نخستین عنصر از پارامتر آرایهای psvar. قرار دادن یک عدد صحیح پس از «%»، آن عنصر از آرایه را ارائه میدهد. اعداد صحیح منفی از انتهای آرایه شمارش میشوند.
- %(x.true-text.false-text)
- یک عبارت سهتایی را مشخص میکند. نویسهٔ پس از x دلخواه است؛ از همان نویسه برای جداسازی متنِ نتیجهٔ «درست» از نتیجهٔ «نادرست» استفاده میشود. این جداکننده نمیتواند در true-text ظاهر شود، مگر به عنوان بخشی از یک توالی گریز %-escape. یک «)» میتواند در false-text بهصورت «%)» ظاهر شود. هر دو true-text و false-text میتوانند شامل توالیهای گریز با تودرتویی دلخواه، از جمله عبارتهای سهتایی بیشتر باشند.
پرانتز چپ میتواند با یک عدد صحیح مثبت n پیشآیند یا پسآیند شود که پیشفرض آن صفر است. یک عدد صحیح منفی در -1 ضرب خواهد شد، مگر در حالتی که برای «l» در زیر ذکر شده است. نویسهٔ آزمون x میتواند هر یک از موارد زیر باشد:
- !
- درست است اگر پوسته با دسترسیهای ویژه (privileges) در حال اجرا باشد.
- #
- درست است اگر uid مؤثر فرایند فعلی برابر n باشد.
- ?
- درست است اگر وضعیت خروج آخرین دستور n باشد.
- _
- درست است اگر دستکم n سازهٔ پوسته شروع شده باشد.
- C
- /
- درست است اگر مسیر مطلق فعلی دستکم n عنصر نسبت به دایرکتوری ریشه داشته باشد؛ بنابراین / به عنوان ۰ عنصر شمرده میشود.
- c
- .
- ~
- درست است اگر مسیر فعلی، با جایگزینی پیشوند، دستکم n عنصر نسبت به دایرکتوری ریشه داشته باشد؛ بنابراین / به عنوان ۰ عنصر شمرده میشود.
- D
- درست است اگر ماه برابر با n باشد (ژانویه = ۰).
- d
- درست است اگر روز ماه برابر با n باشد.
- e
- درست است اگر عمق ارزیابی دستکم n باشد.
- g
- درست است اگر gid مؤثر فرایند فعلی برابر با n باشد.
- j
- درست است اگر تعداد کارها دستکم n باشد.
- L
- درست است اگر پارامتر SHLVL دستکم n باشد.
- l
- درست است اگر دستکم n نویسه قبلاً روی خط فعلی چاپ شده باشد. هنگامی که n منفی است، درست است اگر دستکم abs(n) نویسه پیش از حاشیهٔ مقابل باقی مانده باشد (بنابراین حاشیهٔ چپ برای RPROMPT).
- S
- درست است اگر پارامتر SECONDS دستکم n باشد.
- T
- درست است اگر زمان بر حسب ساعت برابر با n باشد.
- t
- درست است اگر زمان بر حسب دقیقه برابر با n باشد.
- v
- درست است اگر آرایهٔ psvar دستکم n عنصر داشته باشد.
- V
- درست است اگر عنصر n از آرایهٔ psvar تنظیم شده و غیرخالی باشد.
- w
- درست است اگر روز هفته برابر با n باشد (یکشنبه = ۰).
- %<string<
- %>string>
- %[xstring]
- رفتار کوتاهسازی را برای باقیماندهٔ رشتهٔ اعلان مشخص میکند. قالب سوم که منسوخ شده است، معادل با «%xstringx» است، یعنی x میتواند «<» یا «>» باشد. مقدار string به جای بخش بریدهشده از هر رشته نمایش داده خواهد شد؛ توجه داشته باشید که این رشته تحت بسط اعلان قرار نمیگیرد.
آرگومان عددی، که در حالت سوم میتواند بلافاصله پس از «[» ظاهر شود، حداکثر طول مجاز رشتههای مختلفی را که میتوانند در اعلان نمایش داده شوند، مشخص میکند. در دو حالت نخست، این آرگومان عددی میتواند منفی باشد، که در این حالت طول کوتاهسازی با کم کردن مقدار مطلق آرگومان عددی از تعداد موقعیتهای نویسهٔ باقیمانده روی خط اعلان فعلی تعیین میشود. اگر این کار منجر به یک طول صفر یا منفی شود، طول ۱ استفاده میشود. به عبارت دیگر، یک آرگومان منفی ترتیبی میدهد که پس از کوتاهسازی، دستکم n نویسه پیش از حاشیهٔ راست (حاشیهٔ چپ برای RPROMPT) باقی بماند.
قالبهای دارای «<» از سمت چپ رشته کوتاه میکنند، و قالبهای دارای «>» از سمت راست رشته کوتاه میکنند. برای نمونه، اگر دایرکتوری فعلی «/home/pike» باشد، اعلان «%8<..<%/» به «..e/pike» بسط مییابد. در این رشته، نویسهٔ پایانی («<»، «>» یا «]»)، یا در واقع هر نویسهای، میتواند توسط یک «\» پیش از آن نقلقول شود؛ با این حال توجه داشته باشید که هنگام استفاده از print -P، این کار باید دو بار تکرار شود زیرا علاوه بر هر بکاسلشی که توسط یک رشته در گیومهٔ دوتایی حذف میشود، رشته مشمول پردازش استاندارد print نیز میشود: بنابراین بدترین حالت «print -P "%<\\\\<<..."» است.
اگر string از طول کوتاهسازی مشخصشده طولانیتر باشد، بهطور کامل ظاهر میشود و رشتهٔ بریدهشده را بهطور کامل جایگزین میکند..PP بخشی از رشتهٔ اعلان که قرار است کوتاه شود، تا انتهای رشته، یا تا انتهای گروه دربرگیرندهٔ بعدی در ساختار `%('، یا تا کوتاهسازی بعدی که در همان سطح گروهبندی با آن مواجه میشویم (یعنی کوتاهسازیهای درون یک `%(' مجزا هستند)، هر کدام که زودتر باشد، ادامه مییابد. بهویژه، یک کوتاهسازی با آرگومان صفر (برای نمونه، `%<<')، پایان محدودهٔ رشتهای را که باید کوتاه شود مشخص کرده و کوتاهسازی را از آن نقطه به بعد خاموش میکند. برای مثال، اعلان `%10<...<%~%<<%# ' نمایش کوتاهشدهای از دایرکتوری جاری، و پس از آن یک `%' یا `#'، و سپس یک فاصله را چاپ میکند. بدون `%<<'، آن دو نویسه نیز در رشتهای که باید کوتاه شود گنجانده میشدند. توجه داشته باشید که `%-0<<' معادل `%<<' نیست، بلکه مشخص میکند که اعلان در حاشیهٔ راست کوتاه شود.
کوتاهسازی تنها درون هر خط مجزای اعلان، بهگونهای که با خطوط جدید تعبیهشده (در صورت وجود) مرزبندی شده باشد، اِعمال میشود. اگر طول کل هر خط از اعلان پس از کوتاهسازی بیشتر از عرض ترمینال باشد، یا اگر بخشی که قرار است کوتاه شود دارای خطوط جدید تعبیهشده باشد، رفتار کوتاهسازی تعریفنشده است و ممکن است در نسخههای آیندهٔ پوسته تغییر کند. از `%-n(l.true-text.false-text)' برای حذف بخشهایی از اعلان، هنگامی که فضای در دسترس کمتر از n باشد، استفاده کنید.
| July 12, 2026 | zsh 5.9.2 |