.\" 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-TUTORIAL" "1" "Sep 07, 2026" "4.9" "fish-shell" .SH "نام (NAME)" fish-tutorial \- آموزش تعاملی پوسته فیش .SH "چرا فیش؟ (WHY FISH?)" .sp پوسته \fBfish\fP یک پوسته خط فرمان مجهز و کامل (مانند bash یا zsh) است که هوشمند و کاربرپسند طراحی شده است. فیش از قابلیت‌های قدرتمندی نظیر برجسته‌سازی نحو (Syntax Highlighting)، پیشنهادهای خودکار (Autosuggestions) و تکمیل تب (Tab Completions) پشتیبانی می‌کند که همگی بدون نیاز به هیچ‌گونه پیکربندی یا آموزش پیچیده، بلافاصله کار می‌کنند. .sp اگر می‌خواهید بدون درگیر شدن با انبوهی از قواعد نحوی مبهم و گزینه‌های پیکربندی پیچیده، کار با خط فرمان خود را پربازده‌تر، مفیدتر و لذت‌بخش‌تر کنید، فیش ممکن است دقیقاً همان چیزی باشد که به دنبال آن هستید! .SH "شروع کار (GETTING STARTED)" .sp پس از نصب، برای آزمایش کافی است دستور \fBfish\fP را در پوسته جاری خود تایپ و اجرا کنید! .sp با اعلان استاندارد فیش روبرو خواهید شد که نشان می‌دهد همه‌چیز آماده است و می‌توانید کار با فیش را شروع کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > fish Welcome to fish, the friendly interactive shell Type help for instructions on how to use fish you@hostname ~> .EE .UNINDENT .UNINDENT .sp اعلانی که در بالا مشاهده می‌کنید، خط اعلان پیش‌فرض فیش است: نام کاربری، نام میزبان و دایرکتوری کاری شما را نمایش می‌دهد. شما می‌توانید آن را سفارشی‌سازی کنید؛ برای راهنمایی به بخش تغییر خط اعلان مراجعه نمایید \%<#\:prompt>\&. .sp از اینجا به بعد، برای صرفه‌جویی در فضا فرض می‌کنیم خط اعلان شما صرفاً یک کاراکتر \fB>\fP است. .SH "یادگیری فیش (LEARNING FISH)" .sp این آموزش فرض می‌کند که شما با مفاهیم اولیه پوسته‌های خط فرمان و دستورات یونیکس آشنایی دارید و یک نسخه فعال از فیش را روی سیستم خود نصب کرده‌اید. .sp اگر درک خوبی از سایر پوسته‌ها دارید و می‌خواهید تفاوت‌های فیش را بدانید، عبارت کلیدی \fIunlike other shells\fP (برخلاف سایر پوسته‌ها) را در مستندات جستجو کنید که برای اشاره به تفاوت‌های مهم استفاده شده است. .sp همچنین برای یک مرور سریع بر تفاوت‌ها با سایر پوسته‌ها مانند بش، به بخش فیش برای کاربران بش مراجعه کنید \%<>\&. .sp برای توضیحات کامل و تفصیلی درباره نحوه استفاده تعاملی از فیش، به استفاده تعاملی مراجعه کنید \%<>\&. .sp برای شرح جامع زبان اسکریپت‌نویسی فیش، به زبان فیش مراجعه کنید \%<>\&. .SH "اجرای دستورات (RUNNING COMMANDS)" .sp فیش دستورات را مانند سایر پوسته‌ها اجرا می‌کند: ابتدا نام دستور را می‌نویسید و در ادامه آرگومان‌های آن را ذکر می‌کنید. فاصله‌ها به عنوان جداکننده عمل می‌کنند: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo hello world hello world .EE .UNINDENT .UNINDENT .sp این کار دستور \fBecho\fP را با آرگومان‌های \fBhello\fP و \fBworld\fP اجرا می‌کند. در این مثال، نتیجه مانند ارسال یک تک‌آرگومان \fBhello world\fP است، اما در بسیاری از موارد تفاوت دارد. اگر نیاز دارید آرگومانی حاوی فاصله ارسال کنید، می‌توانید آن فاصله را با بک‌اسلش اسکیپ کنید \%<#\:escapes> یا با کوتیشن تکی یا جفتی محصور نمایید \%<#\:quotes>: .INDENT 0.0 .INDENT 3.5 .sp .EX > mkdir My\e Files # Makes a directory called \(dqMy Files\(dq, with a space in the name > cp ~/Some\e File \(aqMy Files\(aq # Copies a file called \(dqSome File\(dq in the home directory to \(dqMy Files\(dq > ls \(dqMy Files\(dq Some File .EE .UNINDENT .UNINDENT .SH "دریافت راهنما (GETTING HELP)" .sp برای باز کردن راهنمای فیش در مرورگر وب دستور \fBhelp\fP و برای باز کردن صفحه در قالب man (مانند \fBfish\-language\fP) دستور \fBman\fP را اجرا کنید. همچنین می‌توانید برای دستوری مشخص درخواست راهنما کنید؛ مثلاً \fBhelp set\fP در مرورگر وب یا \fBman set\fP در محیط ترمینال. .INDENT 0.0 .INDENT 3.5 .sp .EX > man set set \- handle shell variables Synopsis... .EE .UNINDENT .UNINDENT .sp برای دسترسی مستقیم به این بخش از دستور \fBhelp getting\-help\fP استفاده کنید. .sp این دستورات فقط برای مستندات اختصاصی خود فیش و دستورات داخلی آن (builtins) کار می‌کنند. برای سایر دستورات سیستم، هر ابزار مستندات خودش را ارائه می‌دهد که معمولاً در سیستم man قرار دارد؛ به عنوان مثال دستور \fBman ls\fP توضیحات مربوط به دستور \fBls\fP سیستم شما را نمایش می‌دهد. .SH "برجسته‌سازی نحو (SYNTAX HIGHLIGHTING)" .sp به‌سرعت متوجه خواهید شد که فیش هنگام تایپ کردن، نحو دستورات را برجسته (رنگ‌آمیزی) می‌کند. دستورات نامعتبر به‌طور پیش‌فرض به رنگ قرمز نمایش داده می‌شوند: .INDENT 0.0 .INDENT 3.5 .sp .EX > /bin/mkd .EE .UNINDENT .UNINDENT .sp یک دستور ممکن است به این دلیل نامعتبر باشد که وجود ندارد، یا به فایلی اشاره دارد که اجازه اجرای آن را ندارید. هنگامی که دستور معتبر شود، با رنگ دیگری نمایش داده می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > /bin/mkdir .EE .UNINDENT .UNINDENT .sp مسیرهای فایل معتبر هنگام تایپ با خط زیرین (Underline) مشخص می‌شوند: .INDENT 0.0 .INDENT 3.5 .sp .EX > cat ~/somefi .EE .UNINDENT .UNINDENT .sp این ویژگی به شما اطلاع می‌دهد فایلی که با عبارت \fBsomefi\fP شروع می‌شود در آن مسیر وجود دارد که هنگام تایپ بازخورد بسیار مفیدی است. .sp این رنگ‌ها و بسیاری تنظیمات دیگر را می‌توان با اجرای \fBfish_config\fP یا با تغییر مستقیم متغیرهای رنگ \%<#\:variables-color> سفارشی‌سازی کرد. .sp برای مثال، اگر می‌خواهید (تقریباً) تمامی رنگ‌آمیزی‌ها را غیرفعال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX fish_config theme choose none .EE .UNINDENT .UNINDENT .sp این دستور پوسته گرافیکی \(dqnone\(dq (هیچ‌کدام) را انتخاب می‌کند. برای مشاهده تمامی پوسته‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX fish_config theme show .EE .UNINDENT .UNINDENT .sp تنها با اجرای دستور \fBfish_config\fP یک رابط کاربری تحت وب در مرورگر باز می‌شود که به شما امکان انتخاب از میان پوسته‌های موجود را می‌دهد. .SH "پیشنهادهای خودکار (AUTOSUGGESTIONS)" .sp هنگام تایپ کردن، فیش ادامه دستورات پیشنهادی را به رنگ خاکستری در سمت راست مکان‌نما نمایش می‌دهد؛ برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX > /bin/hostname .EE .UNINDENT .UNINDENT .sp فیش مسیرها و گزینه‌ها را به خوبی می‌شناسد: .INDENT 0.0 .INDENT 3.5 .sp .EX > grep \-\-ignore\-case .EE .UNINDENT .UNINDENT .sp و همچنین تاریخچه دستورات را به یاد دارد. کافی است یک دستور را یک‌بار تایپ کرده باشید تا با وارد کردن تنها چند حرف نخست، بتوانید مجدداً آن را فراخوانی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > rsync \-avze ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo .EE .UNINDENT .UNINDENT .sp برای پذیرفتن پیشنهاد خودکار، کلید \fBراست\fP (\fB→\fP) یا ترکیب کلیدهای \fBctrl\fP\-\fBf\fP را فشار دهید. برای پذیرفتن تنها یک کلمه از پیشنهاد خودکار، کلیدهای \fBalt\fP\-\fBراست\fP (\fB→\fP) را بزنید. اگر پیشنهاد مورد نظر شما نیست، کافی است به تایپ خود ادامه داده و آن را نادیده بگیرید. .sp اگر مایل به استفاده از پیشنهادهای خودکار نیستید، می‌توانید با تنظیم متغیر \fB$fish_autosuggestion_enabled\fP روی مقدار 0 آن‌ها را غیرفعال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX set \-g fish_autosuggestion_enabled 0 .EE .UNINDENT .UNINDENT .SH "تکمیل تب (TAB COMPLETIONS)" .sp مجموعه غنی و قدرتمندی از قابلیت‌های تکمیل خودکار با کلید تب به صورت پیش‌فرض و بی‌درنگ کار می‌کنند. .sp کلید \fBtab\fP را فشار دهید تا فیش سعی کند نام دستور، آرگومان یا مسیر مورد نظر را کامل کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > /pri\fBtab\fP => /private/ .EE .UNINDENT .UNINDENT .sp اگر بیش از یک گزینه ممکن وجود داشته باشد، فهرستی از آن‌ها نمایش داده خواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX > ~/stuff/s\fBtab\fP ~/stuff/script.sh (command) ~/stuff/sources/ (directory) .EE .UNINDENT .UNINDENT .sp با فشردن مجدد کلید تب می‌توانید بین گزینه‌های پیشنهادی جابه‌جا شوید. بخش داخل پرانتز در مثال بالا (مانند \(dqcommand\(dq به معنی دستور و \(dqdirectory\(dq به معنی دایرکتوری) توصیف تکمیل خودکار است که راهنمایی کوتاهی درباره نوع آن آرگومان ارائه می‌دهد. .sp فیش همچنین می‌تواند بسیاری از زیردستورات، مانند شاخه‌های گیت را نیز کامل کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > git merge pr\fBtab\fP => git merge prompt_designer > git checkout b\fBtab\fP builtin_list_io_merge (Branch) builtin_set_color (Branch) busted_events (Tag) .EE .UNINDENT .UNINDENT .sp کلید تب را فشار دهید و ببینید فیش چه کارهایی می‌تواند انجام دهد! .SH "متغیرها (VARIABLES)" .sp مانند سایر پوسته‌ها، علامت دلار که پس از آن نام یک متغیر بیاید، با مقدار آن متغیر جایگزین می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo My home directory is $HOME My home directory is /home/tutorial .EE .UNINDENT .UNINDENT .sp این فرآیند به عنوان جایگزینی متغیر (Variable Substitution) شناخته می‌شود و در داخل کوتیشن دوتایی (Double Quotes) نیز اعمال می‌شود، اما در کوتیشن تکی (Single Quotes) انجام نمی‌گیرد: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo \(dqMy current directory is $PWD\(dq My current directory is /home/tutorial > echo \(aqMy current directory is $PWD\(aq My current directory is $PWD .EE .UNINDENT .UNINDENT .sp برخلاف سایر پوسته‌ها، فیش دارای یک دستور معمولی برای مقداردهی متغیرها است: دستور \fBset\fP، که نام متغیر و سپس مقدار آن را دریافت می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .EX > set name \(aqMister Noodle\(aq > echo $name Mister Noodle .EE .UNINDENT .UNINDENT .sp (به کوتیشن‌ها دقت کنید: بدون آن‌ها، کلمات \fBMister\fP و \fBNoodle\fP به عنوان دو آرگومان مجزا در نظر گرفته می‌شدند و متغیر \fB$name\fP به یک لیست دو عضوی تبدیل می‌شد.) .sp برخلاف سایر پوسته‌ها، متغیرها پس از جایگزینی مجدداً شکسته و تفکیک نمی‌شوند: .INDENT 0.0 .INDENT 3.5 .sp .EX > mkdir $name > ls Mister Noodle .EE .UNINDENT .UNINDENT .sp در بش (bash)، این دستور دو دایرکتوری با نام‌های \(dqMister\(dq و \(dqNoodle\(dq ایجاد می‌کرد. در فیش، تنها یک دایرکتوری ایجاد می‌شود: متغیر دارای مقدار \(dqMister Noodle\(dq بود، بنابراین همان مقدار با تمام فاصله‌هایش به عنوان یک تک‌آرگومان به دستور \fBmkdir\fP ارسال شد. .sp می‌توانید یک متغیر را با گزینه \fB\-e\fP یا \fB\-\-erase\fP حذف (پاک) کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-e MyVariable > env | grep MyVariable (no output) .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، به گسترش متغیرها مراجعه کنید \%<#\:expand-variable>\&. .SH "صادر کردن متغیرها (متغیرهای پوسته) (EXPORTS - SHELL VARIABLES)" .sp گاهی نیاز است یک متغیر در دسترس دستورات خارجی قرار گیرد؛ این کار اغلب برای اعمال تنظیمات انجام می‌شود. برای مثال بسیاری از برنامه‌ها مانند \fBgit\fP یا \fBman\fP متغیر \fB$PAGER\fP را می‌خوانند تا صفحه‌بندی‌کننده دلخواه شما (برنامه‌ای که امکان اسکرول متن را می‌دهد) را شناسایی کنند. متغیرهای دیگری که به این شکل استفاده می‌شوند شامل \fB$BROWSER\fP، \fB$LANG\fP (برای پیکربندی زبان سیستم) و \fB$PATH\fP هستند. توجه داشته باشید که نوشتن این متغیرها با حروف بزرگ صرفاً یک قرارداد مرسوم است. .sp برای ارسال یک متغیر به یک دستور خارجی، آن متغیر باید صادر (Export) شود. این کار با افزودن یک فلگ به دستور \fBset\fP انجام می‌شود: فلگ \fB\-\-export\fP یا به اختصار \fB\-x\fP\&. .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-x MyVariable SomeValue > env | grep MyVariable MyVariable=SomeValue .EE .UNINDENT .UNINDENT .sp همچنین می‌توان یک متغیر را با گزینه \fB\-\-unexport\fP یا \fB\-u\fP از حالت صادرشده خارج کرد. .sp این سازوکار در جهت عکس نیز عمل می‌کند! اگر فیش توسط فرآیند دیگری اجرا شود، متغیرهای صادرشده والد خود را به ارث می‌برد. بنابراین اگر شبیه‌ساز ترمینال شما فیش را اجرا کند و متغیر \fB$LANG\fP را روی \fBen_US.UTF\-8\fP صادر کرده باشد، فیش آن تنظیم را دریافت خواهد کرد. هر فرآیندی هم که شبیه‌ساز ترمینال شما را اجرا کرده، متغیرهایی به \fIآن\fP داده که به فیش منتقل می‌شوند، مگر اینکه صریحاً تصمیم به عدم ارسال بگیرد. به این ترتیب است که فیش معمولاً مقادیر مواردی مانند \fB$LANG\fP، \fB$PATH\fP و \fB$TERM\fP را بدون نیاز به تعریف مجدد توسط شما دریافت می‌کند. .sp متغیرهای صادرشده می‌توانند محلی (Local)، سراسری (Global) یا فراگیر (Universal) باشند \- مفهوم صادرشدن (Exported) یک حوزه متغیر نیست \%<#\:variables-scope>! معمولاً آن‌ها را با دستور \fBset \-gx MyVariable SomeValue\fP به صورت سراسری تعریف می‌کنند. .sp برای اطلاعات بیشتر، به صادر کردن متغیرها مراجعه نمایید \%<#\:variables-export>\&. .SH "لیست‌ها (LISTS)" .sp دستور \fBset\fP در بالا از کوتیشن استفاده کرد تا اطمینان حاصل شود که \fBMister Noodle\fP یک آرگومان واحد است. اگر دو آرگومان بود، آن‌گاه \fBname\fP یک لیست با طول ۲ می‌شد. در واقع، تمام متغیرها در فیش در اصل لیست‌هایی هستند که می‌توانند شامل هر تعداد مقدار یا حتی بدون هیچ مقداری باشند. .sp برخی متغیرها مانند \fB$PWD\fP تنها یک مقدار دارند. طبق قرارداد، ما از «مقدار» آن متغیر صحبت می‌کنیم، اما منظور واقعی ما اولین (و تنها) مقدار آن در لیست است. .sp سایر متغیرها، مانند \fB$PATH\fP، واقعاً دارای چندین مقدار هستند. در حین گسترش متغیر، متغیر به چندین آرگومان مجزا تبدیل می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo $PATH /usr/bin /bin /usr/sbin /sbin /usr/local/bin .EE .UNINDENT .UNINDENT .sp متغیرهایی که نام آن‌ها با \(dqPATH\(dq خاتمه می‌یابد، به طور خودکار بر اساس دونقطه (Colon) به لیست تبدیل می‌شوند. این متغیرها هنگام صادر شدن به زیردستورات مجدداً با دونقطه به هم متصل می‌گردند. این کار برای سازگاری با سایر ابزارها است که انتظار دارند متغیر $PATH با دونقطه جدا شده باشد. همچنین می‌توانید این رفتار را به طور صریح با \fBset \-\-path\fP به یک متغیر اضافه یا با \fBset \-\-unpath\fP حذف کنید. .sp لیست‌ها نمی‌توانند حاوی لیست‌های دیگر باشند؛ هیچ‌گونه تودرتویی یا بازگشتی وجود ندارد. یک متغیر صرفاً یک لیست از رشته‌ها است و بس. .sp برای به دست آوردن طول یک لیست از دستور \fBcount\fP استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > count $PATH 5 .EE .UNINDENT .UNINDENT .sp می‌توانید با مقداردهی متغیر با خودش به همراه آرگومان‌های جدید، به ابتدا یا انتهای یک لیست مقادیری را اضافه کنید. در اینجا مسیر /usr/local/bin را به انتهای $PATH اضافه می‌کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX > set PATH $PATH /usr/local/bin .EE .UNINDENT .UNINDENT .sp می‌توانید با استفاده از براکت‌ها به عناصر منفرد لیست دسترسی داشته باشید. شماره‌گذاری اندیس‌ها از ابتدای لیست با 1 و از انتهای لیست با \-1 آغاز می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo $PATH /usr/bin /bin /usr/sbin /sbin /usr/local/bin > echo $PATH[1] /usr/bin > echo $PATH[\-1] /usr/local/bin .EE .UNINDENT .UNINDENT .sp همچنین می‌توانید به محدوده‌ای از عناصر که با نام برش‌ها (\(dqslices\(dq) شناخته می‌شوند دسترسی پیدا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo $PATH[1..2] /usr/bin /bin > echo $PATH[\-1..2] /usr/local/bin /sbin /usr/sbin /bin .EE .UNINDENT .UNINDENT .sp می‌توانید با یک حلقه for روی یک لیست (یا یک برش از آن) پیمایش انجام دهید: .INDENT 0.0 .INDENT 3.5 .sp .EX for val in $PATH echo \(dqentry: $val\(dq end # Will print: # entry: /usr/bin/ # entry: /bin # entry: /usr/sbin # entry: /sbin # entry: /usr/local/bin .EE .UNINDENT .UNINDENT .sp یک نکته بسیار کاربردی این است که می‌توانید از لیست‌ها مانند گسترش آکولاد (Brace Expansion) استفاده کنید \%<#\:expand-brace>\&. اگر رشته دیگری را به یک لیست بچسبانید، آن رشته با تک‌تک عناصر لیست ترکیب خواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX > set mydirs /usr/bin /bin > echo $mydirs/fish # this is just like {/usr/bin,/bin}/fish /usr/bin/fish /bin/fish .EE .UNINDENT .UNINDENT .sp این رفتار همچنین به این معنی است که اگر لیست خالی باشد، هیچ آرگومانی تولید نخواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX > set empty # no argument > echo $empty/this_is_gone # prints an empty line .EE .UNINDENT .UNINDENT .sp اگر لیست را داخل کوتیشن قرار دهید، به عنوان یک رشته واحد به کار می‌رود و در نتیجه حتی اگر خالی باشد، یک تک‌آرگومان دریافت خواهید کرد. .sp برای اطلاعات بیشتر، به بخش لیست‌ها مراجعه کنید \%<#\:variables-lists>\&. برای توضیحات تکمیلی درباره ترکیب لیست‌ها با رشته‌ها (یا سایر لیست‌ها)، به ضرب دکارتی \%<#\:cartesian-product> و گسترش متغیرها \%<#\:expand-variable> مراجعه نمایید. .SH "نویسه‌های عام (WILDCARDS)" .sp فیش از نویسه عام آشنای ستاره \fB*\fP پشتیبانی می‌کند. برای مثال برای فهرست کردن تمام فایل‌های JPEG: .INDENT 0.0 .INDENT 3.5 .sp .EX > ls *.jpg lena.jpg meena.jpg santa maria.jpg .EE .UNINDENT .UNINDENT .sp می‌توانید از چندین نویسه عام به طور همزمان استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > ls l*.p* lena.png lesson.pdf .EE .UNINDENT .UNINDENT .sp نویسه عام بازگشتی \fB**\fP دایرکتوری‌ها را به صورت بازگشتی جستجو می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > ls /var/**.log /var/log/system.log /var/run/sntp.log .EE .UNINDENT .UNINDENT .sp اگر این پیمایش در دایرکتوری‌ها زمان زیادی طول کشید، می‌توانید با فشردن کلیدهای \fBctrl\fP\-\fBc\fP از آن خارج شوید. .sp برای اطلاعات بیشتر، به بخش نویسه‌های عام مراجعه کنید \%<#\:expand-wildcard>\&. .SH "پایپ‌ها و تغییر مسیرها (PIPES AND REDIRECTIONS)" .sp می‌توانید با استفاده از خط عمودی همیشگی (پایپ)، خروجی یک دستور را به ورودی دستور دیگر هدایت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo hello world | wc 1 2 12 .EE .UNINDENT .UNINDENT .sp ورودی استاندارد (stdin) و خروجی استاندارد (stdout) را می‌توان با کاراکترهای آشنای \fB<\fP و \fB>\fP تغییر مسیر داد. خروجی خطای استاندارد (stderr) نیز با \fB2>\fP هدایت می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .EX > grep fish < /etc/shells > ~/output.txt 2> ~/errors.txt .EE .UNINDENT .UNINDENT .sp برای هدایت همزمان خروجی استاندارد و خروجی خطا به یک فایل، می‌توانید از \fB&>\fP استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > make &> make_output.txt .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، به تغییر مسیرهای ورودی و خروجی \%<#\:redirects> و پایپ‌ها \%<#\:pipes> مراجعه فرمایید. .SH "جایگزینی دستورات (COMMAND SUBSTITUTIONS)" .sp جایگزینی دستور از خروجی یک دستور به عنوان آرگومان برای دستوری دیگر استفاده می‌کند. برخلاف سایر پوسته‌ها، فیش از بک‌تیک \(ga\(ga برای جایگزینی دستور استفاده نمی‌کند؛ در عوض از پرانتز با یا بدون علامت دلار استفاده می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo In (pwd), running $(uname) In /home/tutorial, running FreeBSD .EE .UNINDENT .UNINDENT .sp یک الگوی بسیار رایج، ذخیره خروجی یک دستور در یک متغیر است: .INDENT 0.0 .INDENT 3.5 .sp .EX > set os (uname) > echo $os Linux .EE .UNINDENT .UNINDENT .sp جایگزینی‌های دستور بدون علامت دلار در داخل کوتیشن گسترش نمی‌یابند، بنابراین نسخه همراه با علامت دلار ساده‌تر و کاربردی‌تر است: .INDENT 0.0 .INDENT 3.5 .sp .EX > touch \(dqtesting_$(date +%s).txt\(dq > ls *.txt testing_1360099791.txt .EE .UNINDENT .UNINDENT .sp برخلاف سایر پوسته‌ها، فیش خروجی جایگزینی دستور را بر روی هر فاصله خالی (مانند space یا tab) تفکیک نمی‌کند، بلکه تنها بر روی خطوط جدید (Newline) می‌شکند. معمولاً این رفتار کمک بزرگی است، زیرا دستورات یونیکس به صورت خط به خط عمل می‌کنند. اما گاهی اوقات در دستوراتی مانند \fBpkg\-config\fP که چندین آرگومان را روی یک خط چاپ می‌کنند، ممکن است نیاز به تفکیک روی فاصله باشد. برای تقسیم خروجی بر روی فاصله‌ها نیز، از دستور \fBstring split\fP استفاده کنید. .INDENT 0.0 .INDENT 3.5 .sp .EX > printf \(aq%s\en\(aq (pkg\-config \-\-libs gio\-2.0) \-lgio\-2.0 \-lgobject\-2.0 \-lglib\-2.0 > printf \(aq%s\en\(aq (pkg\-config \-\-libs gio\-2.0 | string split \-n \(dq \(dq) \-lgio\-2.0 \-lgobject\-2.0 \-lglib\-2.0 .EE .UNINDENT .UNINDENT .sp اگر نیاز دارید خروجی یک جایگزینی دستور به عنوان یک آرگومان واحد و بدون هیچ‌گونه شکسته شدنی استفاده شود، آن را داخل کوتیشن قرار دهید: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo \(dqfirst line second line\(dq > myfile > set myfile \(dq$(cat myfile)\(dq > printf \(aq|%s|\(aq $myfile |first line second line| .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، به بخش جایگزینی دستور مراجعه کنید \%<#\:expand-command-substitution>\&. .SH "جداسازی دستورات با نقطه‌ویرگول (SEPARATING COMMANDS - SEMICOLON)" .sp مانند سایر پوسته‌ها، فیش امکان اجرای چندین دستور را هم در خطوط جداگانه و هم در یک خط فراهم می‌کند. .sp برای نوشتن آن‌ها در یک خط، از علامت نقطه‌ویرگول (\(dq;\(dq) استفاده کنید. این یعنی دو مثال زیر دقیقاً معادل یکدیگرند: .INDENT 0.0 .INDENT 3.5 .sp .EX echo fish; echo chips # or echo fish echo chips .EE .UNINDENT .UNINDENT .sp این قابلیت برای وارد کردن چندین دستور در حالت تعاملی بسیار مفید است. در اسکریپت‌ها، اگر دستورات در خطوط جداگانه نوشته شوند خوانایی بهتری خواهند داشت. .SH "وضعیت خروج (EXIT STATUS)" .sp هنگامی که یک دستور به کار خود پایان می‌دهد، یک کد وضعیت خروج به عنوان یک عدد صحیح غیرمنفی (یک عدد حسابی بزرگتر یا مساوی 0) برمی‌گرداند. .sp برخلاف سایر پوسته‌ها، فیش وضعیت خروج آخرین دستور را در متغیر \fB$status\fP ذخیره می‌کند و نه در \fB$?\fP\&. .INDENT 0.0 .INDENT 3.5 .sp .EX > false > echo $status 1 .EE .UNINDENT .UNINDENT .sp این کد نشان می‌دهد اجرای دستور چگونه پیش رفته است \- مقدار 0 معمولاً به معنای موفقیت است، در حالی که سایر مقادیر نشان‌دهنده انواع خطا هستند. برای نمونه دستور داخلی \fBset \-\-query\fP در فیش، تعداد متغیرهای استعلام‌شده‌ای که مقداردهی نشده بودند را برمی‌گرداند؛ یعنی \fBset \-\-query PATH\fP معمولاً 0 برمی‌گرداند و \fBset \-\-query arglbargl boogagoogoo\fP مقدار 2 برمی‌گرداند. .sp همچنین یک متغیر لیستی با نام \fB$pipestatus\fP برای ذخیره وضعیت‌های خروج [1] فرآیندها در یک پایپ وجود دارد. .sp برای اطلاعات بیشتر، به متغیر وضعیت مراجعه کنید \%<#\:variables-status>\&. .IP [1] 5 یا به تعبیر دیگر \(dqstati\(dq یا \(dqstatūs\(dq اگر از روم باستان سفر در زمان کرده‌اید یا به عنوان معلم زبان لاتین کار می‌کنید .SH "ترکیب‌کننده‌ها (COMBINERS: AND, OR, NOT)" .sp فیش از عملگرهای آشنای \fB&&\fP و \fB||\fP برای ترکیب دستورات و \fB!\fP برای نقیض کردن آن‌ها پشتیبانی می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX > ./configure && make && sudo make install .EE .UNINDENT .UNINDENT .sp در این مثال، \fBmake\fP تنها در صورتی اجرا می‌شود که \fB\&./configure\fP با موفقیت به پایان برسد (مقدار 0 برگرداند)، و \fBsudo make install\fP نیز تنها در صورتی اجرا می‌شود که هر دو دستور \fB\&./configure\fP و \fBmake\fP موفقیت‌آمیز باشند. .sp فیش همچنین از دستورات and \%<>، or \%<> و not \%<> پشتیبانی می‌کند. دو مورد اول تعدیل‌کننده‌های شغل (Job Modifiers) هستند و اولویت کمتری دارند. نمونه کاربرد: .INDENT 0.0 .INDENT 3.5 .sp .EX > cp file1 file1_bak && cp file2 file2_bak; and echo \(dqBackup successful\(dq; or echo \(dqBackup failed\(dq Backup failed .EE .UNINDENT .UNINDENT .sp همان‌طور که در بخش مربوط به نقطه‌ویرگول ذکر شد، این ساختار را می‌توان در چندین خط نیز نوشت: .INDENT 0.0 .INDENT 3.5 .sp .EX cp file1 file1_bak && cp file2 file2_bak and echo \(dqBackup successful\(dq or echo \(dqBackup failed\(dq .EE .UNINDENT .UNINDENT .SH "دستورات شرطی (CONDITIONALS: IF, ELSE, SWITCH)" .sp برای اجرای مشروط کد بر اساس وضعیت خروج یک دستور، از دستورات if \%<> و else \%<> استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX if grep fish /etc/shells echo Found fish else if grep bash /etc/shells echo Found bash else echo Got nothing end .EE .UNINDENT .UNINDENT .sp برای مقایسه رشته‌ها، اعداد یا بررسی ویژگی‌های فایل (مانند وجود فایل یا دسترسی نوشتن و غیره)، از دستور test \%<> استفاده نمایید؛ مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX if test \(dq$fish\(dq = \(dqflounder\(dq echo FLOUNDER end # or if test \(dq$number\(dq \-gt 5 echo $number is greater than five else echo $number is five or less end # or # This test is true if the path /etc/hosts exists # \- it could be a file or directory or symlink (or possibly something else). if test \-e /etc/hosts echo We most likely have a hosts file else echo We do not have a hosts file end .EE .UNINDENT .UNINDENT .sp ترکیب‌کننده‌ها می‌توانند برای ساخت شرط‌های پیچیده‌تر نیز به کار روند؛ مانند: .INDENT 0.0 .INDENT 3.5 .sp .EX if command \-sq fish; and grep fish /etc/shells echo fish is installed and configured end .EE .UNINDENT .UNINDENT .sp برای شرط‌های پیچیده‌تر، از begin \%<> و end \%<> برای گروه‌بندی بخش‌های شرط استفاده کنید. .sp همچنین ساختار چندشاخه switch \%<> در فیش وجود دارد: .INDENT 0.0 .INDENT 3.5 .sp .EX switch (uname) case Linux echo Hi Tux! case Darwin echo Hi Hexley! case FreeBSD NetBSD DragonFly echo Hi Beastie! case \(aq*\(aq echo Hi, stranger! end .EE .UNINDENT .UNINDENT .sp همان‌طور که مشاهده می‌کنید، دستور case \%<> مانند برخی زبان‌ها به شاخه‌های بعدی سرریز (fall through) نمی‌کند و می‌تواند چندین آرگومان یا نویسه‌های عام (داخل کوتیشن) را بپذیرد. .sp برای اطلاعات بیشتر، به بخش شرط‌ها مراجعه کنید \%<#\:syntax-conditional>\&. .SH "توابع (FUNCTIONS)" .sp یک تابع در فیش، لیستی از دستورات است که می‌تواند به طور اختیاری آرگومان‌هایی را نیز بپذیرد. برخلاف سایر پوسته‌ها، آرگومان‌ها در «متغیرهای شماره‌گذاری‌شده» مانند \fB$1\fP قرار نمی‌گیرند، بلکه در یک لیست واحد به نام \fB$argv\fP ذخیره می‌شوند. برای تعریف یک تابع، از دستور داخلی function \%<> استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX function say_hello echo Hello $argv end say_hello # prints: Hello say_hello everybody! # prints: Hello everybody! .EE .UNINDENT .UNINDENT .sp برخلاف سایر پوسته‌ها، فیش دستور نام مستعار (alias) یا نحو ویژه‌ای برای خط اعلان ندارد؛ بلکه توابع جای آن‌ها را می‌گیرند. [2] .sp می‌توانید با دستور داخلی functions \%<> نام تمامی توابع را مشاهده کنید (به جمع بودن کلمه دقت فرمایید!). فیش به طور پیش‌فرض دارای توابع متعددی است: .INDENT 0.0 .INDENT 3.5 .sp .EX > functions N_, abbr, alias, bg, cd, cdh, contains_seq, dirh, dirs, disown, down\-or\-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_md5, fish_mode_prompt, fish_npm_helper, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, hostname, isatty, kill, la, ll, ls, man, nextd, open, popd, prevd, prompt_hostname, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, type, umask, up\-or\-search, vared, wait .EE .UNINDENT .UNINDENT .sp می‌توانید متن سورس هر تابع را با ارسال نام آن به دستور \fBfunctions\fP مشاهده نمایید: .INDENT 0.0 .INDENT 3.5 .sp .EX > functions ls function ls \-\-description \(aqList contents of directory\(aq command ls \-G $argv end .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، به بخش توابع مراجعه کنید \%<#\:syntax-function>\&. .IP [2] 5 البته تابعی به نام alias \%<> وجود دارد، اما صرفاً میانبری برای ساخت توابع است. فیش همچنین مخفف‌ها را از طریق دستور abbr \%<> ارائه می‌دهد \%<#\:abbreviations>. .SH "حلقه‌ها (LOOPS)" .sp حلقه‌های While: .INDENT 0.0 .INDENT 3.5 .sp .EX while true echo \(dqLoop forever\(dq end # Prints: # Loop forever # Loop forever # Loop forever # بله، این واقعاً تا ابد تکرار خواهد شد، مگر اینکه با ctrl-c آن را متوقف کنید. .EE .UNINDENT .UNINDENT .sp حلقه‌های For برای پیمایش روی یک لیست به کار می‌روند؛ برای مثال لیستی از فایل‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX for file in *.txt cp $file $file.bak end .EE .UNINDENT .UNINDENT .sp برای پیمایش روی بازه‌ای از اعداد می‌توان از دستور \fBseq\fP استفاده کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX for x in (seq 5) touch file_$x.txt end .EE .UNINDENT .UNINDENT .sp برای اطلاعات بیشتر، به بخش حلقه‌ها و بلوک‌ها مراجعه کنید \%<#\:syntax-loops-and-blocks>\&. .SH "خط اعلان (PROMPT)" .sp برخلاف سایر پوسته‌ها، در فیش متغیری مانند \fBPS1\fP برای خط اعلان وجود ندارد. برای نمایش اعلان، فیش تابع fish_prompt \%<> را اجرا کرده و خروجی آن را به عنوان اعلان نشان می‌دهد. و در صورت وجود، تابع fish_right_prompt \%<> را نیز برای نمایش اعلان سمت راست اجرا می‌کند. .sp می‌توانید اعلان اختصاصی خود را مستقیماً از خط فرمان تعریف کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > function fish_prompt; echo \(dqNew Prompt % \(dq; end New Prompt % _ .EE .UNINDENT .UNINDENT .sp سپس اگر از آن راضی بودید، می‌توانید با تایپ دستور \fBfuncsave fish_prompt\fP آن را روی دیسک ذخیره کنید. این کار اعلان را در مسیر \fB~/.config/fish/functions/fish_prompt.fish\fP ذخیره می‌کند (یا اگر مایل باشید می‌توانید از ابتدا آن فایل را به صورت دستی بسازید). .sp استفاده از اعلان‌های چندخطی کاملاً مجاز است. رنگ‌ها را می‌توان از طریق set_color \%<> با ارسال نام رنگ‌های ANSI یا کدهای هگزادسیمال RGB تعیین کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX function fish_prompt set_color purple date \(dq+%m/%d/%y\(dq set_color FF0000 echo (pwd) \(aq>\(aq (set_color \-\-reset) end .EE .UNINDENT .UNINDENT .sp این خط اعلان به این صورت نمایش داده خواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX 02/06/13 /home/tutorial > _ .EE .UNINDENT .UNINDENT .sp همچنین ببینید: نوشتن خط اعلان اختصاصی \%<>\&. .sp می‌توانید با اجرای دستور \fBfish_config\fP در یک رابط وب، یا با \fBfish_config prompt\fP برای نسخه‌ای ساده‌تر درون ترمینال، از میان اعلان‌های نمونه یکی را برگزینید. .SH "$PATH" .sp متغیر محیطی \fB$PATH\fP حاوی فهرستی از دایرکتوری‌هایی است که فیش برای یافتن و اجرای دستورات در آن‌ها جستجو می‌کند. برخلاف سایر پوسته‌ها، در فیش $PATH یک لیست است، نه یک رشته جداشده با دونقطه. .sp فیش متغیر \fB$PATH\fP را با مقادیر پیش‌فرضی تنظیم می‌کند، اما در حالت عادی این متغیر مستقیماً از فرآیند والد به ارث می‌رسد و به مقداری منطقی و مناسب برای سیستم تنظیم می‌شود \- به بخش صادر کردن متغیرها مراجعه کنید. .sp برای اضافه کردن مسیرهای /usr/local/bin و /usr/sbin به ابتدای \fB$PATH\fP، می‌توانید بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX > set PATH /usr/local/bin /usr/sbin $PATH .EE .UNINDENT .UNINDENT .sp برای حذف /usr/local/bin از \fB$PATH\fP، می‌توانید بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX > set PATH (string match \-v /usr/local/bin $PATH) .EE .UNINDENT .UNINDENT .sp برای سازگاری با سایر پوسته‌ها و دستورات خارجی، $PATH یک متغیر مسیر \%<#\:variables-path> است و به همین دلیل هنگام قرار گرفتن داخل کوتیشن، با دونقطه (نه فاصله) متصل می‌شود: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo \(dq$PATH\(dq /usr/local/sbin:/usr/local/bin:/usr/bin .EE .UNINDENT .UNINDENT .sp و به همین ترتیب نیز صادر می‌شود؛ همچنین هنگامی که فیش شروع به کار می‌کند، متغیر $PATH دریافتی را بر اساس دونقطه به یک لیست تبدیل می‌کند. .sp می‌توانید این تغییرات را مستقیماً در فایل \fBconfig.fish\fP انجام دهید؛ همان‌طور که ممکن است در سایر پوسته‌ها با فایل \fB\&.profile\fP انجام دهید. .sp یک روش سریع‌تر، استفاده از تابع fish_add_path \%<> است که در صورت عدم وجود دایرکتوری‌های داده‌شده در مسیر، آن‌ها را به PATH اضافه می‌کند. این تابع این کار را از طریق ویرایش متغیر یونیورسال \fB$fish_user_paths\fP انجام می‌دهد که به طور خودکار به ابتدای \fB$PATH\fP اضافه می‌گردد. برای مثال جهت اضافه کردن همیشگی \fB/usr/local/bin\fP به \fB$PATH\fP خود، می‌توانید بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX > fish_add_path /usr/local/bin .EE .UNINDENT .UNINDENT .sp مزیت این روش آن است که نیازی به ویرایش فایل‌های متنی ندارید: کافی است این دستور را یک‌بار در خط فرمان اجرا کنید تا در نشست جاری و تمامی نشست‌های آینده اعمال شود. همچنین می‌توانید این خط را در config.fish قرار دهید، چرا که این تابع فقط در صورت لزوم مسیر را اضافه می‌کند. .sp همچنین می‌توانید متغیر $fish_user_paths را مستقیماً ویرایش کنید، اما باید مراقب باشید که در فایل config.fish به صورت بدون قید و شرط مقداری به آن اضافه نکنید، زیرا با هر بار باز شدن پوسته طولانی‌تر خواهد شد. .SH "راه‌اندازی اولیه (.bashrc کجاست؟) (STARTUP - WHERE'S .BASHRC?)" .sp فیش کار خود را با اجرای دستورات موجود در فایل \fB~/.config/fish/config.fish\fP آغاز می‌کند. در صورت عدم وجود، می‌توانید آن را ایجاد کنید. .sp می‌توان توابع و متغیرها را مستقیماً در فایل \fBconfig.fish\fP با استفاده از دستوراتی که در بالا ذکر شد تعریف کرد؛ برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX > cat ~/.config/fish/config.fish set \-x PATH $PATH /sbin/ function ll ls \-lh $argv end .EE .UNINDENT .UNINDENT .sp با این حال، روش رایج‌تر و بسیار کارآمدتر، استفاده از توابع بارگذاری خودکار (Autoloading Functions) و متغیرهای یونیورسال است. .sp اگر می‌خواهید پیکربندی خود را سازمان‌دهی کنید، فیش همچنین دستورات موجود در فایل‌های .fish در مسیر \fB~/.config/fish/conf.d/\fP را می‌خواند. برای جزئیات به فایل‌های پیکربندی مراجعه کنید \%<#\:configuration>\&. .SH "بارگذاری خودکار توابع (AUTOLOADING FUNCTIONS)" .sp هنگامی که فیش با یک دستور مواجه می‌شود، تلاش می‌کند با جستجو برای فایلی هم‌نام با آن دستور در مسیر \fB~/.config/fish/functions/\fP، تابعی را برای آن به طور خودکار بارگذاری کند. .sp برای مثال اگر می‌خواهید تابعی به نام \fBll\fP داشته باشید، کافی است یک فایل متنی با نام \fBll.fish\fP به دایرکتوری \fB~/.config/fish/functions\fP اضافه کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > cat ~/.config/fish/functions/ll.fish function ll ls \-lh $argv end .EE .UNINDENT .UNINDENT .sp این روش شیوه پیشنهادی و استاندارد برای تعریف خط اعلان شما نیز هست: .INDENT 0.0 .INDENT 3.5 .sp .EX > cat ~/.config/fish/functions/fish_prompt.fish function fish_prompt echo (pwd) \(dq> \(dq end .EE .UNINDENT .UNINDENT .sp برای آشنایی با روش‌های ایجاد خودکار این فایل‌ها به مستندات funced \%<> و funcsave \%<>، و برای کنترل مسیر ذخیره آن‌ها به $fish_function_path \%<#\:syntax-function-autoloading> مراجعه کنید. .SH "متغیرهای عمومی (یونیورسال) (UNIVERSAL VARIABLES)" .sp متغیر یونیورسال متغیری است که مقدار آن در تمام نمونه‌ها و پنجره‌های فیش، هم‌اکنون و در آینده \- حتی پس از راه‌اندازی مجدد سیستم (Reboot) \- به اشتراک گذاشته می‌شود. می‌توانید با دستور \fBset \-U\fP یک متغیر را یونیورسال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX > set \-U EDITOR vim .EE .UNINDENT .UNINDENT .sp اکنون در یک پوسته یا پنجره دیگر: .INDENT 0.0 .INDENT 3.5 .sp .EX > echo $EDITOR vim .EE .UNINDENT .UNINDENT .sp شما تنها یک‌بار نیاز به تنظیم تعاملی متغیرهای یونیورسال دارید و هیچ نیازی به اضافه کردن آن‌ها به فایل‌های پیکربندی خود نیست \%<#\:configuration>\&. برای جزئیات بیشتر به بخش متغیرهای یونیورسال مراجعه نمایید \%<#\:variables-universal>\&. .SH "آماده برای یادگیری بیشتر؟ (READY FOR MORE?)" .sp اگر مایلید درباره فیش بیشتر بیاموزید، مستندات جامع و تفصیلی فراوانی وجود دارد \%<#\:intro>، کانال رسمی gitter به آدرس \%، لیست پستی رسمی به آدرس \%، و صفحه گیت‌هاب پروژه به آدرس \%\&. .SH "نویسنده (AUTHOR)" توسعه‌دهندگان fish-shell .SH "حق نشر (COPYRIGHT)" توسعه‌دهندگان fish-shell .\" End of generated man page.