'\" t .\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "FISH-LANGUAGE" "1" "Sep 07, 2026" "4.9" "fish-shell" .SH "نام (NAME)" fish-language \- مرور جامع زبان اسکریپت‌نویسی پوسته فیش .sp این سند یک مرور جامع از زبان اسکریپت‌نویسی fish است\&. .sp برای ویژگی‌های تعاملی، «استفاده تعاملی» (Interactive use) \%<>\& را ببینید. .SH "مرور اجمالی نحو (SYNTAX OVERVIEW)" .sp پوسته‌هایی مانند fish با دادن دستورات به آن‌ها استفاده می‌شوند. یک دستور با نوشتن نام دستور و به دنبال آن هرگونه آرگومان اجرا می‌شود. به عنوان مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX echo hello world .EE .UNINDENT .UNINDENT .sp دستور echo \%<> آرگومان‌های خود را بر روی صفحه نمایش می‌نویسد. در این مثال، خروجی \fBhello world\fP\& است. .sp همه چیز در fish با دستورات انجام می‌شود. دستوراتی برای تکرار سایر دستورات، دستوراتی برای مقداردهی متغیرها، دستوراتی برای برخورد با گروهی از دستورات به عنوان یک دستور واحد و غیره وجود دارند. تمام این دستورات از همان نحو پایه پیروی می‌کنند. .sp هر برنامه‌ای در رایانه شما می‌تواند به عنوان یک دستور در fish استفاده شود. اگر فایل برنامه در یکی از مسیرهای متغیر محیطی \fBPATH\fP قرار داشته باشد، می‌توانید فقط نام برنامه را برای استفاده از آن تایپ کنید. در غیر این صورت، نام کامل فایل، شامل مسیر دایرکتوری (مانند \fB/home/me/code/checkers/checkers\fP یا \fB\&../checkers\fP) لازم است. .sp در اینجا فهرستی از برخی دستورات کاربردی آورده شده است: .INDENT 0.0 .IP \(bu 2 دستور cd \%<>: تغییر دایرکتوری جاری .IP \(bu 2 \fBls\fP: فهرست کردن فایل‌ها و دایرکتوری‌ها .IP \(bu 2 \fBman\fP: نمایش صفحه راهنما \- دستور \fBman ls\fP را برای دریافت راهنما درباره دستور \(dqls\(dq خود، یا \fBman mv\fP را برای کسب اطلاعات درباره \(dqmv\(dq امتحان کنید. .IP \(bu 2 \fBmv\fP: جابه‌جا کردن (تغییر نام) فایل‌ها .IP \(bu 2 \fBcp\fP: کپی کردن فایل‌ها .IP \(bu 2 دستور open \%<>: باز کردن فایل‌ها با برنامه پیش‌فرضی که به هر نوع فایل مرتبط است .IP \(bu 2 \fBless\fP: نمایش محتویات فایل‌ها .UNINDENT .sp دستورات و آرگومان‌ها با نویسه فاصله \fB\(aq \(aq\fP\& از یکدیگر جدا می‌شوند. هر دستور یا با یک خط جدید (با فشردن کلید اینتر/return) یا با نقطه\-ویرگول \fB;\fP\& پایان می‌یابد. با جدا کردن دستورات با نقطه\-ویرگول، می‌توان چندین دستور را در یک خط نوشت. .sp سوییچ (switch) یک نوع خاص و بسیار رایج از آرگومان است. سوییچ‌ها تقریباً همیشه با یک یا چند خط تیره \fB\-\fP شروع می‌شوند و شیوه عملکرد یک دستور را تغییر می‌دهند. به عنوان مثال، دستور \fBls\fP معمولاً نام تمام فایل‌ها و دایرکتوری‌های موجود در دایرکتوری کاری فعلی را فهرست می‌کند. با استفاده از سوییچ \fB\-l\fP، رفتار \fBls\fP تغییر می‌یابد تا نه تنها نام فایل، بلکه اندازه، مجوزها، مالک و زمان آخرین تغییر هر فایل را نیز نمایش دهد. .sp سوییچ‌ها در دستورات مختلف متفاوت هستند و معمولاً در صفحه راهنمای هر دستور مستند شده‌اند. با این حال، برخی از سوییچ‌ها برای اکثر دستورات مشترک هستند. به عنوان مثال، سوییچ \fB\-\-help\fP معمولاً یک متن راهنما را نمایش می‌دهد، \fB\-\-version\fP نسخه دستور را نمایش می‌دهد، و \fB\-i\fP اغلب اعلان تعاملی را پیش از انجام عملیات فعال می‌کند. دستور \fBman your\-command\-here\fP را امتحان کنید تا اطلاعاتی درباره سوییچ‌های دستور خود به دست آورید. .sp بنابراین ایده اصلی fish مشابه سایر پوسته‌های یونیکس است: یک خط فرمان دریافت می‌کند، بسط‌ها (expansions) را اجرا می‌کند، و سپس نتیجه را به عنوان یک دستور اجرا می‌نماید. .SH "اصطلاحات (TERMINOLOGY)" .sp در اینجا برخی از اصطلاحات استفاده‌شده در این صفحه و در سراسر سایر مستندات fish را تعریف می‌کنیم: .INDENT 0.0 .IP \(bu 2 \fBآرگومان (Argument)\fP: پارامتری که به یک دستور داده می‌شود. در \fBecho foo\fP، بخش \(dqfoo\(dq یک آرگومان است. .IP \(bu 2 \fBدستور توکار (Builtin)\fP: دستوری که توسط خود پوسته پیاده‌سازی شده است. دستورات توکار چنان با عملکرد پوسته گره خورده‌اند که پیاده‌سازی آن‌ها به عنوان دستورات خارجی غیرممکن است. در \fBecho foo\fP، بخش \(dqecho\(dq یک دستور توکار است. .IP \(bu 2 \fBدستور (Command)\fP: برنامه‌ای که پوسته می‌تواند اجرا کند، یا به طور خاص‌تر، یک برنامه خارجی که پوسته آن را در فرآیندی دیگر اجرا می‌کند. دستورات خارجی به صورت فایل‌های اجرایی روی سیستم شما ارائه می‌شوند. در \fBecho foo\fP بخش \(dqecho\(dq یک دستور توکار است، و در \fBcommand echo foo\fP بخش \(dqecho\(dq یک دستور خارجی است که توسط فایلی مانند /bin/echo تأمین می‌شود. .IP \(bu 2 \fBتابع (Function)\fP: بلوکی از دستورات که می‌توان آن‌ها را به‌گونه‌ای فراخوانی کرد که گویی یک دستور واحد هستند. با استفاده از توابع، می‌توان چندین دستور ساده را به یک دستور پیشرفته‌تر متصل کرد. .IP \(bu 2 \fBکار (Job)\fP: یک پایپ‌لاین یا دستورِ در حال اجرا. .IP \(bu 2 \fBپایپ‌لاین (Pipeline)\fP: مجموعه‌ای از دستوراتِ متصل‌به‌هم به طوری که خروجی یک دستور، ورودی دستور بعدی باشد. عبارت \fBecho foo | grep foo\fP یک پایپ‌لاین است. .IP \(bu 2 \fBتغییرمسیر (Redirection)\fP: عملیاتی که یکی از جریان‌های ورودی یا خروجی مرتبط با یک کار را تغییر می‌دهد. .IP \(bu 2 \fBسوییچ (Switch)\fP یا \fBگزینه (Option)\fP: نوع خاصی از آرگومان که رفتار یک دستور را تغییر می‌دهد. یک سوییچ تقریباً همیشه با یک یا دو خط تیره شروع می‌شود. در \fBecho \-n foo\fP بخش \(dq\-n\(dq یک گزینه است. .UNINDENT .SH "نقل‌قول‌ها (QUOTES)" .sp گاهی می‌خواهید به یک دستور آرگومانی بدهید که حاوی نویسه‌های خاص برای fish است، مانند فاصله‌ها، \fB$\fP یا \fB*\fP\&. برای انجام این کار، می‌توانید از نقل‌قول‌ها (quotes) استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX rm \(dqmy file.txt\(dq .EE .UNINDENT .UNINDENT .sp تا فایلی به نام \fBmy file.txt\fP را حذف کند، به جای اینکه سعی کند دو فایل مجزا به نام‌های \fBmy\fP و \fBfile.txt\fP را حذف نماید\&. .sp پوسته fish دو نوع نقل‌قول را می‌شناسد: تکی (\fB\(aq\fP) و دوگانه (\fB\(dq\fP)، که هر دو کمی متفاوت عمل می‌کنند. .sp درون نقل‌قول‌های تکی، fish هیچ‌گونه بسطی (expansion) انجام نمی‌دهد. درون نقل‌قول‌های دوگانه، fish فقط بسط متغیر و جایگزینی دستور در قالب \fB$(command)\fP\& را انجام می‌دهد. هیچ نوع بسط دیگری (از جمله بسط آکولاد یا بسط پارامتر) انجام نمی‌شود، و توالی‌های گریز (به عنوان مثال، \fB\en\fP) نادیده گرفته می‌شوند. در داخل نقل‌قول‌ها، فاصله سفید برای جداسازی آرگومان‌ها استفاده نمی‌شود و این امکان را می‌دهد که آرگومان‌های نقل‌قول‌شده حاوی فاصله باشند. .sp تنها توالی‌های گریز معنی‌دار درون نقل‌قول‌های تکی، \fB\e\(aq\fP است که از نقل‌قول تکی گریز می‌زند و \fB\e\e\fP که از نماد بک‌اسلش گریز ایجاد می‌کند. تنها گریزهای معنی‌دار در نقل‌قول‌های دوگانه عبارتند از \fB\e\(dq\fP که از نقل‌قول دوگانه گریز می‌زند، \fB\e$\fP که از نویسه دلار گریز می‌زند، \fB\e\fP به همراه یک خط جدید که بک‌اسلش و خط جدید را حذف می‌کند، و \fB\e\e\fP که از نماد بک‌اسلش گریز ایجاد می‌کند. .sp نقل‌قول‌های تکی هیچ معنای خاصی در داخل نقل‌قول‌های دوگانه ندارند و برعکس. .sp مثال‌های بیشتر: .INDENT 0.0 .INDENT 3.5 .sp .EX grep \(aqenabled)$\(aq foo.txt .EE .UNINDENT .UNINDENT .sp خطوطی را که در \fBfoo.txt\fP به \fBenabled)\fP ختم می‌شوند جستجو می‌کند (نویسه \fB$\fP برای \fBgrep\fP خاص است: با انتهای خط مطابقت دارد). .INDENT 0.0 .INDENT 3.5 .sp .EX apt install \(dqpostgres\-*\(dq .EE .UNINDENT .UNINDENT .sp تمام بسته‌هایی را که نام آن‌ها با \(dqpostgres\-\(dq شروع می‌شود نصب می‌کند، به جای اینکه در دایرکتوری جاری به دنبال فایل‌هایی با نام \(dqpostgres\-something\(dq بگردد. .SH "نویسه‌های گریز (ESCAPING CHARACTERS)" .sp بعضی از نویسه‌ها را نمی‌توان مستقیماً در خط فرمان نوشت. برای این نویسه‌ها، توالی‌های به‌اصطلاح گریز (escape sequences) در نظر گرفته شده‌اند. این توالی‌ها عبارتند از: .INDENT 0.0 .IP \(bu 2 \fB\ea\fP نشان‌دهنده نویسه هشدار (alert / زنگ) است. .IP \(bu 2 \fB\ee\fP نشان‌دهنده نویسه گریز (escape) است. .IP \(bu 2 \fB\ef\fP نشان‌دهنده نویسه تعویض صفحه (form feed) است. .IP \(bu 2 \fB\en\fP نشان‌دهنده نویسه سطر جدید (newline) است. .IP \(bu 2 \fB\er\fP نشان‌دهنده نویسه بازگشت به ابتدای سطر (carriage return) است. .IP \(bu 2 \fB\et\fP نشان‌دهنده نویسه تب (tab) است. .IP \(bu 2 \fB\ev\fP نشان‌دهنده نویسه تب عمودی (vertical tab) است. .IP \(bu 2 \fB\exHH\fP یا \fB\eXHH\fP، که در آن \fBHH\fP یک عدد در مبنای ۱۶ (هگزادسیمال) است، نشان‌دهنده یک بایت داده با مقدار مشخص‌شده می‌باشد. به عنوان مثال، \fB\ex9\fP نویسه تب است. اگر از یک کدگذاری چندبایتی استفاده می‌کنید، این مورد می‌تواند برای وارد کردن رشته‌های نامعتبر استفاده شود. به طور معمول fish با کدگذاری ASCII یا UTF\-8 اجرا می‌شود، بنابراین هر مقداری تا \fB\eX7f\fP یک نویسه ASCII است. .IP \(bu 2 \fB\eooo\fP، که در آن \fBooo\fP یک عدد در مبنای ۸ (اکتال) است، نشان‌دهنده نویسه ASCII با مقدار مشخص‌شده می‌باشد. به عنوان مثال، \fB\e011\fP نویسه تب است. بالاترین مقدار مجاز \fB\e177\fP\& است. .IP \(bu 2 \fB\euXXXX\fP، که در آن \fBXXXX\fP یک عدد هگزادسیمال است، نشان‌دهنده نویسه ۱۶\-بیتی یونیکد با مقدار مشخص‌شده است. به عنوان مثال، \fB\eu9\fP نویسه تب است. .IP \(bu 2 \fB\eUXXXXXXXX\fP، که در آن \fBXXXXXXXX\fP یک عدد هگزادسیمال است، نشان‌دهنده نویسه ۳۲\-بیتی یونیکد با مقدار مشخص‌شده است. به عنوان مثال، \fB\eU9\fP نویسه تب است. بالاترین مقدار مجاز U10FFFF است. .IP \(bu 2 \fB\ecX\fP، که در آن \fBX\fP یک حرف از الفبا است، نشان‌دهنده توالی کنترلی ایجادشده با فشردن کلید کنترل و حرف مشخص‌شده است. به عنوان مثال، \fB\eci\fP نویسه تب است. کدهای کنترلی C0 را در ویکی‌پدیا ببینید: \% .UNINDENT .sp بعضی از نویسه‌ها برای پوسته معنای خاصی دارند. به عنوان مثال، آپاستروف \fB\(aq\fP بسط را غیرفعال می‌کند (بخش نقل‌قول‌ها را ببینید). برای اینکه به پوسته بگویید با این نویسه‌ها به صورت تحت‌اللفظی (literal) رفتار کند، با یک بک‌اسلش از آن‌ها گریز بزنید. به عنوان مثال، دستور: .INDENT 0.0 .INDENT 3.5 .sp .EX echo \e\(aqhello world\e\(aq .EE .UNINDENT .UNINDENT .sp عبارت \fB\(aqhello world\(aq\fP را خروجی می‌دهد (شامل آپاستروف‌ها)، در حالی که دستور: .INDENT 0.0 .INDENT 3.5 .sp .EX echo \(aqhello world\(aq .EE .UNINDENT .UNINDENT .sp عبارت \fBhello world\fP را خروجی می‌دهد (بدون آپاستروف‌ها). در حالت اول، پوسته با آپاستروف‌ها به عنوان نویسه‌های واقعی و تحت‌اللفظی \fB\(aq\fP رفتار می‌کند، در حالی که در حالت دوم با آن‌ها به عنوان اصلاح‌کننده‌های خاص بسط رفتار می‌نماید. .sp نویسه‌های خاص و توالی‌های گریز آن‌ها عبارتند از: .INDENT 0.0 .IP \(bu 2 \fB\e\ \fP (بک‌اسلش و فاصله) از نویسه فاصله گریز می‌زند. این کار مانع از آن می‌شود که پوسته آرگومان‌ها را در محل فاصلهٔ گریز‌خورده تقسیم کند. .IP \(bu 2 \fB\e$\fP از نویسه دلار گریز می‌زند. .IP \(bu 2 \fB\e\e\fP از نویسه بک‌اسلش گریز می‌زند. .IP \(bu 2 \fB\e*\fP از نویسه ستاره گریز می‌زند. .IP \(bu 2 \fB\e?\fP از نویسه علامت سؤال گریز می‌زند (اگر پرچم ویژگی \fBqmark\-noglob\fP فعال باشد، این کار لازم نیست). .IP \(bu 2 \fB\e~\fP از نویسه تیلده گریز می‌زند. .IP \(bu 2 \fB\e#\fP از نویسه هشتگ/شارپ گریز می‌زند. .IP \(bu 2 \fB\e(\fP از نویسه پرانتز باز گریز می‌زند. .IP \(bu 2 \fB\e)\fP از نویسه پرانتز بسته گریز می‌زند. .IP \(bu 2 \fB\e{\fP از نویسه آکولاد باز گریز می‌زند. .IP \(bu 2 \fB\e}\fP از نویسه آکولاد بسته گریز می‌زند. .IP \(bu 2 \fB\e[\fP از نویسه قلاب/براکت باز گریز می‌زند. .IP \(bu 2 \fB\e]\fP از نویسه قلاب/براکت بسته گریز می‌زند. .IP \(bu 2 \fB\e<\fP از نویسه کوچکتری گریز می‌زند. .IP \(bu 2 \fB\e>\fP از نویسه بزرگتری گریز می‌زند. .IP \(bu 2 \fB\e&\fP از نویسه امپرسند گریز می‌زند. .IP \(bu 2 \fB\e|\fP از نویسه خط عمودی (پایپ) گریز می‌زند. .IP \(bu 2 \fB\e;\fP از نویسه نقطه\-ویرگول گریز می‌زند. .IP \(bu 2 \fB\e\(dq\fP از نویسه نقل‌قول دوگانه گریز می‌زند. .IP \(bu 2 \fB\e\(aq\fP از نویسه آپاستروف (نقل‌قول تکی) گریز می‌زند. .UNINDENT .sp به عنوان یک حالت خاص، اگر بلافاصله پس از \fB\e\fP یک خط جدید واقعی بیاید، این یک «ادامه‌دهنده» (\(dqcontinuation\(dq) است و به fish می‌گوید که شکست خط را نادیده بگیرد و دریافت ورودی را از ابتدای خط بعدی از سر بگیرد (بدون ایجاد هیچ فاصله سفید یا پایان دادن به یک توکن). .SH "تغییرمسیر ورودی/خروجی (INPUT/OUTPUT REDIRECTION)" .sp اکثر برنامه‌ها از سه جریان ورودی/خروجی (I/O) استفاده می‌کنند: .INDENT 0.0 .IP \(bu 2 ورودی استاندارد (stdin) برای خواندن. به طور پیش‌فرض از صفحه‌کلید خوانده می‌شود. .IP \(bu 2 خروجی استاندارد (stdout) برای نوشتن خروجی. به طور پیش‌فرض روی صفحه نمایش نوشته می‌شود. .IP \(bu 2 خطای استاندارد (stderr) برای نوشتن خطاها و هشدارها. به طور پیش‌فرض روی صفحه نمایش نوشته می‌شود. .UNINDENT .sp هر جریان دارای عددی به نام توصیف‌گر فایل (File Descriptor یا FD) است: ۰ برای stdin، ۱ برای stdout و ۲ برای stderr. .sp مقصد یک جریان را می‌توان با استفاده از چیزی به نام \fIتغییرمسیر\fP (redirection)\& تغییر داد. به عنوان مثال، \fBecho hello > output.txt\fP خروجی استاندارد دستور \fBecho\fP را به یک فایل متنی تغییرمسیر می‌دهد. .INDENT 0.0 .IP \(bu 2 برای خواندن ورودی استاندارد از یک فایل، از \fBDESTINATION\fP\& استفاده کنید. .IP \(bu 2 برای نوشتن خطای استاندارد در یک فایل، از \fB2>DESTINATION\fP\& استفاده کنید. [1] .IP \(bu 2 برای الحاق (ضمیمه کردن) خروجی استاندارد به انتهای یک فایل، از \fB>>DESTINATION_FILE\fP\& استفاده کنید. .IP \(bu 2 برای الحاق خطای استاندارد به انتهای یک فایل، از \fB2>>DESTINATION_FILE\fP\& استفاده کنید. .IP \(bu 2 برای بازنویسی نشدن (\(dqclobber\(dq نشدن) یک فایل موجود، از \fB>?DESTINATION\fP یا \fB2>?DESTINATION\fP\& استفاده کنید. این تغییرمسیر به عنوان \(dqnoclobber\(dq شناخته می‌شود. .UNINDENT .sp مقدار \fBDESTINATION\fP می‌تواند یکی از موارد زیر باشد: .INDENT 0.0 .IP \(bu 2 یک نام فایل برای نوشتن خروجی در آن. اغلب \fB>/dev/null\fP برای بی‌صدا کردن خروجی با نوشتن آن در فایل ویژه چاهک داده (\(dqsinkhole\(dq). .IP \(bu 2 یک امپرسند (\fB&\fP) به همراه شماره یک توصیف‌گر فایل دیگر مانند \fB&2\fP برای خطای استاندارد. خروجی در توصیف‌گر مقصد نوشته خواهد شد. .IP \(bu 2 یک امپرسند به همراه یک علامت منفی (\fB&\-\fP). توصیف‌گر فایل بسته خواهد شد. توجه: این کار ممکن است باعث شکست برنامه شود زیرا عملیات نوشتن آن ناموفق خواهد بود. .UNINDENT .sp جهت سهولت، می‌توان از تغییرمسیر \fB&>\fP برای هدایت همزمان stdout و stderr به یک مقصد واحد استفاده کرد. به عنوان مثال، \fBecho hello &> all_output.txt\fP هر دو خروجی stdout و stderr را به فایل \fBall_output.txt\fP\& هدایت می‌کند. این معادل با دستور \fBecho hello > all_output.txt 2>&1\fP\& است. همچنین می‌توانید از \fB&>>\fP برای الحاق هر دو خروجی stdout و stderr به همان مقصد استفاده نمایید. .sp هر توصیف‌گر فایل دلخواه را می‌توان با افزودن شماره FD به عنوان پیشوند به تغییرمسیر، در عملیات تغییرمسیر استفاده کرد. .INDENT 0.0 .IP \(bu 2 برای تغییرمسیر ورودی توصیف‌گر N، از \fBNDESTINATION\fP\& استفاده کنید. .IP \(bu 2 برای الحاق خروجی توصیف‌گر N به یک فایل، از \fBN>>DESTINATION_FILE\fP\& استفاده کنید. .UNINDENT .sp توصیف‌گرهای فایل را نمی‌توان با تغییرمسیر ورودی \fB output.stderr # if $num doesn\(aqt contain a number, # this test will be false and print an error, # so by ignoring the error we can be sure that we\(aqre dealing # with a number in the \(dqif\(dq block: if test \(dq$num\(dq \-gt 2 2>/dev/null # do things with $num as a number greater than 2 else # do things if $num is <= 2 or not a number end # Save \(gamake\(gas output in a file: make &>/log # Redirections stack and can be used with blocks: begin echo stdout echo stderr >&2 # <\- this goes to stderr! end >/dev/null # ignore stdout, so this prints \(dqstderr\(dq # print all lines that include \(dqfoo\(dq from myfile, or nothing if it doesn\(aqt exist. string match \(aq*foo*\(aq | less .EE .UNINDENT .UNINDENT .sp تلاش می‌کند تا \fBfish\fP را بیلد کند، و هرگونه خطایی با استفاده از پیجر (صفحه‌بند) \fBless\fP نمایش داده خواهد شد. [2] .sp جهت سهولت، پایپ \fB&|\fP (و همچنین نام مستعار \fB|&\fP که توسط Bash نیز پشتیبانی می‌شود) هر دو خروجی‌های stdout و stderr را به همان فرآیند هدایت می‌کنند. .IP [2] 5 منظور از یک پیجر (\(dqpager\(dq) در اینجا برنامه‌ای است که خروجی را دریافت کرده و آن را صفحه‌بندی (\(dqpaginates\(dq) می‌کند. برنامه \fBless\fP فقط صفحه‌بندی انجام نمی‌دهد، بلکه امکان پیمایش دلخواه (حتی به عقب!) را نیز فراهم می‌سازد. .SH "ترکیب پایپ‌ها و تغییرمسیرها (COMBINING PIPES AND REDIRECTIONS)" .sp استفاده همزمان از چندین تغییرمسیر و یک پایپ امکان‌پذیر است. در این حالت، آن‌ها به این ترتیب خوانده می‌شوند: .INDENT 0.0 .IP 1. 3 ابتدا پایپ تنظیم می‌شود. .IP 2. 3 سپس تغییرمسیرها از چپ به راست ارزیابی می‌شوند. .UNINDENT .sp این نکته زمانی اهمیت پیدا می‌کند که تغییرمسیرها با نحو \fB&N\fP به توصیف‌گرهای فایل دیگر ارجاع دهند. وقتی می‌نویسید \fB>&2\fP، این کار stdout را به جایی که stderr \fIدر همان لحظه\fP\& به آن اشاره دارد هدایت می‌کند. .sp این تابع کمکی را در نظر بگیرید: .INDENT 0.0 .INDENT 3.5 .sp .EX # Make a function that prints something to stdout and stderr function print echo out echo err >&2 end .EE .UNINDENT .UNINDENT .sp اکنون چند حالت را بررسی می‌کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX # Redirect both stderr and stdout to less print 2>&1 | less # or print &| less # Show the \(dqout\(dq on stderr, silence the \(dqerr\(dq print >&2 2>/dev/null # Silence both print >/dev/null 2>&1 .EE .UNINDENT .UNINDENT .SH "کنترل کارها (JOB CONTROL)" .sp هنگامی که کاری را در fish آغاز می‌کنید، خود fish مکث خواهد کرد و کنترل ترمینال را به برنامه‌ای که به تازگی شروع کرده است می‌دهد. گاهی می‌خواهید به استفاده از خط فرمان ادامه دهید و کار در پس‌زمینه اجرا شود. برای ایجاد یک کار در پس‌زمینه، یک علامت امپرسند \fB&\fP را به انتهای دستور خود اضافه کنید. این کار به fish می‌گوید که آن کار را در پس‌زمینه اجرا کند. کارهای پس‌زمینه هنگام اجرای برنامه‌هایی که دارای رابط کاربری گرافیکی هستند بسیار مفیدند. .sp مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX emacs & .EE .UNINDENT .UNINDENT .sp ویرایشگر متن emacs را در پس‌زمینه راه‌اندازی می‌کند. می‌توان در صورت نیاز از دستور fg \%<> برای آوردن مجدد آن به پیش‌زمینه استفاده کرد. .sp اکثر برنامه‌ها به شما این امکان را می‌دهند که با فشردن \fBctrl\fP\-\fBz\fP (که با نام \fB^Z\fP نیز شناخته می‌شود)، اجرای برنامه را به حالت تعلیق درآورید و کنترل را به fish بازگردانید. پس از بازگشت به خط فرمان fish، می‌توانید برنامه‌های دیگر را شروع کرده و هر کاری که می‌خواهید انجام دهید. در صورت تمایل، می‌توانید با استفاده از دستور fg \%<> (پیش‌زمینه / foreground) به دستور معلق بازگردید. .sp اگر در عوض بخواهید یک کار معلق را به پس‌زمینه بفرستید، از دستور bg \%<> استفاده کنید. .sp برای دریافت فهرستی از تمام کارهای آغازشده فعلی، از دستور jobs \%<> استفاده کنید. این کارهای فهرست‌شده را می‌توان با دستور disown \%<> حذف کرد. .sp در حال حاضر، توابع را نمی‌توان در پس‌زمینه شروع کرد. توابعی که متوقف شده و سپس با استفاده از دستور bg \%<> در پس‌زمینه بازراه‌اندازی می‌شوند، به درستی اجرا نخواهند شد. .sp اگر پس از نویسه \fB&\fP یک نویسه غیرجداکننده بیاید، به عنوان عملگر پس‌زمینه تفسیر نمی‌شود. نویسه‌های جداکننده شامل فاصله سفید و نویسه‌های \fB;<>&|\fP\& هستند. .SH "توابع (FUNCTIONS)" .sp توابع، برنامه‌هایی هستند که با نحو پوسته \fBfish\fP نوشته می‌شوند. آن‌ها دستورات مختلف و آرگومان‌هایشان را تحت یک نام واحد گروه‌بندی می‌کنند. .sp برای نمونه، در اینجا یک تابع ساده برای فهرست کردن دایرکتوری‌ها آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX function ll ls \-l $argv end .EE .UNINDENT .UNINDENT .sp خط نخست به فیش می‌گوید تابعی به نام \fBll\fP تعریف کند تا بتوان با نوشتن \fBll\fP در خط فرمان از آن استفاده کرد. خط دوم به فیش می‌گوید هنگامی که \fBll\fP فراخوانی می‌شود، دستور \fBls \-l $argv\fP باید اجرا گردد. متغیر $argv یک متغیر از نوع فهرست است که همواره شامل تمامی آرگومان‌های ارسالی به تابع می‌باشد. در مثال بالا، این آرگومان‌ها به دستور \fBls\fP منتقل می‌شوند. کلمه \fBend\fP در خط سوم، تعریف تابع را پایان می‌دهد. .sp فراخوانی این تابع به صورت \fBll /tmp/\fP در نهایت منجر به اجرای دستور \fBls \-l /tmp/\fP خواهد شد که محتویات دایرکتوری /tmp را فهرست می‌کند. .sp این نوع از توابع با عنوان نام مستعار (alias) شناخته می‌شوند. .sp اعلان اعلان خط فرمان فیش (prompt) نیز در تابعی به نام fish_prompt \%<> تعریف شده است. این تابع زمانی که قرار است اعلان خط فرمان نمایش داده شود اجرا می‌گردد و خروجی آن، ظاهر اعلان را می‌سازد: .INDENT 0.0 .INDENT 3.5 .sp .EX function fish_prompt # A simple prompt. Displays the current directory # (which fish stores in the $PWD variable) # and then a user symbol \- a \(aq►\(aq for a normal user and a \(aq#\(aq for root. set \-l user_char \(aq►\(aq if fish_is_root_user set user_char \(aq#\(aq end echo (set_color yellow)$PWD (set_color purple)$user_char end .EE .UNINDENT .UNINDENT .sp برای ویرایش یک تابع می‌توانید از دستور funced \%<> و برای ذخیره آن از funcsave \%<> استفاده کنید. این کار تابع را در یک فایل تابعی ذخیره می‌کند تا فیش در صورت نیاز آن را به طور خودکار بارگذاری کند. .sp دستور توکار functions \%<> می‌تواند تعریف فعلی یک تابع را نمایش دهد (دستور type \%<> نیز در صورت دریافت نام تابع، تعریف آن را نشان می‌دهد). .sp برای اطلاعات بیشتر درباره توابع، به مستندات دستور توکار function \%<> مراجعه کنید. .SS "تعریف نام‌های مستعار (Defining aliases)" .sp یکی از رایج‌ترین کاربردهای توابع، تغییر اندک در رفتار یک دستور از پیش موجود است. برای نمونه، ممکن است بخواهید دستور \fBls\fP را به گونه‌ای بازتعریف کنید که خروجی را رنگی نمایش دهد. سوییچ فعال‌سازی رنگ‌ها در سیستم‌های گنو \fB\-\-color=auto\fP است. یک نام مستعار در پوشش دستور \fBls\fP ممکن است به این شکل باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX function ls command ls \-\-color=auto $argv end .EE .UNINDENT .UNINDENT .sp چند نکته مهم وجود دارد که باید در مورد نام‌های مستعار مد نظر قرار گیرند: .INDENT 0.0 .IP \(bu 2 همواره دقت کنید که متغیر $argv را به فهرست پارامترهای دستور پوشش‌داده‌شده اضافه کنید. این کار اطمینان حاصل می‌کند که اگر کاربر پارامترهای اضافی به تابع بدهد، آن پارامترها به دستور زیرین منتقل شوند. .IP \(bu 2 اگر نام مستعار با دستور پوشش‌داده‌شده هم‌نام باشد، باید قبل از فراخوانی برنامه، عبارت \fBcommand\fP را قرار دهید تا به فیش اعلام شود که تابع نباید خودش را صدا بزند، بلکه باید دستور اصلی با همان نام را اجرا کند. اگر این کار را فراموش کنید، تابع تا ابد خود را فراخوانی خواهد کرد (حلقه بی‌نهایت). معمولاً فیش آن‌قدر هوشمند است که این موضوع را تشخیص دهد و از تکرار آن خودداری کند. .UNINDENT .sp برای ساخت آسان تابعی با این ساختار، می‌توانید از دستور alias \%<> استفاده کنید. برخلاف سایر پوسته‌ها، این دستور صرفاً تابع می‌سازد \- فیش مفهوم مستقلی به نام «alias» ندارد؛ ما صرفاً این واژه را برای چنین توابع پوششی ساده‌ای به کار می‌بریم. دستور alias \%<> بلافاصله یک تابع ایجاد می‌کند. استفاده از \fBalias \-\-save\fP یا funcsave \%<> را در نظر داشته باشید تا تابع ایجادشده را در یک فایل بارگذاری خودکار ذخیره کنید، به جای اینکه هر بار نام مستعار را بازسازی نمایید. .sp به عنوان یک راهکار جایگزین، اختصارات abbreviations \%<#\:abbreviations> را امتحان کنید. این‌ها واژه‌هایی هستند که هنگام تایپ کردن بسط می‌یابند، نه اینکه توابع واقعی درون پوسته باشند. .SS "بارگذاری خودکار توابع (Autoloading functions)" .sp توابع را می‌توان در خط فرمان یا در یک فایل پیکربندی تعریف کرد، اما امکان بارگذاری خودکار آن‌ها نیز وجود دارد. این کار مزایایی به همراه دارد: .INDENT 0.0 .IP \(bu 2 تابع بارگذاری‌شده به طور خودکار در دسترس تمامی پوسته‌های در حال اجرا قرار می‌گیرد. .IP \(bu 2 در صورت تغییر تعریف تابع، تمام پوسته‌های در حال اجرا پس از مدتی نسخه تغییریافته را به صورت خودکار بارگذاری مجدد می‌کنند. .IP \(bu 2 زمان راه‌اندازی پوسته و میزان مصرف حافظه بهبود می‌یابد. .UNINDENT .sp هنگامی که فیش نیاز به بارگذاری یک تابع دارد، دایرکتوری‌های موجود در متغیر فهرستی \fB$fish_function_path\fP را برای یافتن فایلی با نام متشکل از نام تابع به علاوه پسوند \fB\&.fish\fP جستجو کرده و نخستین فایلی را که می‌یابد بارگذاری می‌کند. .sp برای نمونه اگر تلاش کنید چیزی به نام \fBbanana\fP را اجرا کنید، فیش تمامی دایرکتوری‌های موجود در $fish_function_path را برای یافتن فایلی به نام \fBbanana.fish\fP پیمایش کرده و اولین مورد را بارگذاری می‌کند. .sp به طور پیش‌فرض \fB$fish_function_path\fP شامل موارد زیر است: .INDENT 0.0 .IP \(bu 2 دایرکتوری برای نگهداری توابع اختصاصی کاربران، معمولاً \fB~/.config/fish/functions\fP (کنترل‌شده توسط متغیر محیطی \fBXDG_CONFIG_HOME\fP). .IP \(bu 2 دایرکتوری برای توابع عمومی تمام کاربران سیستم، معمولاً \fB/etc/fish/functions\fP (در اصل \fB$__fish_sysconfdir/functions\fP). .IP \(bu 2 دایرکتوری‌ها برای قرار دادن توابع اختصاصی نرم‌افزارهای دیگر. این دایرکتوری‌ها در زیرمجموعه \fB$__fish_user_data_dir\fP (معمولاً \fB~/.local/share/fish\fP، کنترل‌شده توسط متغیر محیطی \fBXDG_DATA_HOME\fP) و در متغیر محیطی \fBXDG_DATA_DIRS\fP درون زیردایرکتوری به نام \fBfish/vendor_functions.d\fP قرار دارند. مقدار پیش‌فرض برای \fBXDG_DATA_DIRS\fP معمولاً \fB/usr/share/fish/vendor_functions.d\fP و \fB/usr/local/share/fish/vendor_functions.d\fP است. .UNINDENT .sp اگر مطمئن نیستید، توابع شما احتمالاً متعلق به دایرکتوری \fB~/.config/fish/functions\fP هستند. .sp همان‌طور که توضیح دادیم، فایل‌های بارگذاری خودکار \fIبر اساس نام\fP لود می‌شوند؛ بنابراین با اینکه می‌توانید چندین تابع را درون یک فایل قرار دهید، آن فایل تنها زمانی به طور خودکار بارگذاری می‌شود که بخواهید تابعی هم‌نام با فایل را اجرا کنید. .sp بارگذاری خودکار برای گرداننده‌های رویداد (event handlers) نیز کار نخواهد کرد، زیرا فیش نمی‌تواند بداند که یک تابع قرار است هنگام وقوع یک رویداد اجرا شود، در حالی که هنوز آن تابع را بارگذاری نکرده است. برای اطلاعات بیشتر بخش گرداننده‌های رویداد را ببینید. .sp اگر فایلی با نام مناسب، تابع مورد نظر را تعریف نکند، فیش سایر فایل‌های بارگذاری خودکار را نخواهد خواند؛ بلکه به سراغ بررسی دستورات توکار و در نهایت دستورات خارجی می‌رود. این قابلیت امکان پوشش دادن (mask) تابعی را فراهم می‌کند که در ادامه مسیر $fish_function_path تعریف شده است؛ مثلاً زمانی که مدیر سیستم فایلی در /etc/fish/functions قرار داده که می‌خواهید آن را نادیده بگیرید. .sp اگر در حال توسعه برنامه‌ای دیگر هستید و می‌خواهید توابع فیش را برای آن نصب کنید، آن‌ها را در دایرکتوری توابع «تأمین‌کننده» (vendor) نصب نمایید. از آنجا که این مسیر در سیستم‌های مختلف متغیر است، می‌توانید با استفاده از \fBpkgconfig\fP و از طریق خروجی دستور \fBpkg\-config \-\-variable functionsdir fish\fP آن را پیدا کنید. سیستم نصب برنامه شما باید از مسیری سفارشی برای بازنویسی مسیر pkgconfig پشتیبانی کند تا توزیع‌کنندگان دیگر بتوانند به راحتی آن را تغییر دهند. .SH "توضیحات و کامنت‌ها (COMMENTS)" .sp هر چیزی که بعد از نویسه \fB#\fP تا انتهای خط قرار گیرد، کامنت محسوب می‌شود. این یعنی صرفاً برای بهره‌مندی خواننده متن است و فیش آن را نادیده می‌گیرد. .sp این قابلیت برای توضیح اینکه چه کاری و چرا انجام می‌دهید کاربردی است: .INDENT 0.0 .INDENT 3.5 .sp .EX function ls # The function is called ls, # so we have to explicitly call \(gacommand ls\(ga to avoid calling ourselves. command ls \-\-color=auto $argv end .EE .UNINDENT .UNINDENT .sp کامنت چندخطی در فیش وجود ندارد. اگر می‌خواهید کامنت را در چند خط امتداد دهید، ابتدای هر خط یک \fB#\fP بگذارید. .sp کامنت‌ها می‌توانند بعد از یک خط دستور نیز بیایند، مانند این نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-gx EDITOR emacs # I don\(aqt like vim. .EE .UNINDENT .UNINDENT .SH "شرط‌ها (CONDITIONS)" .sp پوسته فیش دارای دستورات توکاری است که امکان می‌دهند دستورات را تنها در صورت برآورده شدن معیاری خاص اجرا کنید: if \%<>، switch \%<>، and \%<> و or \%<>، و همچنین نحو آشنای &&/||. .SS "دستور if (The if statement)" .sp دستور if \%<> در صورتی که شرط برقرار (true) باشد، یک بلوک از دستورات را اجرا می‌کند. .sp مشابه دیگر پوسته‌ها، اما برخلاف زبان‌های برنامه‌نویسی معمولی که ممکن است بشناسید، شرط در اینجا یک \fIدستور\fP است. فیش آن دستور را اجرا می‌کند و چنانچه وضعیت خروج آن درست (یعنی 0) باشد، بلوک if اجرا خواهد شد. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX if test \-e /etc/os\-release cat /etc/os\-release end .EE .UNINDENT .UNINDENT .sp این مثال از دستور test \%<> استفاده می‌کند تا بررسی کند آیا فایل /etc/os\-release وجود دارد یا خیر. اگر وجود داشته باشد، دستور \fBcat\fP را اجرا می‌کند که محتوای آن را روی صفحه چاپ می‌نماید. .sp برخلاف پوسته‌های دیگر، دستور شرط بعد از نخستین کار (job) پایان می‌یابد و نیازی به واژه \fBthen\fP نیست. ترکیب‌کننده‌هایی مانند \fBand\fP و \fBor\fP شرط را بسط می‌دهند. .sp نمونه‌ای پیچیده‌تر به همراه جایگزینی دستور: .INDENT 0.0 .INDENT 3.5 .sp .EX if test \(dq$(uname)\(dq = Linux echo I like penguins end .EE .UNINDENT .UNINDENT .sp از آنجا که دستور \fBtest\fP می‌تواند برای آزمایش‌های گوناگونی به کار رود، قرار دادن متغیرها و جایگزینی‌های دستور درون نقل‌قول اهمیت بالایی دارد. اگر \fB$(uname)\fP درون نقل‌قول قرار نمی‌گرفت و دستور \fBuname\fP هیچ متنی چاپ نمی‌کرد، عبارت \fBtest = Linux\fP اجرا می‌شد که یک خطاست. .sp دستور \fBif\fP همچنین می‌تواند بندهای \fBelse if\fP همراه با شرط‌های تکمیلی و یک بند else \%<> بپذیرد که در صورت نادرست بودن تمام شرط‌های قبلی اجرا می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX if test \(dq$number\(dq \-gt 10 echo Your number was greater than 10 else if test \(dq$number\(dq \-gt 5 echo Your number was greater than 5 else if test \(dq$number\(dq \-gt 1 echo Your number was greater than 1 else echo Your number was smaller or equal to 1 end .EE .UNINDENT .UNINDENT .sp کلیدواژه not \%<> می‌تواند برای معکوس کردن وضعیت خروج به کار رود: .INDENT 0.0 .INDENT 3.5 .sp .EX # Check if the file contains the string \(dqfish\(dq anywhere. # This executes the \(gagrep\(ga command, which searches for a string, # and if it finds it returns a status of 0. # The \(ganot\(ga then turns 0 into 1 or anything else into 0. # The \(ga\-q\(ga switch stops it from printing any matches. if not grep \-q fish myanimals echo \(dqYou don\(aqt have fish!\(dq else echo \(dqYou have fish!\(dq end .EE .UNINDENT .UNINDENT .sp سایر مواردی که معمولاً در شرط‌های if استفاده می‌شوند: .INDENT 0.0 .IP \(bu 2 contains \%<> \- برای بررسی اینکه آیا یک فهرست شامل عنصری خاص هست یا خیر (\fBif contains \-\- /usr/bin $PATH\fP) .IP \(bu 2 string \%<> \- برای نمونه جهت تطبیق رشته‌ها (\fBif string match \-q \-\- \(aq*\-\(aq $arg\fP) .IP \(bu 2 path \%<> \- برای بررسی اینکه آیا مسیرهایی با معیارهای معین وجود دارند یا خیر (\fBif path is \-rf \-\- ~/.config/fish/config.fish\fP) .IP \(bu 2 type \%<> \- برای بررسی وجود یک دستور، تابع یا دستور توکار (\fBif type \-q git\fP) .UNINDENT .SS "دستور switch (The switch statement)" .sp دستور switch \%<> برای اجرای یکی از چند بلوک دستور بر اساس مقدار یک رشته به کار می‌رود. این دستور می‌تواند چندین بلوک case \%<> را بپذیرد که هنگام تطبیق رشته اجرا می‌شوند. این بلوک‌ها می‌توانند از الگوهای عام (wildcards) بهره ببرند. برای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX switch (uname) case Linux echo Hi Tux! case Darwin echo Hi Hexley! case DragonFly \(aq*BSD\(aq echo Hi Beastie! # this also works for FreeBSD and NetBSD case \(aq*\(aq echo Hi, stranger! end .EE .UNINDENT .UNINDENT .sp برخلاف برخی پوسته‌ها یا زبان‌های برنامه‌نویسی دیگر، پدیده سقوط (fallthrough) وجود ندارد \- اولین بلوک \fBcase\fP منطبق اجرا شده و سپس جریان کنترل از ساختار \fBswitch\fP خارج می‌شود. .SS "ترکیب‌کننده‌ها (\fBand\fP / \fBor\fP / \fB&&\fP / \fB||\fP) (Combiners)" .sp برای بررسی‌های ساده می‌توانید از ترکیب‌کننده‌ها استفاده کنید. دستور and \%<> یا \fB&&\fP در صورت موفقیت دستور اول، دستور دوم را اجرا می‌کند؛ در حالی که or \%<> یا \fB||\fP در صورت شکست دستور اول، دومی را اجرا می‌نمایند. برای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX # $XDG_CONFIG_HOME is a standard place to store configuration. # If it\(aqs not set applications should use ~/.config. set \-q XDG_CONFIG_HOME; and set \-l configdir $XDG_CONFIG_HOME or set \-l configdir ~/.config .EE .UNINDENT .UNINDENT .sp توجه داشته باشید که ترکیب‌کننده‌ها به صورت \fIتنبلی\fP (lazy evaluation) اجرا می‌شوند \- یعنی تنها بخشی که برای تعیین وضعیت نهایی لازم است اجرا می‌گردد. .sp مقایسه کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX if sleep 2; and false echo \(aqHow did I get here? This should be impossible\(aq end .EE .UNINDENT .UNINDENT .sp و: .INDENT 0.0 .INDENT 3.5 .sp .EX if false; and sleep 2 echo \(aqHow did I get here? This should be impossible\(aq end .EE .UNINDENT .UNINDENT .sp این دو دستور اساساً یک کار را انجام می‌دهند، اما حالت نخست ۲ ثانیه بیشتر طول می‌کشد زیرا دستور \fBsleep\fP همواره باید اجرا شود. .sp همچنین ممکن است حالتی داشته باشید که در آن توقف زودهنگام ضروری باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX if command \-sq foo; and foo .EE .UNINDENT .UNINDENT .sp اگر پردازش پس از پی بردن به اینکه دستور «foo» وجود ندارد ادامه می‌یافت، تلاش می‌کرد \fBfoo\fP را اجرا کند و با خطای یافت نشدن دستور مواجه می‌شد! .sp ترکیب‌کننده‌ها گام به گام اجرا می‌شوند، بنابراین ساخت زنجیره‌های طولانی از آن‌ها پیشنهاد نمی‌شود چون ممکن است رفتاری ناخواسته ایجاد کنند. این مثال را در نظر بگیرید: .INDENT 0.0 .INDENT 3.5 .sp .EX test \-e /etc/my.config or echo \(dqOH NO WE NEED A CONFIG FILE\(dq and return 1 .EE .UNINDENT .UNINDENT .sp این زنجیره حتی اگر \fBtest\fP هم موفق باشد، دستور \fBreturn 1\fP را اجرا خواهد کرد! علت آن است که فیش دستور \fBtest \-e /etc/my.config\fP را اجرا کرده، متغیر $status را روی 0 می‌گذارد، سپس از \fBecho\fP عبور می‌کند و $status همچنان 0 باقی می‌ماند، و در نهایت \fBreturn 1\fP را اجرا می‌کند چون $status هنوز 0 است. .sp بنابراین اگر شرط‌های پیچیده‌تری دارید یا می‌خواهید چند کار را پس از شکست یک دستور انجام دهید، استفاده از دستور if را مد نظر داشته باشید. در اینجا آن ساختار به این شکل خواهد بود: .INDENT 0.0 .INDENT 3.5 .sp .EX if not test \-e /etc/my.config echo \(dqOH NO WE NEED A CONFIG FILE\(dq return 1 end .EE .UNINDENT .UNINDENT .SH "حلقه‌ها و بلوک‌ها (LOOPS AND BLOCKS)" .sp مانند بیشتر زبان‌های برنامه‌نویسی، فیش نیز از حلقه‌های آشنای while \%<> و for \%<> برخوردار است. .sp حلقه \fBwhile\fP مانند یک if تکرارشونده عمل می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX while true echo Still running sleep 1 end .EE .UNINDENT .UNINDENT .sp این حلقه هر ثانیه عبارت «Still running» را چاپ می‌کند. می‌توانید با کلیدهای ترکیبی ctrl\-c آن را متوقف سازید. .sp حلقه‌های \fBfor\fP مانند دیگر پوسته‌ها عمل می‌کنند که بیشتر شبیه حلقه for در پایتون است تا زبان‌هایی مثل C: .INDENT 0.0 .INDENT 3.5 .sp .EX for file in * echo file: $file end .EE .UNINDENT .UNINDENT .sp این دستور تمام فایل‌های موجود در دایرکتوری جاری را چاپ می‌کند. بخش بعد از \fBin\fP فهرستی از آرگومان‌ها است، بنابراین می‌توانید از هر نوع بسطی در آنجا بهره ببرید: .INDENT 0.0 .INDENT 3.5 .sp .EX set moreanimals bird fox for animal in {cat,}fish dog $moreanimals echo I like the $animal end .EE .UNINDENT .UNINDENT .sp اگر به فهرستی از اعداد نیاز دارید، می‌توانید از دستور \fBseq\fP برای ساخت آن استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX for i in (seq 1 5) echo $i end .EE .UNINDENT .UNINDENT .sp دستور توکار break \%<> برای خروج از حلقه و continue \%<> برای رفتن به تکرار بعدی در دسترس هستند. .sp تغییرمسیرهای ورودی و خروجی (از جمله لوله‌ها و پایپ‌ها) را می‌توان روی حلقه‌ها نیز اعمال کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX while read \-l line echo line: $line end < file .EE .UNINDENT .UNINDENT .sp علاوه بر این، یک بلوک begin \%<> وجود دارد که صرفاً دستورات را با یکدیگر گروه‌بندی می‌کند تا بتوانید خروجی را به یک بلوک هدایت کرده یا بدون نیاز به تکرار، از یک دامنه متغیر جدید استفاده نمایید: .INDENT 0.0 .INDENT 3.5 .sp .EX begin set \-l foo bar # this variable will only be available in this block! end .EE .UNINDENT .UNINDENT .SH "بسط پارامترها (PARAMETER EXPANSION)" .sp هنگامی که یک خط فرمان به فیش داده می‌شود، پیش از ارسال پارامترها به دستور، آن‌ها را بسط می‌دهد. انواع گوناگونی از بسط وجود دارد: .INDENT 0.0 .IP \(bu 2 کاراکترهای عام (Wildcards)، برای ایجاد نام فایل‌ها از روی الگوها \- مانند \fB*.jpg\fP .IP \(bu 2 بسط متغیر، برای استفاده از مقدار یک متغیر \- مانند \fB$HOME\fP .IP \(bu 2 جایگزینی دستور، برای بهره‌گیری از خروجی یک دستور دیگر \- مانند \fB$(cat /path/to/file)\fP .IP \(bu 2 بسط آکولاد، برای نوشتن کوتاه‌تر فهرست‌هایی با پیشوندها یا پسوندهای مشترک \- مانند \fB{/usr,}/bin\fP .IP \(bu 2 بسط مدک (تیلد)، برای تبدیل علامت \fB~\fP در ابتدای مسیرها به مسیر دایرکتوری خانگی \- مانند \fB~/bin\fP .UNINDENT .sp بسط پارامترها به ۵۲۴۲۸۸ مورد محدود شده است. سیستم‌عامل برای تعداد آرگومان‌های هر دستور محدودیتی دارد و ۵۲۴۲۸۸ بسیار بالاتر از آن سقف است. این تدبیر برای جلوگیری از قفل شدن پوسته در اثر محاسبات بیهوده در نظر گرفته شده است. .SS "کاراکترهای عام (Wildcards (\(dqGlobbing\(dq))" .sp هنگامی که یک پارامتر حاوی ستاره فاقد نقل‌قول \fB*\fP یا علامت سؤال \fB?\fP باشد، فیش از آن به عنوان یک نویسه عام (wildcard) برای تطبیق فایل‌ها استفاده می‌کند. .INDENT 0.0 .IP \(bu 2 نویسه \fB*\fP با هر تعداد کاراکتر (از جمله صفر کاراکتر) در یک نام فایل، به جز \fB/\fP، تطبیق می‌یابد. .IP \(bu 2 نویسه \fB**\fP با هر تعداد کاراکتر (از جمله صفر) تطبیق یافته و همچنین به زیردایرکتوری‌ها وارد می‌شود. اگر \fB**\fP به تنهایی یک بخش مسیر باشد، برای سازگاری با سایر پوسته‌ها ممکن است با صفر بار تطبیق داده شود. .IP \(bu 2 علامت \fB?\fP می‌تواند با هر کاراکتر منفردی به جز \fB/\fP مطابقت یابد. این رفتار منسوخ شده و می‌توان از طریق فلگ ویژگی \fBqmark\-noglob\fP آن را غیرفعال کرد تا \fB?\fP یک نویسه معمولی در نظر گرفته شود. .UNINDENT .sp تطبیق‌های نویسه‌های عام بدون حساسیت به بزرگی و کوچکی حروف مرتب می‌شوند. در هنگام مرتب‌سازی مواردی که حاوی عدد هستند، مرتب‌سازی به صورت طبیعی صورت می‌گیرد؛ به گونه‌ای که رشته‌های «1»، «5» و «12» مانند اعداد ۱، ۵ و ۱۲ مرتب می‌شوند. .sp فایل‌های مخفی (آن‌هایی که نامشان با یک نقطه آغاز می‌شود) در تطبیق عام در نظر گرفته نمی‌شوند مگر آنکه رشته الگوی عام، در آن موقعیت دارای نقطه باشد. .sp نویسه‌های عام هرگز به \fB\&.\fP (دایرکتوری جاری) یا \fB\&..\fP (دایرکتوری والد) بسط نمی‌یابند. .sp مثال‌ها: .INDENT 0.0 .IP \(bu 2 الگوی \fBa*\fP با تمامی فایل‌هایی که با «a» در دایرکتوری جاری آغاز می‌شوند تطبیق می‌یابد. .IP \(bu 2 الگوی \fB**\fP با تمام فایل‌ها و دایرکتوری‌های درون دایرکتوری جاری و تمامی زیردایرکتوری‌های آن مطابقت دارد. .IP \(bu 2 الگوی \fB~/.*\fP با تمامی فایل‌های مخفی (dotfiles) و دایرکتوری‌های موجود در دایرکتوری خانگی شما تطبیق پیدا می‌کند. .UNINDENT .sp در اکثر دستورات، چنانچه بسط یک الگوی عام شکست بخورد، دستور اجرا نمی‌شود، متغیر $status روی مقداری غیر از صفر تنظیم شده و یک هشدار چاپ می‌گردد. این رفتار شبیه قابلیتی است که در bash با دستور \fBshopt \-s failglob\fP فراهم می‌شود. استثنائاتی وجود دارد، از جمله دستورات set \%<> و path \%<>، بازنویسی متغیرها در overrides، دستور count \%<> و حلقه for \%<>\&. الگوهای عام این دستورات در صورت عدم تطبیق به صفر آرگومان بسط می‌یابند (بنابراین دستور اصلاً آن‌ها را نمی‌بیند)، شبیه رفتار \fBshopt \-s nullglob\fP در بش. .sp مثال‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX # List the .foo files, or warns if there aren\(aqt any. ls *.foo # List the .foo files, if any. set foos *.foo if count $foos >/dev/null ls $foos end .EE .UNINDENT .UNINDENT .sp برخلاف رفتار پیش‌فرض bash، فیش در صورت عدم یافتن تطبیق، کاراکتر عام را به همان شکل لفظی عبور نمی‌دهد؛ بنابراین برای دستوری مانند \fBapt install\fP که خود وظیفه تطبیق الگو را بر عهده دارد، باید از نقل‌قول استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX apt install \(dqncurses\-*\(dq .EE .UNINDENT .UNINDENT .SS "بسط متغیرها (Variable expansion)" .sp یکی از مهم‌ترین بسط‌ها در فیش، «بسط متغیر» است. این عمل شامل جایگزینی علامت دلار (\fB$\fP) به دنبال نام متغیر، با \fIمقدار\fP آن متغیر می‌باشد. .sp یک مثال ساده: .INDENT 0.0 .INDENT 3.5 .sp .EX echo $HOME .EE .UNINDENT .UNINDENT .sp این دستور \fB$HOME\fP را با دایرکتوری خانگی کاربر جاری جایگزین کرده و آن را به دستور echo \%<> ارسال می‌کند تا چاپ شود. .sp برخی متغیرها مانند \fB$HOME\fP از پیش مقداردهی شده‌اند زیرا فیش آن‌ها را به صورت پیش‌فرض تنظیم می‌کند یا فرآیند والد هنگام راه‌اندازی فیش، آن‌ها را منتقل کرده است. شما می‌توانید متغیرهای اختصاصی خود را با دستور set \%<> مقداردهی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX set my_directory /home/cooluser/mystuff ls $my_directory # shows the contents of /home/cooluser/mystuff .EE .UNINDENT .UNINDENT .sp برای آگاهی بیشتر از نحوه مقداردهی متغیرها، به بخش متغیرهای پوسته و بخش‌های پس از آن مراجعه کنید. .sp گاهی یک متغیر مقداری ندارد چون تعریف نشده یا خالی است؛ در این صورت به هیچ چیز بسط نمی‌یابد: .INDENT 0.0 .INDENT 3.5 .sp .EX echo $nonexistentvariable # Prints no output. .EE .UNINDENT .UNINDENT .sp برای جداسازی نام یک متغیر از متن، می‌توانید متغیر را درون نقل‌قول دوتایی یا آکولاد محصور کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX set WORD cat echo The plural of $WORD is \(dq$WORD\(dqs # Prints \(dqThe plural of cat is cats\(dq because $WORD is set to \(dqcat\(dq. echo The plural of $WORD is {$WORD}s # ditto .EE .UNINDENT .UNINDENT .sp بدون نقل‌قول یا آکولاد، فیش تلاش می‌کند متغیری به نام \fB$WORDs\fP را بسط دهد که ممکن است وجود نداشته باشد. .sp نحو دوم یعنی \fB{$WORD}\fP حالت خاصی از بسط آکولاد است. .sp اگر متغیر $WORD در اینجا تعریف نشده باشد یا یک فهرست خالی باشد، حرف «s» چاپ نمی‌شود. با این حال اگر $WORD رشته خالی باشد (مانند پس از اجرای \fBset WORD \(dq\(dq\fP)، حرف «s» چاپ خواهد شد. .sp برای کسب اطلاعات بیشتر درباره متغیرهای پوسته، بخش متغیرهای پوسته را مطالعه فرمایید. .SS "نقل‌قول کردن متغیرها (Quoting variables)" .sp بسط متغیرها در رشته‌های داخل نقل‌قول دوتایی نیز صورت می‌گیرد. درون نقل‌قول دوتایی (\fB\(dqاین‌ها\(dq\fP)، متغیرها همواره دقیقاً به یک آرگومان بسط می‌یابند. اگر خالی یا تعریف‌نشده باشند، نتیجه یک رشته خالی خواهد بود. اگر یک عنصر داشته باشند، به همان یک عنصر بسط پیدا می‌کنند. چنانچه بیش از یک عنصر داشته باشند، عناصر با فاصله (space) به هم متصل می‌شوند مگر اینکه متغیر یک متغیر مسیر (path variable) باشد که در آن صورت به جای فاصله از دونقطه (\fB:\fP) استفاده می‌گردد [3]\&. .sp متغیرهای فیش همگی فهرست هستند و هنگام \fIمقداردهی\fP به عناصر تفکیک می‌شوند \- این بدان معناست که تصمیم‌گیری در مورد استفاده یا عدم استفاده از نقل‌قول همراه با دستور set \%<> بسیار مهم است: .INDENT 0.0 .INDENT 3.5 .sp .EX set foo 1 2 3 # a variable with three elements rm $foo # runs the equivalent of \(garm 1 2 3\(ga \- trying to delete three files: 1, 2 and 3. rm \(dq$foo\(dq # runs \(garm \(aq1 2 3\(aq\(ga \- trying to delete one file called \(aq1 2 3\(aq set foo # an empty variable rm $foo # runs \(garm\(ga without arguments rm \(dq$foo\(dq # runs the equivalent of \(garm \(aq\(aq\(ga set foo \(dq1 2 3\(dq rm $foo # runs the equivalent of \(garm \(aq1 2 3\(aq\(ga \- trying to delete one file rm \(dq$foo\(dq # same thing .EE .UNINDENT .UNINDENT .sp این رفتار برخلاف سایر پوسته‌ها است که عمل موسوم به «تفکیک کلمات» (Word Splitting) را انجام می‌دهند؛ یعنی متغیر را زمانی که در یک بسط \fIاستفاده\fP می‌شود تفکیک می‌کنند. برای مثال در bash: .INDENT 0.0 .INDENT 3.5 .sp .EX foo=\(dq1 2 3\(dq rm $foo # runs the equivalent of \(garm 1 2 3\(ga rm \(dq$foo\(dq # runs the equivalent of \(garm \(aq1 2 3\(aq\(ga .EE .UNINDENT .UNINDENT .sp این امر علت بروز خطاهای بسیار رایج در مواجهه با نام فایل‌های دارای فاصله در اسکریپت‌های بش است. .sp در فیش، متغیرهای فاقد نقل‌قول به تعداد عنصرهایی که دارند به آرگومان بسط می‌یابند. این یعنی یک فهرست خالی به هیچ چیز بسط نمی‌یابد، متغیری با یک عنصر به همان یک عنصر بسط پیدا می‌کند و متغیری با چند عنصر به هر یک از آن عناصر به صورت جداگانه بسط خواهد یافت. .sp اگر متغیری به هیچ چیز بسط یابد، هر رشته دیگری که به آن چسبیده باشد را نیز خنثی می‌کند. برای اطلاعات بیشتر بخش ترکیب فهرست‌ها را ببینید. .sp در بیشتر مواقع، نقل‌قول نکردن متغیر کار درستی است. استثنا زمانی است که نیاز دارید اطمینان یابید متغیر حتی در صورت خالی بودن یا داشتن چند عنصر، دقیقاً به عنوان یک عنصر منتقل شود. این وضعیت اغلب در دستور test \%<> رخ می‌دهد: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-l foo one two three test \-n $foo # prints an error that it got too many arguments, because it was executed like test \-n one two three test \-n \(dq$foo\(dq # works, because it was executed like test \-n \(dqone two three\(dq .EE .UNINDENT .UNINDENT .IP [3] 5 برخلاف bash یا zsh که با نخستین نویسه متغیر $IFS (که معمولاً فاصله است) پیوند می‌دهند. .SS "ارجاع‌زدایی متغیرها (Dereferencing variables)" .sp علامت \fB$\fP می‌تواند به صورت چندباره نیز به کار رود، مانند نوعی عملگر «ارجاع‌زدایی» (مشابه \fB*\fP در C یا C++)؛ همان‌طور که در کد زیر مشاهده می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX set foo a b c set a 10; set b 20; set c 30 for i in (seq (count $$foo)) echo $$foo[$i] end # Output is: # 10 # 20 # 30 .EE .UNINDENT .UNINDENT .sp عبارت \fB$$foo[$i]\fP یعنی «مقدار متغیری که نام آن توسط \fB$foo[$i]\fP مشخص شده است». .sp این شیوه همچنین می‌تواند برای ارسال نام یک متغیر به یک تابع به کار رود: .INDENT 0.0 .INDENT 3.5 .sp .EX function print_var for arg in $argv echo Variable $arg is $$arg end end set \-g foo 1 2 3 set \-g bar a b c print_var foo bar # prints \(dqVariable foo is 1 2 3\(dq and \(dqVariable bar is a b c\(dq .EE .UNINDENT .UNINDENT .sp البته متغیر باید از درون تابع قابل دسترسی باشد، بنابراین لازم است سراسری، جهانی (universal) یا صادرشده (exported) باشد. همچنین نباید با نام متغیری که درون تابع استفاده شده تداخل داشته باشد. اگر در آنجا $foo را متغیر محلی ساخته بودیم یا نام آن را «arg» گذاشته بودیم، کار نمی‌کرد. .sp هنگام استفاده از این قابلیت به همراه برش‌ها (slices)، برش‌ها از داخل به بیرون اعمال می‌شوند. عبارت \fB$$foo[5]\fP عنصر پنجم متغیر \fB$foo\fP را به عنوان نام متغیر استفاده می‌کند، به جای اینکه عنصر پنجم تمام متغیرهایی را بدهد که $foo به آن‌ها ارجاع دارد. برای حالت دوم، باید به صورت \fB$$foo[1..\-1][5]\fP نوشته شود (تمامی عناصر \fB$foo\fP را بگیر، آن‌ها را به عنوان نام متغیرها به کار ببر، سپس عنصر پنجم آن‌ها را بده). .sp چند مثال دیگر: .INDENT 0.0 .INDENT 3.5 .sp .EX set listone 1 2 3 set listtwo 4 5 6 set var listone listtwo echo $$var # Output is 1 2 3 4 5 6 echo $$var[1] # Output is 1 2 3 echo $$var[2][3] # $var[2] is listtwo, third element of that is 6, output is 6 echo $$var[..][2] # The second element of every variable, so output is 2 5 .EE .UNINDENT .UNINDENT .SS "متغیرها به عنوان دستور (Variables as command)" .sp همانند دیگر پوسته‌ها، می‌توانید مقدار یک متغیر را به عنوان یک دستور اجرا کنید. .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-g EDITOR emacs > $EDITOR foo # opens emacs, possibly the GUI version .EE .UNINDENT .UNINDENT .sp اگر بخواهید به دستور درون متغیر یک آرگومان بدهید، باید آن آرگومان یک عنصر مجزا در فهرست باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX > set EDITOR emacs \-nw > $EDITOR foo # opens emacs in the terminal even if the GUI is installed > set EDITOR \(dqemacs \-nw\(dq > $EDITOR foo # tries to find a command called \(dqemacs \-nw\(dq .EE .UNINDENT .UNINDENT .sp همچنین مانند سایر پوسته‌ها، این قابلیت تنها برای دستورات، دستورات توکار و توابع کارایی دارد \- برای کلیدواژه‌ها کار نخواهد کرد زیرا کلیدواژه‌ها اهمیت نحوی دارند. .sp برای نمونه، عبارت \fBset if $if\fP به شما امکان ساخت بلوک if را نمی‌دهد، و \fBset cmd command\fP اجازه استفاده به عنوان آذین‌گر command \%<> را نخواهد داد، بلکه تنها کاربردهایی مانند \fB$cmd \-q foo\fP مجاز است. .SS "جایگزینی دستور (Command substitution)" .sp یک \fBجایگزینی دستور\fP بسطی است که از \fIخروجی\fP یک دستور به عنوان آرگومان‌های دستور دیگر استفاده می‌کند. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX echo $(pwd) .EE .UNINDENT .UNINDENT .sp این عبارت دستور pwd \%<> را اجرا کرده، خروجی آن را گرفته (به طور دقیق‌تر آنچه به جریان خروجی استاندارد «stdout» نوشته است) و آن را به عنوان آرگومان به دستور echo \%<> می‌دهد. بنابراین دستور درونی (\fBpwd\fP) ابتدا اجرا شده و باید پیش از شروع به کار دستور بیرونی، کار خود را به پایان برساند. .sp اگر دستور درونی چندین خط چاپ کند، فیش هر خط جداگانه را به عنوان یک آرگومان مستقل به دستور بیرونی تحویل می‌دهد. برخلاف دیگر پوسته‌ها، از مقدار متغیر \fB$IFS\fP استفاده نمی‌شود [4]؛ فیش بر اساس خطوط جدید (newline) تفکیک را انجام می‌دهد. .sp جایگزینی‌های دستور را می‌توان درون نقل‌قول دوتایی نیز قرار داد: .INDENT 0.0 .INDENT 3.5 .sp .EX echo \(dq$(pwd)\(dq .EE .UNINDENT .UNINDENT .sp هنگام استفاده از نقل‌قول دوتایی، خروجی دستور بر اساس خطوط تفکیک نمی‌شود، اما خطوط خالی انتهایی همچنان حذف می‌گردند. .sp اگر خروجی به عنوان گام پایانی به دستورات string split یا string split0 \%<> پایپ شود، آن تفکیک‌ها به همان صورتی که ظاهر می‌شوند به کار می‌روند، به جای آنکه بر اساس خطوط تفکیک شوند. .sp فیش همچنین نوشتن جایگزینی دستور بدون علامت دلار را ممکن می‌سازد، مانند \fBecho (pwd)\fP\&. این شیوه درون نقل‌قول دوتایی بسط نمی‌یابد (\fBecho \(dq(pwd)\(dq\fP عبارت \fB(pwd)\fP را چاپ خواهد کرد). .sp وضعیت خروج آخرین جایگزینی دستور اجراشده در متغیر status در دسترس است، البته در صورتی که این جایگزینی در بستر یک دستور set \%<> رخ دهد (بنابراین عبارت \fBif set \-l (something)\fP بررسی می‌کند که آیا دستور \fBsomething\fP وضعیت درست برگردانده است یا خیر). .sp برای استفاده تنها از برخی خطوط خروجی، به بخش برش‌ها (slices) مراجعه کنید. .sp مثال‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX # Outputs \(aqimage.png\(aq. echo (basename image.jpg .jpg).png # Convert all JPEG files in the current directory to the # PNG format using the \(aqconvert\(aq program. for i in *.jpg; convert $i (basename $i .jpg).png; end # Set the \(ga\(gadata\(ga\(ga variable to the contents of \(aqdata.txt\(aq # without splitting it into a list. set data \(dq$(cat data.txt)\(dq # Set \(ga\(ga$data\(ga\(ga to the contents of data, splitting on NUL\-bytes. set data (cat data | string split0) .EE .UNINDENT .UNINDENT .sp گاهی می‌خواهید خروجی یک دستور را به دستور دیگری ارسال کنید که تنها فایل می‌پذیرد. اگر خروجی تنها یک فایل است، معمولاً می‌توانید آن را از طریق پایپ ارسال کنید، مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX grep fish myanimallist1 | wc \-l .EE .UNINDENT .UNINDENT .sp اما اگر به چندین مورد نیاز دارید یا دستور از ورودی استاندارد نمی‌خواند، «جایگزینی فرآیند» (process substitution) کارآمد خواهد بود. سایر پوسته‌ها این کار را با نحو \fBfoo <(bar) <(baz)\fP انجام می‌دهند، و فیش از دستور psub \%<> استفاده می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX # Compare only the lines containing \(dqfish\(dq in two files: diff \-u (grep fish myanimallist1 | psub) (grep fish myanimallist2 | psub) .EE .UNINDENT .UNINDENT .sp این دستور یک فایل موقت می‌سازد، خروجی دستور را در آن فایل ذخیره کرده و نام فایل را چاپ می‌کند تا به دستور بیرونی داده شود. .sp پوسته فیش محدودیتی پیش‌فرض به میزان ۱ گیبی‌بایت (1 GiB) برای داده‌هایی که در جایگزینی دستور می‌خواند در نظر گرفته است. اگر این حد فراتر رود، کل دستور (تمام آن، نه فقط جایگزینی دستور \- یعنی دستور بیرونی اصلاً اجرا نخواهد شد) شکست خورده و \fB$status\fP روی مقدار 122 تنظیم می‌شود. این امر به این دلیل است که جایگزینی دستور نتواند موجب اتمام حافظه سیستم شود، زیرا سیستم‌عامل شما معمولاً محدودیت بسیار پایین‌تری دارد و خواندن بیش از آن بی‌فایده و زیان‌بار خواهد بود. این محدودیت را می‌توان با متغیر \fBfish_read_limit\fP تغییر داد (مقدار \fI0\fP به معنای نبود محدودیت است). این محدودیت همچنین بر دستور read \%<> اثر می‌گذارد. .IP [4] 5 یک استثنا: خالی قرار دادن متغیر \fB$IFS\fP تفکیک خطوط را غیرفعال می‌کند. این شیوه منسوخ شده و بهتر است از string split \%<> استفاده کنید. .SS "بسط آکولاد (Brace expansion)" .sp آکولادها می‌توانند برای نوشتن فهرست‌های جداشده با کاما به کار روند. آن‌ها به گونه‌ای بسط داده می‌شوند که هر عنصر به یک پارامتر جدید تبدیل شده و رشته‌های پیرامونی به آن متصل می‌گردند. این قابلیت برای صرفه‌جویی در تایپ و نیز جداسازی نام متغیر از متن مجاور بسیار مفید است. .sp مثال‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo input.{c,h,txt} input.c input.h input.txt # Move all files with the suffix \(aq.c\(aq or \(aq.h\(aq to the subdirectory src. > mv *.{c,h} src/ # Make a copy of \(gafile\(ga at \(gafile.bak\(ga. > cp file{,.bak} > set \-l dogs hot cool cute \(dqgood \(dq > echo {$dogs}dog hotdog cooldog cutedog good dog .EE .UNINDENT .UNINDENT .sp اگر بین آکولادها علامت «,» یا بسط متغیر وجود نداشته باشد، بسط داده نخواهند شد: .INDENT 0.0 .INDENT 3.5 .sp .EX # This {} isn\(aqt special > echo foo\-{} foo\-{} # This passes \(dqHEAD@{2}\(dq to git > git reset \-\-hard HEAD@{2} > echo {{a,b}} {a} {b} # because the inner brace pair is expanded, but the outer isn\(aqt. .EE .UNINDENT .UNINDENT .sp اگر پس از بسط، چیزی میان آکولادها باقی نماند، آن آرگومان به کلی حذف می‌شود (بخش ترکیب فهرست‌ها را ببینید): .INDENT 0.0 .INDENT 3.5 .sp .EX > echo foo\-{$undefinedvar} # Output is an empty line, like a bare \(gaecho\(ga. .EE .UNINDENT .UNINDENT .sp اگر بین یک آکولاد و یک کاما، یا بین دو کاما چیزی وجود نداشته باشد، به عنوان یک عنصر خالی تفسیر می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo {,,/usr}/bin /bin /bin /usr/bin .EE .UNINDENT .UNINDENT .sp برای استفاده از «,» به عنوان یک عنصر عادی، آن را نقل‌قول کنید یا با نویسه گریز بنویسید. .sp نخستین کاراکتر از توکن یک دستور هرگز به عنوان بسط آکولاد تفسیر نمی‌شود، زیرا نشانه شروع یک دستور مرکب (compound statement) است: .INDENT 0.0 .INDENT 3.5 .sp .EX > {echo hello, && echo world} hello, world .EE .UNINDENT .UNINDENT .SS "ترکیب فهرست‌ها (Combining lists)" .sp پوسته فیش فهرست‌ها را همانند بسط‌های آکولاد بسط می‌دهد: .INDENT 0.0 .INDENT 3.5 .sp .EX >_ set \-l foo x y z >_ echo 1$foo # Any element of $foo is combined with the \(dq1\(dq: 1x 1y 1z >_ echo {good,bad}\(dq apples\(dq # Any element of the {} is combined with the \(dq apples\(dq: good apples bad apples # Or we can mix the two: >_ echo {good,bad}\(dq \(dq$foo good x bad x good y bad y good z bad z .EE .UNINDENT .UNINDENT .sp هر رشته‌ای که به یک فهرست متصل شود، به تک‌تک عناصر آن الحاق خواهد شد. .sp دو فهرست در تمامی ترکیبات ممکن بسط می‌یابند \- هر عنصر از فهرست اول با هر عنصر از فهرست دوم: .INDENT 0.0 .INDENT 3.5 .sp .EX >_ set \-l a x y z; set \-l b 1 2 3 >_ echo $a$b # same as {x,y,z}{1,2,3} x1 y1 z1 x2 y2 z2 x3 y3 z3 .EE .UNINDENT .UNINDENT .sp پیامد این رفتار آن است که اگر یک فهرست عنصری نداشته باشد، رشته با صفر عنصر ترکیب می‌شود و در نتیجه کل توکن حذف خواهد شد! .INDENT 0.0 .INDENT 3.5 .sp .EX >_ set \-l c # <\- this list is empty! >_ echo {$c}word # Output is an empty line \- the \(dqword\(dq part is gone .EE .UNINDENT .UNINDENT .sp این ویژگی می‌تواند بسیار مفید باشد. برای مثال اگر می‌خواهید تمام فایل‌های موجود در تمامی دایرکتوری‌های متغیر \fBPATH\fP را بررسی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX for file in $PATH/* .EE .UNINDENT .UNINDENT .sp از آنجا که \fBPATH\fP یک فهرست است، این عبارت به تمام فایل‌های درون تمام دایرکتوری‌های آن بسط می‌یابد. و اگر هیچ دایرکتوری در \fBPATH\fP نباشد، پاسخ درست این است که به هیچ فایلی بسط پیدا نکند. .sp گاهی ممکن است این رفتار ناخواسته باشد، به ویژه ناپدید شدن توکن‌ها پس از بسط. در چنین مواردی باید متغیرها را درون نقل‌قول دوتایی قرار دهید \- مانند \fBecho \(dq$c\(dqword\fP\&. .sp این وضعیت پس از جایگزینی دستور نیز اتفاق می‌افتد. برای جلوگیری از ناپدید شدن توکن‌ها در آنجا، کاری کنید که دستور درونی یک خط جدید انتهایی برگرداند یا آن را درون نقل‌قول دوتایی بگذارید: .INDENT 0.0 .INDENT 3.5 .sp .EX >_ set b 1 2 3 >_ echo (echo x)$b x1 x2 x3 >_ echo (printf \(aq%s\(aq \(aq\(aq)banana # the printf prints nothing, so this is nothing times \(dqbanana\(dq, # which is nothing. >_ echo (printf \(aq%s\en\(aq \(aq\(aq)banana # the printf prints a newline, # so the command substitution expands to an empty string, # so this is \(ga\(aq\(aqbanana\(ga banana >_ echo \(dq$(printf \(aq%s\(aq \(aq\(aq)\(dqbanana # quotes mean this is one argument, the banana stays .EE .UNINDENT .UNINDENT .SS "برش‌ها (Slices)" .sp گاهی لازم است تنها به برخی از عناصر یک فهرست دسترسی داشته باشید (تمامی متغیرهای فیش فهرست هستند)، یا برخی از خطوط خروجی یک جایگزینی دستور را دریافت کنید. در فیش هر دو کار با نوشتن مجموعه‌ای از نمایه‌ها (اندیس‌ها) درون براکت امکان‌پذیر است، مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX # Make $var a list of four elements set var one two three four # Print the second: echo $var[2] # prints \(dqtwo\(dq # or print the first three: echo $var[1..3] # prints \(dqone two three\(dq .EE .UNINDENT .UNINDENT .sp درون براکت‌های نمایه، فیش بازه‌هایی به شکل \fBa..b\fP را درک می‌کند (که در آن «a» و «b» نمایه هستند). آن‌ها به توالی نمایه‌ها از a تا b بسط می‌یابند (یعنی \fBa a+1 a+2 ... b\fP)؛ اگر b بزرگتر باشد صعودی و اگر a بزرگتر باشد نزولی خواهند بود. نمایه‌های منفی نیز قابل استفاده‌اند \- این نمایه‌ها از انتهای فهرست محاسبه می‌شوند، بنابراین \fB\-1\fP آخرین عنصر است و \fB\-2\fP عنصر یکی مانده به آخر. اگر نمایه‌ای وجود نداشته باشد، بازه تا نزدیک‌ترین نمایه ممکن تنظیم و محدود (clamp) می‌شود. .sp اگر یک فهرست ۵ عنصر داشته باشد، نمایه‌ها از ۱ تا ۵ هستند؛ بنابراین بازه \fB2..16\fP تنها از عنصر ۲ تا ۵ پیش می‌رود. .sp اگر انتهای بازه منفی باشد، مسیر بازه همیشه صعودی است؛ بنابراین \fB2..\-2\fP از عنصر ۲ تا ۴ می‌رود، و \fB2..\-16\fP به هیچ کجا نمی‌رود چون هیچ راهی برای رفتن صعودی از عنصر دوم به عنصری که وجود ندارد وجود ندارد. اگر ابتدای بازه منفی باشد، مسیر همیشه نزولی است؛ بنابراین \fB\-2..1\fP از عنصر ۴ تا ۱ می‌رود، و \fB\-16..2\fP به هیچ کجا نمی‌رود چون راهی برای رفتن نزولی از عنصری ناموجود به عنصر دوم وجود ندارد. .sp نبود نمایه آغازین در یک بازه به طور پیش‌فرض برابر با ۱ در نظر گرفته می‌شود. این حالت در صورتی مجاز است که بازه، نخستین عبارت نمایه‌ای در توالی باشد. به همین ترتیب، نبود نمایه پایانی به طور پیش‌فرض برابر با \-1 در نظر گرفته می‌شود که برای آخرین نمایه در توالی مجاز است. .sp استفاده از چندین بازه نیز امکان‌پذیر است که با فاصله از هم جدا می‌شوند. .sp چند مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX echo (seq 10)[1 2 3] # Prints: 1 2 3 # Limit the command substitution output echo (seq 10)[2..5] # Uses elements from 2 to 5 # Output is: 2 3 4 5 echo (seq 10)[7..] # Prints: 7 8 9 10 # Use overlapping ranges: echo (seq 10)[2..5 1..3] # Takes elements from 2 to 5 and then elements from 1 to 3 # Output is: 2 3 4 5 1 2 3 # Reverse output echo (seq 10)[\-1..1] # Uses elements from the last output line to # the first one in reverse direction # Output is: 10 9 8 7 6 5 4 3 2 1 # The command substitution has only one line, # so these will result in empty output: echo (echo one)[2..\-1] echo (echo one)[\-3..1] .EE .UNINDENT .UNINDENT .sp همین قاعده هنگام تنظیم یا بسط متغیرها نیز کار می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX # Reverse path variable set PATH $PATH[\-1..1] # or set PATH[\-1..1] $PATH # Use only n last items of the PATH set n \-3 echo $PATH[$n..\-1] .EE .UNINDENT .UNINDENT .sp می‌توان از متغیرها به عنوان نمایه برای بسط متغیرها استفاده کرد، مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX set index 2 set letters a b c d echo $letters[$index] # returns \(aqb\(aq .EE .UNINDENT .UNINDENT .sp با این حال، استفاده از متغیرها به عنوان نمایه برای جایگزینی دستور در حال حاضر پشتیبانی نمی‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX echo (seq 5)[$index] # This won\(aqt work set sequence (seq 5) # It needs to be written on two lines like this. echo $sequence[$index] # returns \(aq2\(aq .EE .UNINDENT .UNINDENT .sp هنگام استفاده از بسط غیرمستقیم متغیر با چندین علامت \fB$\fP (\fB$$name\fP)، باید تمام نمایه‌ها را تا رسیدن به متغیری که می‌خواهید برش بزنید مشخص کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-l list 1 2 3 4 5 > set \-l name list > echo $$name[1] 1 2 3 4 5 > echo $$name[1..\-1][1..3] # or $$name[1][1..3], since $name only has one element. 1 2 3 .EE .UNINDENT .UNINDENT .SS "بسط دایرکتوری خانگی (Home directory expansion)" .sp نویسه مدک \fB~\fP در ابتدای یک پارامتر، چنانچه با یک نام کاربری دنبال شود، به دایرکتوری خانگی کاربر مشخص‌شده بسط می‌یابد. علامت \fB~\fP به تنهایی یا دنبال‌شده با یک اسلش، به دایرکتوری خانگی مالک فرآیند جاری بسط داده می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX ls ~/Music # lists my music directory echo ~root # prints root\(aqs home directory, probably \(dq/root\(dq .EE .UNINDENT .UNINDENT .SS "ترکیب بسط‌های گوناگون (Combining different expansions)" .sp تمام بسط‌های بالا را می‌توان با یکدیگر ترکیب کرد. اگر چند بسط منجر به بیش از یک پارامتر شوند، تمام ترکیب‌های ممکن ساخته خواهند شد. .sp هنگام ترکیب چند بسط پارامتر، بسط‌ها با این ترتیب اولویت انجام می‌شوند: .INDENT 0.0 .IP \(bu 2 جایگزینی‌های دستور .IP \(bu 2 بسط‌های متغیر .IP \(bu 2 بسط‌های براکت و آکولاد .IP \(bu 2 بسط نویسه‌های عام (الگوهای تطبیق فایل) .UNINDENT .sp بسط‌ها از راست به چپ انجام می‌شوند؛ بسط‌های تودرتوی براکت و جایگزینی‌های دستور از درون به بیرون اعمال می‌گردند. .sp مثال: .sp اگر دایرکتوری جاری حاوی فایل‌های «foo» و «bar» باشد، دستور \fBecho a(ls){1,2,3}\fP خروجی \fBabar1 abar2 abar3 afoo1 afoo2 afoo3\fP را تولید خواهد کرد. .SH "جدول عملگرها (TABLE OF OPERATORS)" .sp به عنوان جمع‌بندی، در اینجا یک مرجع سریع برای عملگرهای فیش و تمامی نمادهای ویژه‌ای که به کار می‌برد آورده شده است: .TS box center; l|l|l. T{ نماد T} T{ مفهوم T} T{ مثال T} _ T{ \fB$\fP T} T{ بسط متغیر T} T{ \fBecho $foo\fP T} _ T{ \fB$()\fP و \fB()\fP T} T{ جایگزینی دستور T} T{ \fBcat (grep foo bar)\fP یا \fBcat $(grep foo bar)\fP T} _ T{ \fB<\fP و \fB>\fP T} T{ تغییرمسیر، مانند \fBcommand > file\fP T} T{ \fBgit shortlog \-nse . > authors\fP T} _ T{ \fB|\fP T} T{ پایپ (لوله)، اتصال دو یا چند دستور T} T{ \fBfoo | grep bar | grep baz\fP T} _ T{ \fB;\fP T} T{ پایان دستور، به جای خط جدید T} T{ \fBcommand1; command2\fP T} _ T{ \fB&\fP T} T{ اجرا در پس‌زمینه T} T{ \fBsleep 5m &\fP T} _ T{ \fB{}\fP T} T{ بسط آکولاد T} T{ \fBls {/usr,}/bin\fP T} _ T{ \fB&&\fP و \fB||\fP T} T{ ترکیب‌کننده‌ها T} T{ \fBmkdir foo && cd foo\fP یا \fBrm foo || exit\fP T} _ T{ \fB*\fP و \fB**\fP T} T{ نویسه‌های عام T} T{ \fBcat *.fish\fP یا \fBcount **.jpg\fP T} _ T{ \fB\e\e\fP T} T{ گریزدهی (Escaping) T} T{ \fBecho foo\enbar\fP یا \fBecho \e$foo\fP T} _ T{ \fB\(aq\(aq\fP و \fB\(dq\(dq\fP T} T{ نقل‌قول T} T{ \fBrm \(dqfile with spaces\(dq\fP یا \fBecho \(aq$foo\(aq\fP T} _ T{ \fB~\fP T} T{ بسط دایرکتوری خانگی T} T{ \fBls ~/\fP یا \fBls ~root/\fP T} _ T{ \fB#\fP T} T{ توضیحات و کامنت‌ها T} T{ \fBecho Hello # this isn\(aqt printed\fP T} .TE .SH "متغیرهای پوسته (SHELL VARIABLES)" .sp متغیرها روشی برای ذخیره داده‌ها و انتقال آن‌ها به بخش‌های مختلف هستند. این متغیرها می‌توانند صرفاً درون پوسته استفاده شوند یا «صادر» (exported) گردند تا کپی‌ای از آن‌ها در اختیار هر دستور خارجی که توسط پوسته اجرا می‌شود قرار گیرد. به یک متغیر صادرشده اصطلاحاً «متغیر محیطی» (environment variable) گفته می‌شود. .sp برای مقداردهی یک متغیر، از دستور set \%<> استفاده کنید. نام یک متغیر نمی‌تواند خالی باشد و تنها می‌تواند شامل حروف، ارقام و زیرخط (underscore) باشد. نام متغیر می‌تواند با هر یک از این نویسه‌ها شروع شده یا پایان یابد. .sp مثال: .sp برای مقداردهی متغیر \fBsmurf_color\fP با مقدار \fBblue\fP، از دستور \fBset smurf_color blue\fP استفاده کنید. .sp پس از مقداردهی یک متغیر، می‌توانید از مقدار آن درون پوسته از طریق بسط متغیر بهره ببرید. .sp مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX set smurf_color blue echo Smurfs are usually $smurf_color set pants_color red echo Papa smurf, who is $smurf_color, wears $pants_color pants .EE .UNINDENT .UNINDENT .sp بنابراین شما یک متغیر را با \fBset\fP مقداردهی کرده و با استفاده از علامت \fB$\fP همراه با نام آن، مورد استفاده قرار می‌دهید. .SS "دامنه متغیرها (Variable Scope)" .sp تمامی متغیرها در فیش دارای یک دامنه (scope) هستند. برای نمونه می‌توانند سراسری (global) یا برای یک تابع یا بلوک، محلی (local) باشند: .INDENT 0.0 .INDENT 3.5 .sp .EX # This variable is global, we can use it everywhere. set \-\-global name Patrick # This variable is local, it will not be visible in a function we call from here. set \-\-local place \(dqat the Krusty Krab\(dq function local # This can find $name, but not $place echo Hello this is $name $place # This variable is local, it will not be available # outside of this function set \-\-local instrument mayonnaise echo My favorite instrument is $instrument # This creates a local $name, and won\(aqt touch the global one set \-\-local name Spongebob echo My best friend is $name end local # Will print: # Hello this is Patrick # My favorite instrument is mayonnaise # My best friend is Spongebob echo $name, I am $place and my instrument is $instrument # Will print: # Patrick, I am at the Krusty Krab and my instrument is .EE .UNINDENT .UNINDENT .sp در فیش چهار نوع دامنه برای متغیرها وجود دارد: متغیرهای جهانی (universal)، سراسری (global)، تابعی (function) و محلی (local). .INDENT 0.0 .IP \(bu 2 متغیرهای جهانی (Universal) بین تمامی نشست‌های فیش متعلق به یک کاربر روی یک رایانه به اشتراک گذاشته می‌شوند. این متغیرها روی دیسک ذخیره شده و حتی پس از راه‌اندازی مجدد سیستم پایدار می‌مانند. .IP \(bu 2 متغیرهای سراسری (Global) مختص نشست جاری فیش هستند. این متغیرها را می‌توان با درخواست صریح دستور \fBset \-e\fP حذف کرد. .IP \(bu 2 متغیرهای تابعی (Function) مختص تابعی هستند که در حال حاضر در حال اجرا است. هنگامی که تابع جاری پایان می‌یابد، این متغیرها پاک می‌شوند (از دامنه خارج می‌شوند). خارج از یک تابع، این متغیرها از دامنه خارج نمی‌شوند. .IP \(bu 2 متغیرهای محلی (Local) مختص بلوک جاری از دستورات هستند و زمانی که آن بلوک مشخص به پایان می‌رسد، به طور خودکار پاک می‌شوند. یک بلوک از دستورات، مجموعه‌ای از دستورات است که با یکی از دستورات \fBfor\fP، \fBwhile\fP، \fBif\fP، \fBfunction\fP، \fBbegin\fP یا \fBswitch\fP آغاز شده و با دستور \fBend\fP پایان می‌یابد. خارج از یک بلوک، این دامنه همانند دامنه تابعی رفتار می‌کند. .UNINDENT .sp متغیرها را می‌توان با سوییچ‌های \fB\-U\fP یا \fB\-\-universal\fP صراحتاً جهانی، با \fB\-g\fP یا \fB\-\-global\fP سراسری، با \fB\-f\fP یا \fB\-\-function\fP با دامنه تابع، و با \fB\-l\fP یا \fB\-\-local\fP برای بلوک جاری محلی تعریف کرد. قواعد تعیین دامنه هنگام ایجاد یا به‌روزرسانی یک متغیر به این صورت است: .INDENT 0.0 .IP \(bu 2 هنگامی که یک دامنه به صراحت مشخص شود، همان اعمال خواهد شد. اگر متغیری با همین نام در دامنه دیگری وجود داشته باشد، آن متغیر دست‌نخورده باقی می‌ماند. .IP \(bu 2 هنگامی که دامنه‌ای مشخص نشود ولی متغیری با همان نام موجود باشد، متغیر با کوچک‌ترین دامنه تغییر خواهد یافت. دامنه‌اش تغییری نمی‌کند. .IP \(bu 2 هنگامی که دامنه‌ای مشخص نشود و متغیری با آن نام وجود نداشته باشد، اگر درون یک تابع باشیم متغیر با دامنه تابعی ایجاد می‌شود و اگر تابعی در حال اجرا نباشد، با دامنه سراسری ساخته خواهد شد. .UNINDENT .sp می‌تواند چندین متغیر با یک نام اما در دامنه‌های متفاوت وجود داشته باشد. زمانی که از یک متغیر استفاده می‌کنید، متغیر با کوچک‌ترین دامنه در میان متغیرهای هم‌نام انتخاب خواهد شد. اگر یک متغیر محلی وجود داشته باشد، به جای متغیر سراسری یا جهانی هم‌نام خود به کار می‌رود. .sp مثال: .sp کاربردهای گوناگونی برای دامنه‌های مختلف وجود دارد. .sp معمولاً درون توابع باید از دامنه محلی استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX function something set \-l file /path/to/my/file if not test \-e \(dq$file\(dq set file /path/to/my/otherfile end end # or function something if test \-e /path/to/my/file set \-f file /path/to/my/file else set \-f file /path/to/my/otherfile end end .EE .UNINDENT .UNINDENT .sp اگر می‌خواهید مقداری را در config.fish تنظیم کنید، یا چیزی را درون یک تابع مقداردهی کنید تا برای بقیه مدت نشست در دسترس بماند، دامنه سراسری گزینه مناسبی است: .INDENT 0.0 .INDENT 3.5 .sp .EX # Don\(aqt shorten the working directory in the prompt set \-g fish_prompt_pwd_dir_length 0 # Set my preferred cursor style: function setcursors set \-g fish_cursor_default block set \-g fish_cursor_insert line set \-g fish_cursor_visual underscore end # Set my language set \-gx LANG de_DE.UTF\-8 .EE .UNINDENT .UNINDENT .sp در اینجا مقایسه‌ای بین متغیرهای محلی و متغیرهای با دامنه تابع آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX function test\-scopes begin # This is a nice local scope where all variables will die set \-l pirate \(aqThere be treasure in them thar hills\(aq set \-f captain Space, the final frontier # If no variable of that name was defined, it is function\-local. set gnu \(dqIn the beginning there was nothing, which exploded\(dq end # This will not output anything, since the pirate was local echo $pirate # This will output the good Captain\(aqs speech # since $captain had function\-scope. echo $captain # This will output Sir Terry\(aqs wisdom. echo $gnu end .EE .UNINDENT .UNINDENT .sp هنگامی که یک تابع، تابع دیگری را فراخوانی می‌کند، متغیرهای محلی تابع اول برای دومی قابل مشاهده نیستند: .INDENT 0.0 .INDENT 3.5 .sp .EX function shiver set phrase \(aqShiver me timbers\(aq end function avast set \-\-local phrase \(aqAvast, mateys\(aq # Calling the shiver function here can not # change any variables in the local scope # so phrase remains as we set it here. shiver echo $phrase end avast # Outputs \(dqAvast, mateys\(dq .EE .UNINDENT .UNINDENT .sp هنگام تردید، از متغیرهای با دامنه تابع استفاده کنید. هر گاه نیاز دارید متغیر در همه‌جا قابل دسترسی باشد، آن را سراسری کنید. هنگامی که می‌خواهید پیکربندی را به طور پایدار ذخیره نمایید، آن را جهانی سازید. و زمانی که می‌خواهید از متغیری فقط درون یک بلوک کوتاه بهره ببرید، آن را محلی تعریف کنید. .SS "بازنویسی متغیرها برای یک دستور منفرد (Overriding variables for a single command)" .sp اگر مایلید متغیری را صرفاً برای اجرای یک دستور منفرد بازنویسی (override) کنید، می‌توانید از عبارات «var=val» پیش از نام دستور استفاده نمایید: .INDENT 0.0 .INDENT 3.5 .sp .EX # Call git status on another directory # (can also be done via \(gagit \-C somerepo status\(ga) GIT_DIR=somerepo git status .EE .UNINDENT .UNINDENT .sp برخلاف برخی پوسته‌های دیگر، فیش ابتدا متغیر را تنظیم کرده و سپس سایر بسط‌های خط فرمان را انجام می‌دهد؛ بنابراین: .INDENT 0.0 .INDENT 3.5 .sp .EX set foo banana foo=gagaga echo $foo # prints gagaga, while in other shells it might print \(dqbanana\(dq .EE .UNINDENT .UNINDENT .sp امکان تعریف چندین عنصر از طریق بسط آکولاد نیز فراهم است: .INDENT 0.0 .INDENT 3.5 .sp .EX # Call bash with a reasonable default path. PATH={/usr,}/{s,}bin bash .EE .UNINDENT .UNINDENT .sp یا از طریق یک الگوی عام (glob): .INDENT 0.0 .INDENT 3.5 .sp .EX # Run vlc on all mp3 files in the current directory # If no file exists it will still be run with no arguments mp3s=*.mp3 vlc $mp3s .EE .UNINDENT .UNINDENT .sp برخلاف پوسته‌های دیگر، این شیوه مانع جستجوی دستورات (نام‌های مستعار یا مشابه آن) نمی‌شود. فراخوانی یک دستور پس از تنظیم متغیر بازنویسی، دقیقاً منجر به اجرای همان دستور خواهد شد. .sp این نحو از نسخه ۳.۱ فیش پشتیبانی می‌شود. .SS "متغیرهای سراسری جهانی (Universal Variables)" .sp متغیرهای جهانی متغیرهایی هستند که میان تمامی نشست‌های فیش کاربر بر روی رایانه به اشتراک گذاشته می‌شوند. تمامی تغییرات در متغیرهای جهانی پایدار بوده و بی‌درنگ در تمامی نشست‌های فیش منتشر می‌شوند. .sp متغیرهای جهانی در فایل \fB\&.config/fish/fish_variables\fP ذخیره می‌گردند. این فایل را مستقیماً ویرایش نکنید، زیرا ممکن است تغییرات شما بازنویسی شود. در عوض، متغیرها را از طریق اسکریپت‌های فیش یا با استفاده تعاملی از فیش ویرایش نمایید. .sp از افزودن مقدار به متغیرهای جهانی در فایل config.fish خودداری کنید، چرا که در این صورت با باز شدن هر نمونه پوسته جدید، این متغیرها طولانی‌تر خواهند شد. به جای آن، یک بار آن‌ها را در خط فرمان تنظیم کنید. .SS "صادر کردن متغیرها (Exporting variables)" .sp متغیرها در فیش می‌توانند صادر (export) شوند تا توسط هر دستوری که توسط فیش راه‌اندازی می‌شود به ارث برسند. به طور خاص، این امر برای متغیرهایی که جهت پیکربندی دستورات خارجی استفاده می‌شوند (مانند \fBPAGER\fP یا \fBGOPATH\fP) و همچنین متغیرهایی که حاوی تنظیمات عمومی سیستم هستند (مانند \fBPATH\fP یا \fBLANGUAGE\fP) ضروری است. اگر یک دستور خارجی نیاز دارد از یک متغیر باخبر باشد، آن متغیر باید صادر شود. متغیرهای صادرشده اغلب «متغیرهای محیطی» نیز نامیده می‌شوند. .sp این اصل برای خود فیش نیز صادق است \- هنگامی که راه‌اندازی می‌شود، متغیرهای محیطی را از والد خود (معمولاً ترمینال) دریافت می‌کند. این متغیرها معمولاً شامل تنظیمات سیستمی مانند \fBPATH\fP و متغیرهای محلی‌سازی (locale) هستند. .sp متغیرها را می‌توان با سوییچ \fB\-x\fP یا \fB\-\-export\fP صراحتاً صادر کرد، یا با سوییچ \fB\-u\fP یا \fB\-\-unexport\fP از حالت صادرشده خارج ساخت. قواعد صادر کردن هنگام تنظیم متغیر شبیه به قواعد دامنه متغیرهاست \- هنگامی که گزینه‌ای ارسال شود اعمال می‌گردد، در غیر این صورت وضعیت فعلی متغیر استفاده می‌شود. اگر گزینه‌ای مشخص نشود و متغیر از قبل وجود نداشته باشد، صادر نخواهد شد. .sp بر اساس یک قرارداد نام‌گذاری، متغیرهای صادرشده با حروف بزرگ و متغیرهای صادرنشده با حروف کوچک نوشته می‌شوند. .sp برای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-gx ANDROID_HOME ~/.android # /opt/android\-sdk set \-gx CDPATH . ~ (test \-e ~/Videos; and echo ~/Videos) set \-gx EDITOR emacs \-nw set \-gx GOPATH ~/dev/go set \-gx GTK2_RC_FILES \(dq$XDG_CONFIG_HOME/gtk\-2.0/gtkrc\(dq set \-gx LESSHISTFILE \(dq\-\(dq .EE .UNINDENT .UNINDENT .sp نکته: صادر کردن (exporting) یک دامنه نیست، بلکه یک وضعیت تکمیلی است. معمولاً منطقی است که متغیرهای صادرشده را سراسری (global) نیز تعریف کنید، اما متغیرهای صادرشده محلی نیز می‌توانند کاربردی باشند اگر به چیزی دقیق‌تر از بازنویسی‌های موقت نیاز دارید. این متغیرها در هنگام ارسال به توابع \fIکپی می‌شوند\fP تا تابع نتواند آن‌ها را در بیرون تغییر دهد، و همچنان در دسترس دستورات خارجی نیز خواهند بود. متغیرهای سراسری چه صادر شده باشند و چه نشده باشند، برای توابع قابل دسترسی هستند. .SS "فهرست‌ها (Lists)" .sp پوسته فیش می‌تواند یک فهرست (یا در صورت تمایل یک «آرایه») از چندین رشته را درون یک متغیر ذخیره کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > set mylist first second third > printf \(aq%s\en\(aq $mylist # prints each element on its own line first second third .EE .UNINDENT .UNINDENT .sp برای دسترسی به یک عنصر از فهرست، از نمایه (اندیس) آن عنصر درون براکت استفاده کنید، مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX echo $PATH[3] .EE .UNINDENT .UNINDENT .sp نمایه‌های فهرست در فیش از ۱ آغاز می‌شوند، نه از ۰ مانند سایر زبان‌ها. علت این است که نیاز به کسر عدد ۱ را کاهش می‌دهد و بسیاری از ابزارهای رایج یونیکس مانند \fBseq\fP با این شیوه بهتر کار می‌کنند (\fBseq 5\fP اعداد ۱ تا ۵ را چاپ می‌کند، نه ۰ تا ۵). نمایه نامعتبر بدون هشدار نادیده گرفته شده و مقداری برنمی‌گرداند (حتی رشته خالی برنمی‌گرداند، یعنی هیچ آرگومانی ارسال نمی‌شود). .sp اگر از هیچ براکتی استفاده نکنید، تمامی عناصر فهرست به صورت آیتم‌های مجزا به دستور ارسال خواهند شد. این یعنی می‌توانید با حلقه \fBfor\fP روی یک فهرست پیمایش کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX for i in $PATH echo $i is in the path end .EE .UNINDENT .UNINDENT .sp این دستور تمام دایرکتوری‌های موجود در \fBPATH\fP را به صورت جداگانه پیمایش کرده و برای هر کدام خطی چاپ می‌کند که نشان می‌دهد در مسیر قرار دارد. .sp برای ایجاد متغیر \fBsmurf\fP که حاوی آیتم‌های \fBblue\fP و \fBsmall\fP باشد، بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX set smurf blue small .EE .UNINDENT .UNINDENT .sp همچنین امکان مقداردهی یا حذف تک‌تک عناصر یک فهرست وجود دارد: .INDENT 0.0 .INDENT 3.5 .sp .EX # Set smurf to be a list with the elements \(aqblue\(aq and \(aqsmall\(aq set smurf blue small # Change the second element of smurf to \(aqevil\(aq set smurf[2] evil # Erase the first element set \-e smurf[1] # Output \(aqevil\(aq echo $smurf .EE .UNINDENT .UNINDENT .sp اگر هنگام بسط یا مقداردهی به یک متغیر فهرستی، نمایه منفی مشخص کنید، نمایه از \fIانتهای\fP فهرست محاسبه می‌شود. برای مثال، نمایه \-1 آخرین عنصر فهرست است: .INDENT 0.0 .INDENT 3.5 .sp .EX > set fruit apple orange banana > echo $fruit[\-1] banana > echo $fruit[\-2..\-1] orange banana > echo $fruit[\-1..1] # reverses the list banana orange apple .EE .UNINDENT .UNINDENT .sp همان‌طور که مشاهده می‌کنید، می‌توانید از بازه‌ای از نمایه‌ها استفاده کنید؛ برای جزئیات به بخش برش‌ها (slices) مراجعه نمایید. .sp تمام فهرست‌ها تک‌بعدی هستند و نمی‌توانند حاوی فهرست‌های دیگر باشند، هرچند شبیه‌سازی فهرست‌های تودرتو با استفاده از ارجاع‌زدایی امکان‌پذیر است \- بخش بسط متغیرها را ببینید. .sp هنگامی که یک فهرست به عنوان متغیر محیطی صادر می‌شود، بسته به اینکه متغیر مسیر (path variable) باشد یا خیر، با فاصله یا با دونقطه تفکیک می‌گردد: .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-x smurf blue small > set \-x smurf_PATH forest mushroom > env | grep smurf smurf=blue small smurf_PATH=forest:mushroom .EE .UNINDENT .UNINDENT .sp فیش به طور خودکار از تمامی متغیرهای محیطی که نامشان به \fBPATH\fP ختم می‌شود (مانند \fBPATH\fP، \fBCDPATH\fP یا \fBMANPATH\fP)، از طریق تفکیک بر اساس دونقطه، فهرست ایجاد می‌کند. متغیرهای دیگر به طور خودکار تفکیک نمی‌شوند. .sp فهرست‌ها را می‌توان با دستورات count \%<> یا contains \%<> بررسی و بازرسی کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX > count $smurf 2 > contains blue $smurf # blue was found, so it exits with status 0 # (without printing anything) > echo $status 0 > contains \-i blue $smurf 1 .EE .UNINDENT .UNINDENT .sp ویژگی عالی فهرست‌ها این است که به دستورات به صورت هر عنصر در قالب یک آرگومان مستقل منتقل می‌شوند؛ بنابراین به محض مقداردهی فهرست، می‌توانید آن را ارسال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-l grep_args \-r \(dqmy string\(dq grep $grep_args . # will run the same as \(gagrep \-r \(dqmy string\(dq\(ga . .EE .UNINDENT .UNINDENT .sp برخلاف پوسته‌های دیگر، فیش «تفکیک کلمات» (word splitting) را انجام نمی‌دهد \- عناصر درون فهرست همان‌گونه که هستند باقی می‌مانند، حتی اگر شامل فاصله یا تب باشند. .SS "مدیریت آرگومان‌ها (Argument Handling)" .sp یک فهرست مهم متغیر \fB$argv\fP است که شامل آرگومان‌های ارسالی به یک تابع یا اسکریپت می‌باشد. برای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX function myfunction echo $argv[1] echo $argv[3] end .EE .UNINDENT .UNINDENT .sp این تابع هر آرگومانی را که دریافت کند می‌گیرد و آرگومان‌های اول و سوم را چاپ می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > myfunction first second third first third > myfunction apple cucumber banana apple banana .EE .UNINDENT .UNINDENT .sp این موضوع آرگومان‌های مکانی (positional arguments) را پوشش می‌دهد، اما ابزارهای خط فرمان معمولاً گزینه‌ها و فلگ‌های گوناگونی دریافت می‌کنند و $argv آن‌ها را درهم‌آمیخته با آرگومان‌های مکانی نگه می‌دارد. روش معمول مدیریت آرگومان در یونیکس از گزینه‌های کوتاه (\fB\-h\fP، و همچنین گروه‌بندی‌شده مانند \fBls \-lah\fP)، گزینه‌های بلند (\fB\-\-help\fP) و امکان آرگومان گرفتن این گزینه‌ها (\fB\-\-color=auto\fP یا \fB\-\-position anywhere\fP یا \fBcomplete \-C\(dqgit \(dq\fP) و همچنین جداکننده \fB\-\-\fP برای مشخص کردن پایان گزینه‌ها پشتیبانی می‌کند. مدیریت دستی تمام این موارد دشوار و مستعد خطاست. .sp یک روش قوی‌تر برای مدیریت گزینه‌ها دستور توکار argparse \%<> است که گزینه‌های تعریف‌شده را بررسی کرده و درون متغیرهای مختلف قرار می‌دهد، به طوری که تنها آرگومان‌های مکانی در $argv باقی می‌مانند. در اینجا یک مثال ساده آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX function mybetterfunction # We tell argparse about \-h/\-\-help and \-s/\-\-second # \- these are short and long forms of the same option. # The \(dq\-\-\(dq here is mandatory, # it tells it from where to read the arguments. argparse h/help s/second \-\- $argv # exit if argparse failed because # it found an option it didn\(aqt recognize # \- it will print an error or return # If \-h or \-\-help is given, we print a little help text and return if set \-ql _flag_help echo \(dqmybetterfunction [\-h|\-\-help] [\-s|\-\-second] [ARGUMENT ...]\(dq return 0 end # If \-s or \-\-second is given, we print the second argument, # not the first and third. # (this is also available as _flag_s because of the short version) if set \-ql _flag_second echo $argv[2] else echo $argv[1] echo $argv[3] end end .EE .UNINDENT .UNINDENT .sp گزینه‌ها از $argv \fIحذف\fP خواهند شد، بنابراین اکنون $argv[2] دومین آرگومان \fIمکانی\fP است: .INDENT 0.0 .INDENT 3.5 .sp .EX > mybetterfunction first \-s second third second .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر درباره argparse، از جمله نحوه مدیریت آرگومان‌های گزینه‌ها، مستندات argparse \%<> را ببینید. .SS "متغیرهای PATH (PATH variables)" .sp متغیرهای مسیر (Path variables) نوع خاصی از متغیرها هستند که برای پشتیبانی از فهرست‌های مسیر تفکیک‌شده با دونقطه به کار می‌روند؛ از جمله \fBPATH\fP، \fBCDPATH\fP، \fBMANPATH\fP، \fBPYTHONPATH\fP، \fBLANGUAGE\fP (برای بومی‌سازی \%<>) و غیره. تمام متغیرهایی که نامشان به «PATH» ختم می‌شود (حساس به بزرگی و کوچکی حروف)، به صورت پیش‌فرض متغیر مسیر می‌شوند. .sp متغیرهای PATH مانند فهرست‌های عادی رفتار می‌کنند، با این تفاوت که به طور ضمنی بر اساس دونقطه به هم پیوند خورده یا تفکیک می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .EX set MYPATH 1 2 3 echo \(dq$MYPATH\(dq # 1:2:3 set MYPATH \(dq$MYPATH:4:5\(dq echo $MYPATH # 1 2 3 4 5 echo \(dq$MYPATH\(dq # 1:2:3:4:5 .EE .UNINDENT .UNINDENT .sp متغیرهای مسیر هنگام صادر شدن نیز در قالب دونقطه صادر می‌شوند؛ بنابراین با اجرای \fBset \-x MYPATH 1 2 3\fP، دستورات خارجی آن را به صورت \fB1:2:3\fP خواهند دید. .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-gx MYPATH /bin /usr/bin /sbin > env | grep MYPATH MYPATH=/bin:/usr/bin:/sbin .EE .UNINDENT .UNINDENT .sp این امر برای سازگاری با سایر ابزارهاست. یونیکس متغیرهایی با چندین عنصر ندارد؛ نزدیک‌ترین چیز به آن فهرست‌های تفکیک‌شده با دونقطه مانند \fBPATH\fP است. به دلایل واضح، این یعنی هیچ عنصری نمی‌تواند شامل نویسه \fB:\fP باشد. .sp متغیرها را می‌توان از طریق گزینه‌های \fB\-\-path\fP و \fB\-\-unpath\fP در دستور \fBset\fP به عنوان متغیر مسیر نشانه‌گذاری کرده یا از این حالت خارج ساخت. .SS "متغیرهای ویژه (Special variables)" .sp می‌توانید با تغییر مقادیر برخی متغیرها، تنظیمات فیش را دگرگون سازید. .INDENT 0.0 .TP .B PATH فهرستی از دایرکتوری‌ها که برای یافتن دستورات در آن‌ها جستجو می‌شود. این یک متغیر رایج یونیکس است که توسط سایر ابزارها نیز به کار می‌رود. .UNINDENT .INDENT 0.0 .TP .B CDPATH فهرستی از دایرکتوری‌ها که دستور توکار cd \%<> برای یافتن یک دایرکتوری جدید در آن‌ها جستجو می‌کند. .UNINDENT .INDENT 0.0 .TP .B Locale Variables متغیرهای محلی‌سازی مانند \fBLANG\fP، \fBLC_ALL\fP، \fBLC_MESSAGES\fP، \fBLC_NUMERIC\fP و \fBLC_TIME\fP تنظیمات زبان را برای پوسته و زیربرنامه‌ها مشخص می‌کنند. برای اطلاعات بیشتر، بخش متغیرهای محلی‌سازی و زبان وضعیت را ببینید \%<#\:status-language>\&. .UNINDENT .INDENT 0.0 .TP .B Color variables تعدادی متغیر که با پیشوندهای \fBfish_color\fP و \fBfish_pager_color\fP آغاز می‌شوند. برای اطلاعات بیشتر، بخش متغیرهای تغییر رنگ‌های برجسته‌سازی را ببینید \%<#\:variables-color>\&. .UNINDENT .INDENT 0.0 .TP .B fish_term24bit اگر این متغیر روی 0 تنظیم شود، فیش توالی‌های رنگی ۲۴ بیتی (true\-color) RGB را به عنوان خروجی ارسال نخواهد کرد؛ بلکه نزدیک‌ترین رنگ در پالت ۲۵۶ رنگ (یا پالت ۱۶ رنگ در صورتی که \fBfish_term256\fP برابر با 0 باشد) را استفاده می‌کند. دستور set_color \%<> را نیز ببینید. مقدار پیش‌فرض 1 است، اما به دلایل تاریخی، فیش در برخی از ترمینال‌هایی که پشتیبانی نکردن آن‌ها از رنگ‌های واقعی مشخص است، به صورت پیش‌فرض رفتاری مشابه مقدار 0 خواهد داشت. .UNINDENT .INDENT 0.0 .TP .B fish_term256 اگر این متغیر و همچنین \fBfish_term24bit\fP هر دو روی 0 تنظیم شوند، رنگ‌های RGB به پالت ۱۶ رنگ تنزل داده می‌شوند. همچنین اگر این متغیر 0 باشد، دستورات set_color \%<> مانند \fBset_color ff0000 red\fP رنگ نام‌گذاری‌شده را ترجیح خواهند داد. .UNINDENT .INDENT 0.0 .TP .B fish_ambiguous_width عرض محاسبه‌شده برای نویسه‌های با عرض مبهم (ambiguous\-width) را کنترل می‌کند. اگر ترمینال شما این نویسه‌ها را با عرض تک‌سلولی (حالت معمول) رندر می‌کند باید روی 1، و اگر با عرض دوسلولی رندر می‌کند باید روی 2 تنظیم شود. .UNINDENT .INDENT 0.0 .TP .B fish_emoji_width تعیین می‌کند که آیا فیش عرض ایموجی‌ها را ۲ سلول فرض کند یا ۱ سلول. این تنظیم از آن جهت لازم است که در استاندارد یونیکد ۹ مقدار صحیح از ۱ به ۲ تغییر یافت و برخی از ترمینال‌ها ممکن است از آن آگاه نباشند. اگر اشکالات بصری مربوط به ایموجی‌ها (یا سایر نویسه‌های «ویژه») مشاهده کردید، این مقدار را تنظیم کنید. پیش‌فرض آن 2 است. .UNINDENT .INDENT 0.0 .TP .B fish_autosuggestion_enabled فعال بودن پیشنهادهای خودکار autosuggestions \%<#\:autosuggestions> را کنترل می‌کند. برای غیرفعال‌سازی مقدار آن را 0 و برای فعال‌سازی مقداری دیگر تعیین کنید. به صورت پیش‌فرض فعال است. .UNINDENT .INDENT 0.0 .TP .B fish_transient_prompt اگر این مقدار روی 1 تنظیم شود، فیش اعلان‌های خط فرمان را با آرگومان \fB\-\-final\-rendering\fP پیش از اجرای خط فرمان بازترسیم می‌کند، که امکان تغییر آن را قبل از فرستاده شدن به تاریخچه اسکرول (scrollback) فراهم می‌سازد. این متغیر اعلان‌های گذرا (transient prompts) را فعال می‌کند \%<#\:transient-prompt>\&. .UNINDENT .INDENT 0.0 .TP .B fish_handle_reflow تعیین می‌کند که آیا فیش در هنگام تغییر اندازه ترمینال، باید خط فرمان را مجدداً ترسیم کند یا خیر. در ترمینال‌هایی که متن را مجدداً سازماندهی می‌کنند (reflow)، این ویژگی باید غیرفعال شود. برای فعال‌سازی مقدار را روی 1 و برای غیرفعال‌سازی روی مقداری دیگر قرار دهید. .UNINDENT .INDENT 0.0 .TP .B fish_key_bindings نام تابعی که کلیدهای میانبر ویرایشگر خط فرمان را تنظیم می‌کند \%<#\:editor>\&. .UNINDENT .INDENT 0.0 .TP .B fish_escape_delay_ms مدت زمانی (بر حسب میلی‌ثانیه) را تعیین می‌کند که فیش پس از دریافت نویسه Escape، برای دریافت کلید بعدی منتظر می‌ماند تا فشردن کلید Escape را از ابتدای یک توالی گریز (escape sequence) تمیز دهد. مقدار پیش‌فرض 30 میلی‌ثانیه است. افزایش آن زمان تأخیر را بالا می‌برد اما فشردن Escape به جای Alt را برای کلیدهای ترکیبی Alt+character ممکن می‌سازد. برای اطلاعات بیشتر، فصل مربوطه را در مستندات bind ببینید \%<#\:cmd-bind-escape>\&. .UNINDENT .INDENT 0.0 .TP .B fish_sequence_key_delay_ms مدت زمانی را تعیین می‌کند که فیش پس از دریافت کلیدی که بخشی از یک توالی طولانی‌تر است منتظر کلید بعدی می‌ماند تا ابهام را برطرف کند. برای نمونه اگر \fB\ecx\ece\fP را برای باز کردن ویرایشگر نگاشت کرده باشید، فیش این مدت زمان را برای دریافت ctrl\-e پس از ctrl\-x صبر می‌کند. در صورت پایان مهلت، با آن به عنوان ctrl\-x رفتار می‌کند (که به طور پیش‌فرض خط فرمان جاری را در حافظه کلیپ‌بورد کپی می‌کند). توالی‌های کلید را نیز ببینید \%<#\:interactive-key-sequences>\&. .UNINDENT .INDENT 0.0 .TP .B fish_complete_path محل‌هایی را که فیش برای تکمیل خودکار جستجو می‌کند تعیین می‌نماید. هنگام تلاش برای تکمیل خودکار یک دستور، فیش در دایرکتوری‌های مشخص‌شده در این متغیر به دنبال فایل‌ها می‌گردد. .UNINDENT .INDENT 0.0 .TP .B fish_cursor_selection_mode کنترل می‌کند که آیا انتخاب متن شامل نویسه زیر مکان‌نما می‌شود یا خیر (بخش کپی و پیست را ببینید \%<#\:killring>). .UNINDENT .INDENT 0.0 .TP .B fish_function_path محل جستجوی فیش برای توابع را مشخص می‌کند. هنگام بارگذاری خودکار یک تابع، فیش فایل‌ها را درون این دایرکتوری‌ها جستجو خواهد کرد. .UNINDENT .INDENT 0.0 .TP .B fish_greeting پیام خوشامدگویی که هنگام راه‌اندازی چاپ می‌شود. این پیام توسط تابعی با همین نام چاپ می‌شود که برای تغییرات پیچیده‌تر می‌توان آن را بازنویسی کرد (دستور funced \%<> را ببینید). .UNINDENT .INDENT 0.0 .TP .B fish_history نام نشست تاریخچه جاری. در صورت تنظیم، تمامی دستورات بعدی درون یک نشست تعاملی فیش در فایلی مجزا که با مقدار این متغیر مشخص می‌شود ثبت خواهند شد. در صورت عدم تنظیم، نام نشست پیش‌فرض «fish» استفاده می‌شود. اگر روی یک رشته خالی تنظیم شود، تاریخچه روی دیسک ذخیره نخواهد شد (اما همچنان درون نشست تعاملی در دسترس است). .UNINDENT .INDENT 0.0 .TP .B fish_trace در صورت مقداردهی و خالی نبودن، باعث می‌شود فیش دستورات را پیش از اجرا چاپ کند، مشابه \fBset \-x\fP در بش. خروجی ردگیری به مسیری که توسط گزینه \fI\-\-debug\-output\fP یا متغیر \fBFISH_DEBUG_OUTPUT\fP مشخص شده نوشته می‌شود. به طور پیش‌فرض به خروجی خطای استاندارد (stderr) ارسال می‌گردد. تنظیم آن روی \fBall\fP همچنین اجرای کلیدهای میانبر، گرداننده‌های رویداد و توابع اعلان خط فرمان و عنوان پنجره را نیز ردگیری می‌کند. .UNINDENT .INDENT 0.0 .TP .B FISH_DEBUG دسته‌بندی‌های اشکال‌زدایی را که \fBfish\fP برای خروجی فعال می‌سازد کنترل می‌کند، مشابه گزینه \fB\-\-debug\fP\&. .UNINDENT .INDENT 0.0 .TP .B FISH_DEBUG_OUTPUT فایلی را برای هدایت خروجی اشکال‌زدایی به آن مشخص می‌کند. .UNINDENT .INDENT 0.0 .TP .B fish_user_paths فهرستی از دایرکتوری‌ها که به ابتدای \fBPATH\fP افزوده می‌شوند. این می‌تواند یک متغیر جهانی (universal) باشد. .UNINDENT .INDENT 0.0 .TP .B umask ماسک ایجاد فایل جاری. روش ارجح برای تغییر متغیر umask استفاده از تابع umask \%<> است. تلاش برای تنظیم umask روی مقداری نامعتبر همواره با شکست مواجه می‌شود. .UNINDENT .INDENT 0.0 .TP .B SHELL_PROMPT_PREFIX در صورت تنظیم، این رشته به طور خودکار به ابتدای اعلان خط فرمان چپ افزوده می‌شود. این یک متغیر محیطی استاندارد است که ممکن است توسط ابزارهایی مانند \fBrun0\fP در systemd تنظیم شود تا نشست‌های ویژه پوسته را نشان دهد. .UNINDENT .INDENT 0.0 .TP .B SHELL_PROMPT_SUFFIX در صورت تنظیم، این رشته به طور خودکار به انتهای اعلان خط فرمان چپ افزوده می‌شود. این یک متغیر محیطی استاندارد است که ممکن است توسط ابزارهایی مانند \fBrun0\fP در systemd تنظیم شود تا نشست‌های ویژه پوسته را نشان دهد. .UNINDENT .INDENT 0.0 .TP .B SHELL_WELCOME در صورت تنظیم، این رشته هنگام شروع به کار یک پوسته تعاملی، پس از پیام خوشامدگویی نمایش داده می‌شود. این متغیر ممکن است توسط ابزارهایی نظیر \fBrun0\fP برای نمایش اطلاعات نشست تنظیم شود. .UNINDENT .INDENT 0.0 .TP .B BROWSER مرورگر وب دلخواه شما. اگر این متغیر تنظیم شده باشد، فیش به جای مرورگر پیش‌فرض سیستم از مرورگر مشخص‌شده برای نمایش مستندات فیش استفاده خواهد کرد. .UNINDENT .sp فیش همچنین اطلاعات تکمیلی را از طریق مقادیر برخی متغیرهای محیطی فراهم می‌کند. بیشتر این متغیرها فقط‌خواندنی هستند و مقدار آن‌ها را نمی‌توان با \fBset\fP تغییر داد. .INDENT 0.0 .TP .B _ نام دستوری که در حال حاضر در حال اجرا است (البته این متغیر منسوخ شده و استفاده از \fBstatus current\-command\fP ترجیح داده می‌شود). .UNINDENT .INDENT 0.0 .TP .B argv فهرستی از آرگومان‌های ارسالی به پوسته یا تابع. متغیر \fBargv\fP تنها هنگام فراخوانی درون تابع تعریف شده است، یا اگر فیش همراه با فهرستی از آرگومان‌ها اجرا شده باشد، مانند \fBfish myscript.fish foo bar\fP\&. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B argv_opts دستور argparse \%<> این متغیر را روی فهرستی از گزینه‌های با موفقیت تجزیه‌شده، از جمله آرگومان‌های گزینه‌ها، تنظیم می‌کند. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B CMD_DURATION مدت زمان اجرای آخرین دستور بر حسب میلی‌ثانیه. .UNINDENT .INDENT 0.0 .TP .B COLUMNS and LINES اندازه فعلی ترمینال بر حسب ارتفاع و عرض. این مقادیر تنها زمانی توسط فیش استفاده می‌شوند که سیستم‌عامل اندازه ترمینال را گزارش نکند. در این حالت هر دو متغیر باید تنظیم شوند، در غیر این صورت مقدار پیش‌فرض 80x24 استفاده خواهد شد. با تغییر اندازه پنجره، این متغیرها به‌روزرسانی می‌شوند. .UNINDENT .INDENT 0.0 .TP .B fish_kill_signal سیگنالی که آخرین کار پیش‌زمینه را پایان داده است، یا 0 در صورتی که کار به صورت عادی خاتمه یافته باشد. .UNINDENT .INDENT 0.0 .TP .B fish_killring فهرستی از ورودی‌ها در حلقه حذف (kill ring) متن‌های بریده‌شده در فیش \%<#\:killring>\&. .UNINDENT .INDENT 0.0 .TP .B fish_read_limit میزان بایتی که فیش با دستور read \%<> یا در یک جایگزینی دستور پردازش خواهد کرد. .UNINDENT .INDENT 0.0 .TP .B fish_pid شناسه فرآیند (PID) پوسته. .UNINDENT .INDENT 0.0 .TP .B fish_terminal_color_theme یک متغیر فقط‌خواندنی؛ هنگامی که ترمینال به ترتیب از تم رنگی روشن یا تیره استفاده می‌کند روی \fBlight\fP یا \fBdark\fP تنظیم می‌شود؛ چنانچه ترمینال رنگ‌های خود را گزارش نکند، روی \fBunknown\fP قرار می‌گیرد \%<#\:term-compat-query-background-color>\&. همانند status terminal \%<#\:status-terminal>، این متغیر تنها پس از نمایش نخستین اعلان خط فرمان تعاملی مقداردهی می‌شود. از این متغیر در یک گرداننده رویداد \-\-on\-variable برای به‌روزرسانی متغیرهای برجسته‌سازی نحو \%<#\:syntax-highlighting> هر زمان که تم رنگی ترمینال دگرگون شود استفاده می‌گردد. برای نحوه تعیین گونه‌های \fBlight\fP و \fBdark\fP در تم خود به اینجا مراجعه کنید \%<#\:fish-config-theme-files>\&. .UNINDENT .INDENT 0.0 .TP .B history فهرستی شامل آخرین دستوراتی که وارد شده‌اند. .UNINDENT .INDENT 0.0 .TP .B HOME دایرکتوری خانگی کاربر. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B hostname نام میزبان (hostname) سیستم. .UNINDENT .INDENT 0.0 .TP .B IFS جداکننده فیلد داخلی که برای تفکیک کلمات با دستور توکار read \%<> استفاده می‌شود. قرار دادن آن روی رشته خالی، تفکیک خطوط در جایگزینی دستور را نیز غیرفعال می‌سازد. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B last_pid شناسه فرآیند (PID) آخرین فرآیند پس‌زمینه. .UNINDENT .INDENT 0.0 .TP .B PWD دایرکتوری کاری جاری. .UNINDENT .INDENT 0.0 .TP .B pipestatus فهرستی از وضعیت‌های خروج تمامی فرآیندهایی که آخرین پایپ اجراشده را تشکیل داده‌اند. وضعیت خروج را ببینید. .UNINDENT .INDENT 0.0 .TP .B SHLVL میزان سطح تودرتویی پوسته‌ها. فیش این مقدار را در پوسته‌های تعاملی افزایش می‌دهد، در غیر این صورت صرفاً آن را منتقل می‌کند. .UNINDENT .INDENT 0.0 .TP .B status وضعیت خروج آخرین کار پیش‌زمینه‌ای که پایان یافته است. اگر کار از طریق یک سیگنال متوقف شده باشد، وضعیت خروج برابر با ۱۲۸ به علاوه شماره سیگنال خواهد بود. .UNINDENT .INDENT 0.0 .TP .B status_generation شمارنده «نسل» متغیر \fB$status\fP\&. این مقدار تنها زمانی افزایش می‌یابد که دستور قبلی یک وضعیت صریح تولید کرده باشد (برای مثال، کارهای پس‌زمینه این مقدار را افزایش نمی‌دهند). .UNINDENT .INDENT 0.0 .TP .B USER نام کاربری جاری. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B EUID شناسه کاربری مؤثر جاری، که توسط فیش در هنگام راه‌اندازی تنظیم می‌شود. این متغیر قابل تغییر است. .UNINDENT .INDENT 0.0 .TP .B version نسخه فیش در حال اجرا (برای سازگاری با گذشته به صورت \fBFISH_VERSION\fP نیز در دسترس است). .UNINDENT .sp به عنوان یک قرارداد، معمولاً برای متغیرهای صادرشده از حروف بزرگ و برای متغیرهای صادرنشده از حروف کوچک استفاده می‌شود (\fBCMD_DURATION\fP به دلایل تاریخی یک استثنا است). این قاعده توسط فیش تحمیل نمی‌شود، اما تمایز گذاشتن میان متغیرهای صادرشده و صادرنشده از طریق حروف‌بندی یک شیوه کدنویسی پسندیده است. .sp فیش همچنین از برخی متغیرها به صورت داخلی استفاده می‌کند که نام آن‌ها معمولاً با \fB__fish\fP آغاز می‌شود. این متغیرها داخلی هستند و معمولاً نباید مستقیماً تغییر داده شوند. .SS "متغیر وضعیت (The status variable)" .sp هر گاه فرآیندی به پایان می‌رسد، یک وضعیت خروج (exit status) به برنامه‌ای که آن را اجرا کرده (معمولاً پوسته) بازگردانده می‌شود. این وضعیت خروج یک عدد صحیح است که به برنامه فراخواننده می‌گوید اجرای دستور چگونه پیش رفته است. به طور کلی، وضعیت خروج صفر یعنی دستور بدون مشکل اجرا شده است، اما وضعیت خروج غیرصفر به معنای بروز نوعی خطا یا مشکل است. .sp فیش وضعیت خروج آخرین فرآیند از آخرین کاری را که خاتمه یافته است در متغیر \fBstatus\fP ذخیره می‌کند. .sp اگر فیش هنگام اجرای یک دستور با مشکلی روبرو شود، متغیر وضعیت ممکن است روی مقداری خاص تنظیم گردد: .INDENT 0.0 .IP \(bu 2 0 عموماً وضعیت خروج دستوراتی است که عملیات درخواستی را با موفقیت انجام داده‌اند. .IP \(bu 2 1 عموماً وضعیت خروج دستوراتی است که در اجرای عملیات درخواستی شکست خورده‌اند. .IP \(bu 2 121 عموماً وضعیت خروج دستوراتی است که آرگومان‌های نامعتبر به آن‌ها داده شده است. .IP \(bu 2 123 یعنی دستور اجرا نشد زیرا نام دستور حاوی نویسه‌های نامعتبر بود. .IP \(bu 2 124 یعنی دستور اجرا نشد زیرا هیچ‌یک از نویسه‌های عام در دستور به نتیجه‌ای منطبق نشدند. .IP \(bu 2 125 یعنی با اینکه فایلی اجرایی با نام مشخص‌شده یافت شد، سیستم‌عامل نتوانست دستور را اجرا کند. .IP \(bu 2 126 یعنی با اینکه فایلی با نام مشخص‌شده یافت شد، اما قابل اجرا نبود. .IP \(bu 2 127 یعنی هیچ تابع، دستور توکار یا دستور خارجی با این نام یافت نشد. .UNINDENT .sp اگر فرآیندی با دریافت یک سیگنال پایان یابد، وضعیت خروج برابر با ۱۲۸ به علاوه شماره آن سیگنال خواهد بود. .sp وضعیت را می‌توان با کلیدواژه not \%<> (یا \fB!\fP) نفی کرد که در شرط‌ها بسیار کاربردی است. این عمل وضعیت 0 را به 1 و هر وضعیت غیرصفری را به 0 تبدیل می‌کند. .sp همچنین متغیر \fB$pipestatus\fP وجود دارد که فهرستی از تمامی مقادیر \fBstatus\fP فرآیندهای درون یک پایپ است. یک تفاوت این است که not \%<> بر روی \fB$status\fP اعمال می‌شود، اما روی \fB$pipestatus\fP اثر ندارد زیرا باعث از دست رفتن اطلاعات می‌گردد. .sp برای نمونه: .INDENT 0.0 .INDENT 3.5 .sp .EX not cat file | grep \-q fish echo status is: $status pipestatus is $pipestatus .EE .UNINDENT .UNINDENT .sp در اینجا \fB$status\fP نمایانگر وضعیت دستور \fBgrep\fP است که در صورت یافتن مورد تطبیق 0 برمی‌گرداند، و با \fBnot\fP نفی می‌شود (بنابراین در صورت یافتن 1 و در غیر این صورت 0 خواهد بود). متغیر \fB$pipestatus\fP وضعیت‌های دستور \fBcat\fP (که مثلاً در صورت نیافتن فایل مقداری غیرصفر برمی‌گرداند) و \fBgrep\fP را بدون عمل نفی نشان می‌دهد. .sp بنابراین اگر هر دو دستور \fBcat\fP و \fBgrep\fP موفق شوند، \fB$status\fP به دلیل وجود \fBnot\fP برابر با 1 خواهد بود، در حالی که \fB$pipestatus\fP برابر با 0 و 0 خواهد شد. .sp این احتمال وجود دارد که دستور اول شکست بخورد در حالی که دستور دوم با موفقیت انجام شود. یک نمونه متداول زمانی است که برنامه دوم زودتر از موعد به کار خود پایان دهد. .sp برای مثال اگر خط لوله‌ای به این شکل داشته باشید: .INDENT 0.0 .INDENT 3.5 .sp .EX cat file1 file2 | head \-n 50 .EE .UNINDENT .UNINDENT .sp این دستور به \fBcat\fP می‌گوید دو فایل «file1» و «file2» را پشت سر هم چاپ کند، و دستور \fBhead\fP تنها ۵۰ خط اول را نمایش می‌دهد. در این وضعیت ممکن است مکرراً چنین وضعیتی را مشاهده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > cat file1 file2 | head \-n 50 # 50 lines of output > echo $pipestatus 141 0 .EE .UNINDENT .UNINDENT .sp در اینجا مقدار «141» نشان می‌دهد که \fBcat\fP با سیگنال شماره ۱۳ (128 + 13 == 141) یعنی سیگنال \fBSIGPIPE\fP کشته شده است. همچنین می‌توانید از \fBfish_kill_signal\fP برای دیدن شماره سیگنال استفاده کنید. دلیل این رخداد این است که دستور هنوز در حال کار بود و سپس \fBhead\fP لوله را بست؛ در نتیجه \fBcat\fP سیگنالی دریافت کرد که آن را نادیده نگرفت و به این ترتیب پایان یافت. .sp اینکه آیا \fBcat\fP در اینجا با یک SIGPIPE مواجه می‌شود یا خیر به طول فایل و حجم داده‌ای که در یک لحظه می‌نویسد بستگی دارد، بنابراین ممکن است بسته به پیاده‌سازی، متغیر pipestatus را به صورت «0 0» مشاهده کنید. این یک مسئله عمومی در یونیکس است و مختص فیش نیست. برخی از پوسته‌ها از قابلیتی به نام «pipefail» برخوردارند که در صورت شکست هر یک از فرآیندهای لوله کل آن را ناموفق اعلام می‌کنند، و این موضوع چالشی بزرگ برای آن ویژگی محسوب می‌شود. .SS "متغیرهای محلی‌سازی (Locale Variables)" .sp تنظیمات محلی‌سازی (locale) یک برنامه، مجموعه تنظیمات زبانی و منطقه‌ای آن است. در یونیکس، این موارد از چندین دسته‌بندی تشکیل شده‌اند. دسته‌بندی‌های مورد استفاده در فیش عبارتند از: .INDENT 0.0 .TP .B LANG این متغیر محیطی متداول برای تعیین زبان و محیط محلی است. کاربر می‌تواند این متغیر را برای بیان زبانی که به آن صحبت می‌کند، منطقه خود، و کدگذاری نویسه‌ها تنظیم نماید. بخش کدگذاری نادیده گرفته می‌شود؛ فیش همیشه UTF\-8 را در نظر می‌گیرد. مقادیر واقعی به پلتفرم کاربر وابسته‌اند، به جز مقادیر خاصی نظیر \fBC\fP یا \fBPOSIX\fP\&. .sp مقدار \fBLANG\fP برای هر دسته‌بندی استفاده می‌شود مگر آنکه متغیر اختصاصی آن دسته‌بندی یا متغیر \fBLC_ALL\fP تنظیم شده باشد. بنابراین معمولاً تنها کافی است LANG را تنظیم کنید. .sp مقادیر نمونه شامل \fBen_US.UTF\-8\fP برای انگلیسی آمریکایی یا \fBde_AT.UTF\-8\fP برای آلمانی اتریشی است. سیستم‌عامل شما ممکن است دستوری به نام \fBlocale\fP داشته باشد که با اجرای \fBlocale \-a\fP می‌توانید فهرستی از محیط‌های محلی تعریف‌شده را مشاهده کنید. .UNINDENT .INDENT 0.0 .TP .B LANGUAGE با این متغیر همانند \fBLC_MESSAGES\fP رفتار می‌شود، با این تفاوت که می‌تواند چندین مقدار را نگهداری کند، که امکان تعیین فهرستی اولویت‌بندی‌شده از زبان‌ها را برای ترجمه فراهم می‌سازد. این یک متغیر مسیر (PATH variable) است، مشابه سیستم GNU gettext \%\&. .sp شناسه‌های زبانی بدون منطقه مشخص (مانند \fBzh\fP) باعث می‌شوند تمامی گونه‌های موجود از آن زبان به ترتیبی اختیاری امتحان شوند. در این مثال، ممکن است ابتدا پیام‌ها در کاتالوگ \fBzh_CN\fP و سپس در \fBzh_TW\fP جستجو شوند، یا برعکس. این رفتار با GNU gettext که از گونه «پیش‌فرض» زبان استفاده می‌کند تفاوت دارد. اگر گونه خاصی را ترجیح می‌دهید، آن را جلوتر در فهرست مشخص کنید، برای مثال \fBzh_TW:zh\fP در صورتی که زبان ترجیحی شما \fBzh_TW\fP باشد و هر گونه دیگری از \fBzh\fP را به انگلیسی پیش‌فرض ترجیح دهید. اگر \fBzh_TW\fP تنها گونه‌ای از \fBzh\fP است که می‌خواهید، مشخص کردن \fBzh_TW\fP در متغیر \fBLANGUAGE\fP موجب می‌شود پیام‌هایی که در \fBzh_TW\fP در دسترس نیستند به زبان انگلیسی نمایش یابند. .sp دستور توکار _ (زیرخط) را نیز ببینید \%<>\&. .UNINDENT .INDENT 0.0 .TP .B LC_ALL متغیر \fBLANG\fP و تمامی متغیرهای دیگر \fBLC_*\fP را بازنویسی می‌کند. لطفاً از \fBLC_ALL\fP صرفاً به عنوان یک بازنویسی موقت استفاده کنید. .UNINDENT .INDENT 0.0 .TP .B LC_MESSAGES زبانی را که پیام‌ها به آن نمایش داده می‌شوند مشخص می‌کند؛ دستور توکار _ (زیرخط) را ببینید \%<>\&. .UNINDENT .INDENT 0.0 .TP .B LC_NUMERIC تنظیمات محلی را برای قالب‌بندی اعداد مشخص می‌کند \%<>\&. .UNINDENT .INDENT 0.0 .TP .B LC_TIME نحوه نمایش تاریخ و زمان را مشخص می‌کند. در دستور توکار history استفاده می‌شود \%<#\:history-show-time>\&. .UNINDENT .SH "دستورات توکار (BUILTIN COMMANDS)" .sp پوسته فیش شامل تعدادی دستور است که مستقیماً درون خود پوسته پیاده‌سازی شده‌اند. ما این‌ها را «دستورات توکار» (builtins) می‌نامیم. این موارد شامل موارد زیر است: .INDENT 0.0 .IP \(bu 2 دستورات توکاری که وضعیت پوسته را دستکاری می‌کنند \- مانند cd \%<> که دایرکتوری را تغییر می‌دهد، و set \%<> که متغیرها را مقداردهی می‌کند. .IP \(bu 2 دستورات توکار برای کار با داده‌ها، مانند string \%<> برای رشته‌ها و math \%<> برای اعداد، count \%<> برای شمارش خطوط یا آرگومان‌ها، و path \%<> برای مدیریت مسیرها. .IP \(bu 2 دستور status \%<> برای جویا شدن از وضعیت پوسته. .IP \(bu 2 دستورات printf \%<> و echo \%<> برای تولید خروجی. .IP \(bu 2 دستور test \%<> برای بررسی شرط‌ها. .IP \(bu 2 دستور argparse \%<> برای تجزیه آرگومان‌های توابع. .IP \(bu 2 دستور source \%<> برای خواندن یک اسکریپت در پوسته جاری (تا تغییرات متغیرها باقی بمانند) و eval \%<> برای اجرای یک رشته در قالب اسکریپت. .IP \(bu 2 دستور random \%<> برای دریافت اعداد تصادفی یا انتخاب یک عنصر تصادفی از یک فهرست. .IP \(bu 2 دستور read \%<> برای خواندن ورودی از پایپ یا ترمینال. .UNINDENT .sp برای مشاهده فهرست تمامی دستورات توکار، از \fBbuiltin \-n\fP استفاده کنید. .sp برای دیدن فهرستی از تمامی دستورات توکار، توابع و دستورات همراه با فیش، فهرست دستورات را ببینید \%<>\&. مستندات آن‌ها همچنین با استفاده از سوییچ \fB\-\-help\fP در دسترس است. .SH "جستجوی دستور (COMMAND LOOKUP)" .sp هنگامی که به فیش گفته می‌شود برنامه‌ای را اجرا کند، چندین مرحله را برای یافتن آن طی می‌کند. .sp اگر نام شامل یک کاراکتر \fB/\fP باشد، فیش تلاش می‌کند فایل مورد نظر را با شروع از دایرکتوری جاری اجرا کند. .sp اگر شامل \fB/\fP نباشد، می‌تواند یک تابع، دستور توکار یا یک دستور خارجی باشد؛ بنابراین فیش مراحل جستجوی کامل را به این ترتیب طی می‌کند: .INDENT 0.0 .IP 1. 3 تلاش می‌کند آن را به عنوان یک تابع حل‌وفصل کند: .INDENT 3.0 .IP \(bu 2 اگر تابع از قبل شناخته شده باشد، از همان استفاده می‌کند. .IP \(bu 2 اگر فایلی با همان نام و پسوند «.fish» در \fBfish_function_path\fP موجود باشد، آن را بارگذاری می‌کند (اگر بیش از یک فایل وجود داشته باشد، فقط اولی استفاده می‌شود). .IP \(bu 2 اگر تابع اکنون تعریف شده باشد، از آن استفاده می‌کند. .UNINDENT .IP 2. 3 تلاش می‌کند آن را به عنوان یک دستور توکار حل‌وفصل کند. .IP 3. 3 تلاش می‌کند فایلی اجرایی را در \fBPATH\fP بیابد: .INDENT 3.0 .IP \(bu 2 اگر فایلی پیدا کند، به هسته (کرنل) دستور می‌دهد آن را اجرا کند. .IP \(bu 2 اگر هسته بداند چگونه فایل را اجرا کند (مثلاً از طریق خط شه‌بنگ \fB#!\fP مانند \fB#!/bin/sh\fP یا \fB#!/usr/bin/python\fP)، آن را اجرا می‌کند. .IP \(bu 2 اگر هسته گزارش دهد که به دلیل نبود مفسر نتوانسته آن را اجرا کند، و فایل از یک بررسی اولیه موفق بیرون آید، فیش به \fB/bin/sh\fP می‌گوید آن را اجرا کند. .UNINDENT .UNINDENT .sp اگر هیچ‌یک از این روش‌ها کارساز نباشد، فیش تابع fish_command_not_found \%<> را اجرا کرده و متغیر \fBstatus\fP را روی 127 قرار می‌دهد. .sp می‌توانید از دستور type \%<> برای دیدن نحوه حل‌وفصل یک دستور توسط فیش استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > type \-\-short \-\-all echo echo is a builtin echo is /usr/bin/echo .EE .UNINDENT .UNINDENT .SH "درخواست ورودی از کاربر (QUERYING FOR USER INPUT)" .sp گاهی می‌خواهید از کاربر ورودی بگیرید، مثلاً برای تأیید یک عمل. این کار با دستور توکار read \%<> انجام می‌شود. .sp بیایید مثالی مطرح کنیم. این تابع فایل‌های درون تمام دایرکتوری‌هایی را که به عنوان آرگومان دریافت کرده با الگوهای عام تطبیق می‌دهد، و اگر بیش از ۵ مورد باشند، از کاربر می‌پرسد که آیا مایل به دیدن آن‌ها هست یا خیر؛ البته تنها در صورتی که به یک ترمینال متصل باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX function show_files # This will glob on all arguments. Any non\-directories will be ignored. set \-l files $argv/* # If there are more than 5 files if test (count $files) \-gt 5 # and both stdin (for reading input) # and stdout (for writing the prompt) # are terminals and isatty stdin and isatty stdout # Keep asking until we get a valid response while read \-\-nchars 1 \-l response \-\-prompt\-str=\(dqAre you sure? (y/n)\(dq or return 1 # if the read was aborted with ctrl\-c/ctrl\-d switch $response case y Y echo Okay # We break out of the while and go on with the function break case n N # We return from the function without printing echo Not showing return 1 case \(aq*\(aq # We go through the while loop and ask again echo Not valid input continue end end end # And now we print the files printf \(aq%s\en\(aq $files end .EE .UNINDENT .UNINDENT .sp اگر این تابع را به صورت \fBshow_files /\fP اجرا کنید، به احتمال زیاد مرتباً از شما سؤال می‌پرسد تا زمانی که Y/y یا N/n را فشار دهید. اگر آن را به صورت \fBshow_files / | cat\fP اجرا کنید، بدون پرسش فایل‌ها را چاپ می‌کند. و اگر آن را به صورت \fBshow_files .\fP اجرا کنید، ممکن است بدون پرسش محتوا را چاپ کند زیرا تعداد فایل‌ها کمتر از پنج است. .SH "نام‌های متغیر و تابع پوسته (SHELL VARIABLE AND FUNCTION NAMES)" .sp نام‌هایی که به متغیرها و توابع داده می‌شوند (شناسه‌ها یا identifiers) باید از قواعد معینی پیروی کنند: .INDENT 0.0 .IP \(bu 2 نام یک متغیر نمی‌تواند خالی باشد. تنها می‌تواند شامل حروف، ارقام و زیرخط باشد. می‌تواند با هر یک از این نویسه‌ها آغاز شده یا پایان یابد. .IP \(bu 2 نام یک تابع نمی‌تواند خالی باشد. نباید با خط تیره («\-») شروع شود و نباید شامل اسلش («/») باشد. تمامی نویسه‌های دیگر، از جمله فاصله، معتبر هستند. همچنین نام تابع نمی‌تواند هم‌نام با یک کلیدواژه رزروشده یا یک دستور توکار حیاتی مانند \fBif\fP یا \fBset\fP باشد. .IP \(bu 2 نام حالت نگاشت کلید (مانند \fBbind \-m abc ...\fP) باید یک نام متغیر معتبر باشد. .UNINDENT .sp سایر موارد محدودیت‌های دیگری دارند. برای نمونه آنچه برای نام فایل‌ها مجاز است به سیستم شما بستگی دارد، اما حداقل نمی‌توانند حاوی «/» (چون جداکننده مسیر است) یا بایت تهی (NULL) باشند (چون یونیکس رشته‌ها را با آن خاتمه می‌دهد). .SH "فایل‌های پیکربندی (CONFIGURATION FILES)" .sp هنگام راه‌اندازی فیش، فایل‌های پیکربندی آن خوانده و اجرا می‌شوند. محل این فایل‌ها به پیکربندی ساخت و متغیرهای محیطی وابسته است. .sp فایل اصلی \fB~/.config/fish/config.fish\fP است (یا به طور دقیق‌تر \fB$XDG_CONFIG_HOME/fish/config.fish\fP). .sp فایل‌های پیکربندی به این ترتیب اجرا می‌شوند: .INDENT 0.0 .IP \(bu 2 قطعه‌کدهای پیکربندی (با نام \fB*.fish\fP) در این دایرکتوری‌ها: .INDENT 2.0 .IP \(bu 2 \fB$__fish_config_dir/conf.d\fP (به صورت پیش‌فرض، \fB~/.config/fish/conf.d/\fP) .IP \(bu 2 \fB$__fish_sysconf_dir/conf.d\fP (به صورت پیش‌فرض، \fB/etc/fish/conf.d/\fP) .IP \(bu 2 دایرکتوری‌هایی برای نرم‌افزارهای دیگر جهت عرضه قطعه‌کدهای پیکربندی خود: .INDENT 2.0 .IP \(bu 2 دایرکتوری‌های زیرمجموعه \fB$__fish_user_data_dir\fP (معمولاً \fB~/.local/share/fish\fP، کنترل‌شده با متغیر محیطی \fBXDG_DATA_HOME\fP) .IP \(bu 2 دایرکتوری \fBfish/vendor_conf.d\fP درون دایرکتوری‌های فهرست‌شده در \fB$XDG_DATA_DIRS\fP (پیش‌فرض \fB/usr/share/fish/vendor_conf.d\fP و \fB/usr/local/share/fish/vendor_conf.d\fP) .UNINDENT .sp این دایرکتوری‌ها از طریق \fB$__fish_vendor_confdirs\fP نیز در دسترس هستند. توجه داشته باشید که تغییر این متغیر در یک پوسته در حال اجرا اثری نخواهد داشت، زیرا تا آن لحظه دایرکتوری‌ها خوانده شده‌اند. .UNINDENT .sp اگر چندین فایل هم‌نام در این دایرکتوری‌ها وجود داشته باشد، تنها نخستین مورد اجرا می‌شود. آن‌ها به ترتیب نام فایل و با مرتب‌سازی طبیعی (مانند الگوهای عام) اجرا می‌شوند (یعنی «01» قبل از «2» مرتب می‌شود). .IP \(bu 2 فایل‌های پیکربندی سراسری سیستم، که مدیران سیستم می‌توانند مقداردهی اولیه برای تمامی کاربران را در آن بگنجانند \- مشابه \fB/etc/profile\fP در پوسته‌های سبک پازیکس \- در \fB$__fish_sysconf_dir\fP (معمولاً \fB/etc/fish/config.fish\fP). .IP \(bu 2 پیکربندی کاربر، معمولاً در \fB~/.config/fish/config.fish\fP (کنترل‌شده با متغیر محیطی \fBXDG_CONFIG_HOME\fP، و قابل دسترسی با نام \fB$__fish_config_dir\fP). .UNINDENT .sp فایل \fB~/.config/fish/config.fish\fP \fIپس از\fP قطعه‌کدها بارگذاری می‌شود. این ترتیب به شما اجازه می‌دهد قطعه‌کدها را کپی کرده و برخی رفتارهای آن‌ها را بازنویسی کنید. .sp این فایل‌ها هنگام شروع به کار هر پوسته اجرا می‌شوند. اگر می‌خواهید دستوری را تنها هنگام راه‌اندازی یک پوسته تعاملی اجرا کنید، از وضعیت خروج دستور \fBstatus \-\-is\-interactive\fP برای تشخیص تعاملی بودن پوسته بهره ببرید. اگر می‌خواهید دستوری را فقط در پوسته ورود (login shell) اجرا کنید، از \fBstatus \-\-is\-login\fP استفاده نمایید. این کار سرعت راه‌اندازی پوسته‌های غیرتعاملی یا غیرورودی را افزایش می‌دهد. .sp اگر در حال توسعه برنامه‌ای دیگر هستید، ممکن است بخواهید پیکربندی برای تمامی کاربران فیش روی سیستم بیفزایید. این کار توصیه نمی‌شود؛ اگر با دقت نوشته نشود ممکن است اثرات جانبی داشته باشد یا راه‌اندازی پوسته را کند کند. علاوه بر این، کاربران سایر پوسته‌ها از پیکربندی مختص فیش بهره‌مند نخواهند شد. با این حال اگر ضروری باشد، می‌توانید آن‌ها را در دایرکتوری پیکربندی «تأمین‌کننده» (vendor) نصب کنید. از آنجا که این مسیر در سیستم‌های مختلف متغیر است، باید از \fBpkg\-config\fP برای یافتن آن استفاده کرد: \fBpkg\-config \-\-variable confdir fish\fP\&. .sp برای یکپارچه‌سازی با سیستم، فیش همچنین فایلی به نام \fB__fish_build_paths.fish\fP ارائه می‌دهد. این فایل می‌تواند هنگام ساخت شخصی‌سازی شود، مثلاً در صورتی که سیستم شما به مسیرهای خاصی نیاز داشته باشد. .SH "فلگ‌های ویژگی‌های آینده (FUTURE FEATURE FLAGS)" .sp فلگ‌های ویژگی روشی است که فیش برای اعمال تغییراتی که ممکن است اسکریپت‌ها را بشکنند استفاده می‌کند. تغییرات شکننده ابتدا به صورت اختیاری (opt\-in) معرفی می‌شوند، در چند انتشار بعد به صورت پیش‌فرض فعال اما قابل غیرفعال‌سازی (opt\-out) درمی‌آیند، و در نهایت رفتار قدیمی به کلی حذف می‌شود. .sp می‌توانید فهرست ویژگی‌های فعلی را با \fBstatus features\fP مشاهده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > status features stderr\-nocaret on 3.0 ^ no longer redirects stderr qmark\-noglob on 3.0 ? no longer globs regex\-easyesc on 3.1 string replace \-r needs fewer \e\e\(aqs ampersand\-nobg\-in\-token on 3.4 & only backgrounds if followed by a separating character remove\-percent\-self off 4.0 %self is no longer expanded (use $fish_pid) test\-require\-arg off 4.0 builtin test requires an argument mark\-prompt on 4.0 write OSC 133 prompt markers to the terminal ignore\-terminfo on 4.1 do not look up $TERM in terminfo database query\-term on 4.1 query the TTY to enable extra functionality omit\-term\-workarounds off 4.3 skip workarounds for incompatible terminals .EE .UNINDENT .UNINDENT .sp مفهوم این ویژگی‌ها به شرح زیر است: .INDENT 0.0 .IP \(bu 2 فلگ \fBstderr\-nocaret\fP در فیش ۳.۰ معرفی شد و از فیش ۳.۵ به بعد نمی‌توان آن را خاموش کرد. هنوز می‌توان آن را برای سازگاری بررسی کرد، اما مقدار \fBno\-stderr\-nocaret\fP نادیده گرفته می‌شود. این فلگ علامت \fB^\fP را به یک کاراکتر معمولی به جای تغییرمسیر stderr تبدیل کرد. به جای آن از \fB2>\fP استفاده کنید. .IP \(bu 2 فلگ \fBqmark\-noglob\fP نیز در فیش ۳.۰ معرفی شد (و در ۴.۰ پیش‌فرض شد). این فلگ علامت \fB?\fP را به یک نویسه معمولی به جای الگوی عام تک‌کاراکتری تبدیل می‌کند. به جای آن از \fB*\fP استفاده کنید (که چندین کاراکتر را مطابقت می‌دهد) یا از راه‌های دیگر تطبیق فایل مانند \fBfind\fP بهره ببرید. .IP \(bu 2 فلگ \fBregex\-easyesc\fP در نسخه ۳.۱ معرفی شد (و در ۳.۵ پیش‌فرض شد). این فلگ باعث می‌شود عبارت جایگزینی در \fBstring replace \-r\fP به یک دور گریزدهی کمتر نیاز داشته باشد. پیش از این، برای گریز دادن بک‌اسلش باید از \fBstring replace \-ra \(aq([ab])\(aq \(aq\e\e\e\e\e\e\e\e$1\(aq\fP استفاده می‌کردید؛ پس از آن عبارت \fB\(aq\e\e\e\e$1\(aq\fP کافی است. اگر در جایی از این دستور استفاده کرده‌اید، فراخوانی‌های \fBstring replace\fP خود را بررسی کنید. .IP \(bu 2 فلگ \fBampersand\-nobg\-in\-token\fP در فیش ۳.۴ معرفی شد (و در ۳.۵ پیش‌فرض شد). این ویژگی موجب می‌شود که نویسه \fB&\fP در میان یک توکن دیگر به عنوان عملگر پس‌زمینه تفسیر نشود، تا کار با URLها آسان‌تر گردد. بعد از \fB&\fP یا فاصله بگذارید یا نقطه‌ویرگول. به هر حال این فرمت‌بندی پیشنهادی است و ابزار \fBfish_indent\fP قبلاً آن را برای شما انجام داده است. .IP \(bu 2 فلگ \fBremove\-percent\-self\fP بسط ویژه \fB%self\fP را خاموش می‌کند. در نسخه ۴.۰ معرفی شد. برای به دست آوردن pid فیش، می‌توانید از متغیر \fBfish_pid\fP استفاده کنید. .IP \(bu 2 فلگ \fBtest\-require\-arg\fP حالت تک‌آرگومانی دستور توکار test \%<> را حذف می‌کند (\fBtest \(dqstring\(dq\fP). در ۴.۰ معرفی شد. برای بررسی خالی نبودن یک رشته، از \fBtest \-n \(dqstring\(dq\fP استفاده کنید. در صورت غیرفعال بودن، هر فراخوانی به \fBtest\fP که تغییر رفتار داشته باشد پیامی اشکال‌زدایی \%<#\:debugging-fish> در دسته‌بندی «deprecated\-test» می‌فرستد، بنابراین راه‌اندازی فیش با \fBfish \-\-debug=deprecated\-test\fP می‌تواند برای یافتن فراخوانی‌های ناسازگار استفاده شود. .IP \(bu 2 فلگ \fBmark\-prompt\fP باعث می‌شود فیش آغاز و پایان اعلان‌های پوسته و خروجی دستورات را با کدهای OSC 133 به ترمینال گزارش کند. .IP \(bu 2 فلگ \fBignore\-terminfo\fP در فیش ۴.۱ معرفی شد و از فیش ۴.۵ به بعد غیرفعال نمی‌شود. این فلگ جستجوی متغیر $TERM در پایگاه‌داده terminfo را غیرفعال کرد. .IP \(bu 2 فلگ \fBquery\-term\fP به فیش اجازه می‌دهد با نوشتن توالی‌های گریز و خواندن پاسخ ترمینال، ویژگی‌های آن را استعلام کند. این قابلیت ویژگی‌هایی نظیر اسکرول را فعال می‌سازد \%<#\:term-compat-cursor-position-report>\&. اگر از ترمینالی ناسازگار استفاده می‌کنید، فعلاً می‌توانید با اجرای دستور (یک‌باره) \fBset \-Ua fish_features no\-query\-term\fP این مشکل را دور بزنید. .IP \(bu 2 فلگ \fBomit\-term\-workarounds\fP مانع از تلاش فیش برای رفع ناسازگاری‌های ترمینال‌های ناسازگار می‌شود. .UNINDENT .sp این تغییرات در ابتدا به صورت غیرفعال عرضه می‌شوند. می‌توان آن‌ها را بر اساس هر نشست فعال کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX > fish \-\-features qmark\-noglob,regex\-easyesc .EE .UNINDENT .UNINDENT .sp یا به صورت سراسری برای یک کاربر انتخاب نمود: .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-U fish_features regex\-easyesc qmark\-noglob .EE .UNINDENT .UNINDENT .sp ویژگی‌ها تنها در هنگام راه‌اندازی تنظیم می‌شوند، بنابراین این متغیر تنها در صورتی اثرگذار خواهد بود که جهانی (universal) یا صادرشده (exported) باشد. .sp همچنین می‌توانید شماره نسخه را به عنوان یک گروه به کار ببرید؛ برای مثال \fB3.0\fP معادل «stderr\-nocaret» و «qmark\-noglob» است. به جای نسخه، گروه ویژه \fBall\fP تمامی ویژگی‌ها را فعال می‌کند. .sp افزودن پیشوند \fBno\-\fP به یک ویژگی، آن را خاموش می‌کند. برای مثال برای فعال‌سازی مجدد الگوی عام تک‌کاراکتری \fB?\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-Ua fish_features no\-qmark\-noglob .EE .UNINDENT .UNINDENT .SH "گرداننده‌های رویداد (EVENT HANDLERS)" .sp هنگام تعریف یک تابع جدید در فیش، امکان تبدیل آن به یک گرداننده رویداد (event handler) وجود دارد؛ یعنی تابعی که هنگام وقوع رویدادی مشخص به طور خودکار اجرا شود. رویدادهایی که در حال حاضر می‌توانند یک گرداننده را تحریک کنند عبارتند از: .INDENT 0.0 .IP \(bu 2 هنگام ارسال یک سیگنال .IP \(bu 2 هنگامی که یک کار (job) خاتمه می‌یابد .IP \(bu 2 هنگامی که مقدار یک متغیر به‌روزرسانی می‌شود .IP \(bu 2 هنگامی که اعلان خط فرمان در شرف نمایش است .UNINDENT .sp مثال: .sp برای مشخص کردن یک گرداننده سیگنال برای سیگنال WINCH، بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX function my_signal_handler \-\-on\-signal WINCH echo Got WINCH signal! end .EE .UNINDENT .UNINDENT .sp فیش از قبل رویدادهای نام‌گذاری‌شده زیر را برای سوییچ \fB\-\-on\-event\fP داراست: .INDENT 0.0 .IP \(bu 2 رویداد \fBfish_prompt\fP هر زمان که یک اعلان خط فرمان جدید در شرف نمایش باشد ارسال می‌شود. .IP \(bu 2 رویداد \fBfish_preexec\fP درست قبل از اجرای یک دستور تعاملی ارسال می‌شود. خط فرمان به عنوان اولین پارامتر به آن فرستاده می‌شود. اگر دستور خالی باشد ارسال نمی‌گردد. .IP \(bu 2 رویداد \fBfish_posterror\fP درست پس از اجرای دستوری با خطای نحوی ارسال می‌شود. خط فرمان به عنوان نخستین پارامتر ارسال می‌شود. .IP \(bu 2 رویداد \fBfish_postexec\fP بلافاصله پس از اجرای یک دستور تعاملی ارسال می‌شود. خط فرمان به عنوان پارامتر اول ارسال می‌گردد. اگر دستور خالی باشد ارسال نمی‌شود. .IP \(bu 2 رویداد \fBfish_exit\fP درست پیش از خروج فیش ارسال می‌شود. .IP \(bu 2 رویداد \fBfish_cancel\fP هنگامی که یک خط فرمان پاک می‌شود ارسال می‌گردد. .IP \(bu 2 رویداد \fBfish_focus_in\fP زمانی که ترمینال فیش فوکوس دریافت می‌کند ارسال می‌شود. .IP \(bu 2 رویداد \fBfish_focus_out\fP زمانی که ترمینال فیش فوکوس را از دست می‌دهد ارسال می‌شود. .UNINDENT .sp رویدادها را می‌توان با دستور emit \%<> شلیک کرد و نیازی نیست از قبل تعریف شده باشند؛ تنها کافی است نام‌ها تطبیق داشته باشند. برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX function handler \-\-on\-event imdone echo generator is done $argv end function generator sleep 1 # The \(dqimdone\(dq is the name of the event # the rest is the arguments to pass to the handler emit imdone with $argv end .EE .UNINDENT .UNINDENT .sp اگر چندین گرداننده برای یک رویداد وجود داشته باشد، همگی اجرا خواهند شد، اما ممکن است ترتیب اجرا میان نسخه‌های فیش تغییر کند؛ بنابراین نباید به ترتیب آن اتکا کنید. .sp لطفاً توجه داشته باشید که گرداننده‌های رویداد تنها زمانی فعال می‌شوند که تابع بارگذاری شده باشد؛ این یعنی باید با source \%<> یا اجرای مستقیم، تابع را بارگذاری کنید و به بارگذاری خودکار اتکا ننمایید. یک روش، قرار دادن آن در فایل پیکربندی است. .sp برای اطلاعات بیشتر درباره نحوه تعریف گرداننده‌های رویداد جدید، مستندات دستور function \%<> را ببینید. .SH "اشکال‌زدایی اسکریپت‌های فیش (DEBUGGING FISH SCRIPTS)" .sp پوسته فیش شامل امکانات پایه‌ای اشکال‌زدایی داخلی است که به شما امکان می‌دهد اجرای اسکریپت را در نقطه‌ای دلخواه متوقف کنید. هنگام وقوع این حالت، یک اعلان خط فرمان تعاملی به شما ارائه می‌شود که در آن می‌توانید هر دستور فیش را برای بازرسی یا تغییر وضعیت اجرا کنید (دستورات اشکال‌زدایی اختصاصی مجزایی وجود ندارد). برای نمونه، می‌توانید مقدار هر متغیر را با استفاده از printf \%<> و set \%<> بررسی کرده یا تغییر دهید. به عنوان نمونه‌ای دیگر، می‌توانید دستور status print\-stack\-trace \%<> را اجرا کنید تا ببینید چگونه به نقطه توقف (breakpoint) فعلی رسیده‌اید. برای از سرگیری اجرای عادی اسکریپت، دستور exit \%<> را تایپ کنید یا کلیدهای ترکیبی \fBctrl\fP\-\fBd\fP را بفشارید. .sp برای شروع یک نشست اشکال‌زدایی، دستور توکار \fBbreakpoint\fP را در نقطه‌ای از تابع یا اسکریپت که می‌خواهید کنترل را به دست بگیرید درج کنید \%<>\&، سپس تابع یا اسکریپت را اجرا نمایید. همچنین رفتار پیش‌فرض سیگنال \fBTRAP\fP فراخوانی این دستور توکار است، به این معنی که یک اسکریپت در حال اجرا می‌تواند با ارسال سیگنال \fBTRAP\fP به طور فعال اشکال‌زدایی شود (\fBkill \-s TRAP \fP). پشتیبانی محدودی برای تنظیم یا تغییر تعاملی نقاط توقف از این اعلان اشکال‌زدایی وجود دارد: می‌توان با استفاده از تابع \fBfunced\fP نقاط توقف جدیدی در سایر توابع قرار داد (یا نقاط قدیمی را حذف کرد)، اما افزودن یا حذف نقطه توقف از تابع/اسکریپتی که در حال حاضر بارگذاری شده و در حال اجراست امکان‌پذیر نیست. .sp راه دیگر برای اشکال‌زدایی مشکلات اسکریپت‌ها، تنظیم متغیر \fBfish_trace\fP است؛ مانند \fBfish_trace=1 fish_prompt\fP برای مشاهده دستوراتی که فیش هنگام اجرای تابع fish_prompt \%<> اجرا می‌کند. .SS "پروفایل کردن اسکریپت‌های فیش (Profiling fish scripts)" .sp اگر به طور مشخص می‌خواهید مسائل مربوط به عملکرد و کارایی را اشکال‌زدایی کنید، \fBfish\fP را می‌توان با گزینه \fB\-\-profile /path/to/profile.log\fP اجرا کرد تا اطلاعات پروفایل را در مسیر مشخص‌شده ذخیره کند. این گزارش پروفایل شامل تفکیک مدت زمانی است که هر گام در فرآیند اجرا طول کشیده است. .sp برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX > fish \-\-profile /tmp/sleep.prof \-ic \(aqsleep 3s\(aq > cat /tmp/sleep.prof Time Sum Command 3003419 3003419 > sleep 3s .EE .UNINDENT .UNINDENT .sp این دستور زمان لازم برای خود دستور را در ستون اول، زمان کل برای دستور و تمامی زیردستورات (مانند هر دستوری درون تابع یا جایگزینی‌های دستور) را در ستون دوم، و خود دستور را در ستون سوم، جداشده با تب، نشان می‌دهد. .sp زمان بر حسب میکروثانیه ارائه می‌شود. .sp برای دیدن کندترین دستورات در انتها، دستور \fBsort \-nk2 /path/to/logfile\fP کاربردی است. .sp برای پروفایل زمان راه‌اندازی فیش، گزینه \fB\-\-profile\-startup /path/to/logfile\fP نیز وجود دارد. .sp برای اطلاعات بیشتر مستندات fish \%<> را ببینید. .SH "نویسندگان (AUTHORS)" توسعه‌دهندگان پوسته فیش (fish-shell developers) .SH "حق نشر (COPYRIGHT)" توسعه‌دهندگان پوسته فیش (fish-shell developers) .\" End of generated man page.