| BASH(1) | General Commands Manual | BASH(1) |
نام (NAME)
bash - پوسته و مفسر زبان خط فرمان گنو (GNU Bourne-Again SHell)
خلاصه دستور (SYNOPSIS)
bash [options] [command_string | file]
حق نشر (COPYRIGHT)
Bash is Copyright (C) 1989-2025 by the Free Software Foundation, Inc.
توضیحات (DESCRIPTION)
Bash یک مفسر زبان فرمان است که دستورات خواندهشده از ورودی استاندارد، از یک رشته، یا از یک فایل را اجرا میکند. این یک پیادهسازی مجدد و توسعهیافته از پوسته Bourne است، مفسر تاریخی زبان فرمان یونیکس. Bash همچنین ویژگیهای مفیدی را از پوستههای Korn و C (ksh و csh) در بر میگیرد.
POSIX نام خانوادهای از استانداردهای محاسباتی مبتنی بر یونیکس است. Bash به گونهای طراحی شده است که یک پیادهسازی منطبق بر بخش پوسته و ابزارهای مشخصات POSIX موسسه IEEE (استاندارد IEEE 1003.1) باشد. حالت POSIX در Bash (که از این پس به آن posix mode گفته میشود) رفتار پوسته را در جاهایی که عملکرد پیشفرض آن با استاندارد تفاوت دارد، تغییر میدهد تا دقیقاً با استاندارد مطابقت داشته باشد. برای ارجاع به سندی که جزئیات چگونگی تأثیر حالت posix بر رفتار bash را شرح میدهد، بخش همچنین ببینید (SEE ALSO) در زیر را مشاهده کنید. Bash میتواند پیکربندی شود تا به صورت پیشفرض با POSIX-سازگار باشد.
گزینهها (OPTIONS)
تمام گزینههای تکنویسهای پوسته که در توضیحات دستور توکار set مستند شدهاند، از جمله -o، میتوانند در هنگام فراخوانی پوسته به عنوان گزینه استفاده شوند. علاوه بر این، bash گزینههای زیر را در هنگام فراخوانی تفسیر میکند:
- -c
- اگر گزینه -c حضور داشته باشد، دستورات از اولین آرگومان غیرگزینهای command_string خوانده میشوند. اگر آرگومانهایی پس از command_string وجود داشته باشند، اولین آرگومان به $0 اختصاص داده میشود و آرگومانهای باقیمانده به پارامترهای مکانی تخصیص مییابند. انتساب به $0 نام پوسته را تعیین میکند که در پیامهای هشدار و خطا استفاده میشود.
- -i
- اگر گزینه -i حضور داشته باشد، پوسته تعاملی(interactive) خواهد بود.
- -l
- باعث میشود bash به گونهای عمل کند که گویی به عنوان یک پوسته ورود (login shell) فراخوانی شده است (بخش فراخوانی (INVOCATION) در زیر را ببینید).
- -r
- اگر گزینه -r حضور داشته باشد، پوسته محدود (restricted) میشود (بخش پوسته محدود (RESTRICTED SHELL) در زیر را ببینید).
- -s
- اگر گزینه -s حضور داشته باشد، یا اگر پس از پردازش گزینهها هیچ آرگومانی باقی نماند، پوسته دستورات را از ورودی استاندارد میخواند. این گزینه اجازه میدهد تا پارامترهای مکانی در هنگام فراخوانی یک پوسته تعاملی یا هنگام خواندن ورودی از طریق پایپ تنظیم شوند.
- -D
- فهرستی از تمام رشتههای داخل جفتگیومه (double-quoted) را که قبل از آنها $ آمده است، در خروجی استاندارد چاپ میکند. اینها رشتههایی هستند که وقتی لوکال (locale) فعلی C یا POSIX نباشد، مشمول ترجمه زبانی میشوند. این گزینه متضمن گزینه -n است؛ هیچ دستوری اجرا نخواهد شد.
- [-+]O [shopt_option]
- shopt_option یکی از گزینههای پوسته است که توسط دستور توکار shopt پذیرفته میشود (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید). اگر shopt_option مشخص شده باشد، -O مقدار آن گزینه را تنظیم (فعال) میکند؛ و +O آن را لغو تنظیم (غیرفعال) میکند. اگر shopt_option داده نشود، bash نامها و مقادیر گزینههای پوستهای را که توسط shopt پذیرفته میشوند در خروجی استاندارد چاپ میکند. اگر گزینه فراخوانی +O باشد، خروجی در قالبی نمایش داده میشود که بتوان دوباره از آن به عنوان ورودی استفاده کرد.
- --
- یک -- پایان گزینهها را نشان میدهد و پردازش گزینههای بیشتر را غیرفعال میکند. هر شناسه یا آرگومانی بعد از -- به عنوان نام فایل اسکریپت پوسته (زیر را ببینید) و آرگومانهای ارسالی به آن اسکریپت در نظر گرفته میشود. یک آرگومانِ - معادل -- است.
Bash همچنین تعدادی گزینه چندنویسهای (چندکاراکتری) را تفسیر میکند. این گزینهها برای این که شناسایی شوند باید روی خط فرمان قبل از گزینههای تکنویسهای ظاهر شوند.
- --debugger
- ترتیبی میدهد که نمایه (پروفایل) اشکالزدا (debugger) قبل از شروع پوسته اجرا شود. حالت اشکالزدایی گسترشیافته را فعال میکند (توضیحات مربوط به گزینه extdebug برای دستور توکار shopt در زیر را ببینید).
- --dump-po-strings
- معادل -D است، اما خروجی در قالب فایل “po” (شیء قابل حمل یا portable object) گنو gettext است.
- --dump-strings
- معادل -D است.
- --help
- یک پیام راهنمای نحوه استفاده را در خروجی استاندارد نمایش میدهد و با موفقیت خارج میشود.
- --init-file file
- --rcfile file
- دستورات را از file به جای فایل راهاندازی شخصی استاندارد ~/.bashrc اجرا میکند، در صورتی که پوسته تعاملی باشد (بخش فراخوانی (INVOCATION) در زیر را ببینید).
- --login
- معادل -l است.
- --noediting
- هنگامی که پوسته تعاملی است، از کتابخانه readline گنو برای خواندن خطوط فرمان استفاده نمیکند.
- --noprofile
- نه فایل راهاندازی سرتاسری سیستم /etc/profile و نه هیچیک از فایلهای راهاندازی شخصی ~/.bash_profile، ~/.bash_login، یا ~/.profile را نمیخواند. به طور پیشفرض، bash وقتی به عنوان یک پوسته ورود (login shell) فراخوانی میشود، این فایلها را میخواند (بخش فراخوانی (INVOCATION) در زیر را ببینید).
- --norc
- در صورتی که پوسته تعاملی باشد، فایل راهاندازی شخصی ~/.bashrc را نخوانده و اجرا نمیکند. این گزینه در صورتی که پوسته به عنوان sh فراخوانی شود، به طور پیشفرض فعال است.
- --posix
- حالت posix را فعال میکند؛ رفتار bash را در مواردی که عملکرد پیشفرض با استاندارد POSIX تفاوت دارد، تغییر میدهد تا با این استاندارد مطابقت یابد.
- --restricted
- پوسته محدود میشود (بخش پوسته محدود (RESTRICTED SHELL) در زیر را ببینید).
- --verbose
- معادل -v است.
- --version
- اطلاعات نسخه این نمونه از bash را در خروجی استاندارد نمایش داده و با موفقیت خارج میشود.
شناسهها (ARGUMENTS)
اگر پس از پردازش گزینهها، شناسههایی باقی بمانند و هیچیک از گزینههای -c یا -s مشخص نشده باشند، نخستین شناسه به عنوان نام یک فایل حاوی دستورات پوسته (یک اسکریپت پوسته یا shell script) در نظر گرفته میشود. هنگامی که bash به این روش فراخوانی میشود، $0 برابر با نام فایل تنظیم شده، و پارامترهای مکانی برابر با شناسههای باقیمانده قرار میگیرند. Bash دستورات را از این فایل خوانده و اجرا میکند، سپس خارج میشود. وضعیت خروج Bash همان وضعیت خروج آخرین دستور اجرا شده در اسکریپت است. اگر هیچ دستوری اجرا نشود، وضعیت خروج 0 است. Bash ابتدا تلاش میکند فایل را در دایرکتوری جاری باز کند، و در صورتی که فایلی یافت نشود، دایرکتوریهای موجود در PATH را برای یافتن اسکریپت جستجو میکند.
فراخوانی (INVOCATION)
یک پوسته ورود (login shell) پوستهای است که نخستین نویسه از آرگومان صفرم آن یک - باشد، یا با گزینه --login شروع شده باشد.
یک پوسته تعاملی (interactive shell) پوستهای است که بدون شناسههای غیرگزینهای شروع شده باشد (مگر اینکه -s مشخص شده باشد) و بدون گزینه -c باشد، و ورودی استاندارد و خطای استاندارد آن هر دو به ترمینالها متصل باشند (همانطور که توسط isatty(3) تعیین میشود)، یا پوستهای که با گزینه -i شروع شده باشد. Bash متغیر PS1 را مقداردهی کرده و $- شامل i خواهد بود اگر پوسته تعاملی باشد، تا یک اسکریپت پوسته یا یک فایل راهاندازی بتواند این وضعیت را بررسی کند.
پاراگرافهای زیر توضیح میدهند که چگونه bash فایلهای راهاندازی خود را اجرا میکند. اگر هر یک از فایلها وجود داشته باشند اما قابل خواندن نباشند، bash یک خطا گزارش میکند. علامت تیلدا (Tilde) در نام فایلها همانطور که در زیر در بخش بسط تیلدا (Tilde Expansion) در بخش بسط (EXPANSION) شرح داده شده است، بسط مییابد.
هنگامی که bash بهعنوان یک پوستهٔ تعاملی لاگین (login shell) یا بهعنوان یک پوستهٔ غیرتعاملی با گزینهٔ --login فراخوانی میشود، ابتدا دستورات را از فایل /etc/profile، در صورت وجود، خوانده و اجرا میکند. پس از خواندن آن فایل، به ترتیب به دنبال ~/.bash_profile، ~/.bash_login و ~/.profile میگردد و دستورات را از اولین فایلی که موجود و قابل خواندن باشد خوانده و اجرا میکند. گزینهٔ --noprofile میتواند هنگام راهاندازی پوسته برای جلوگیری از این رفتار استفاده شود.
هنگامی که یک پوستهٔ تعاملی لاگین خارج میشود، یا یک پوستهٔ لاگین غیرتعاملی دستور توکار exit را اجرا میکند، bash دستورات را از فایل ~/.bash_logout، در صورت وجود، خوانده و اجرا میکند.
هنگامی که یک پوستهٔ تعاملی که پوستهٔ لاگین نیست راهاندازی میشود، bash دستورات را از ~/.bashrc، در صورت وجود، خوانده و اجرا میکند. گزینهٔ --norc مانع از این رفتار میشود. گزینهٔ --rcfile file باعث میشود bash به جای ~/.bashrc از file استفاده کند.
هنگامی که bash بهصورت غیرتعاملی راهاندازی میشود، برای مثال برای اجرای یک اسکریپت پوسته، به دنبال متغیر BASH_ENV در محیط میگردد، مقدار آن را در صورت وجود بسط میدهد و از مقدار بسطیافته بهعنوان نام فایلی برای خواندن و اجرا کردن استفاده میکند. Bash بهگونهای رفتار میکند که گویی دستور زیر اجرا شده است:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
اما از مقدار متغیر PATH برای جستجوی نام فایل استفاده نمیکند.
اگر bash با نام sh فراخوانی شود، تلاش میکند تا رفتار راهاندازی نسخههای تاریخی sh را تا جای ممکن با دقت تقلید کند، در حالی که با استاندارد POSIX نیز مطابقت دارد. هنگامی که بهعنوان یک پوستهٔ تعاملی لاگین، یا یک پوستهٔ غیرتعاملی با گزینهٔ --login فراخوانی میشود، ابتدا تلاش میکند دستورات را به ترتیب از /etc/profile و ~/.profile خوانده و اجرا کند. گزینهٔ --noprofile مانع از این رفتار میشود. هنگامی که بهعنوان یک پوستهٔ تعاملی با نام sh فراخوانی میشود، bash به دنبال متغیر ENV میگردد، در صورت تعریف بودن مقدار آن را بسط میدهد و از مقدار بسطیافته بهعنوان نام فایلی برای خواندن و اجرا کردن استفاده میکند. از آنجا که پوستهای که با نام sh فراخوانی شده تلاش نمیکند تا دستورات را از هیچ فایل راهاندازی دیگری بخواند و اجرا کند، گزینهٔ --rcfile هیچ اثری ندارد. یک پوستهٔ غیرتعاملی که با نام sh فراخوانی میشود تلاش نمیکند تا هیچ فایل راهاندازی دیگری را بخواند.
هنگامی که به عنوان sh فراخوانی میشود، bash پس از خواندن فایلهای راهاندازی، وارد حالت posix میگردد.
هنگامی که bash در حالت posix آغاز به کار میکند، مانند زمانی که با گزینه خط فرمان --posix اجرا میشود، از استاندارد POSIX برای فایلهای راهاندازی پیروی میکند. در این حالت، پوستههای تعاملی متغیر ENV را بسط داده و دستورات را از فایلی که نام آن همان مقدار بسطیافته است، خوانده و اجرا میکنند. هیچ فایل راهاندازی دیگری خوانده نمیشود.
Bash تلاش میکند تشخیص دهد که چه زمانی ورودی استاندارد آن به یک اتصال شبکهای متصل است، مانند زمانی که توسط دیمن قدیمی و به ندرت دیدهشدهی پوسته از راه دور، معمولاً rshd، یا دیمن پوسته امن sshd اجرا شده باشد. اگر bash تشخیص دهد که به این شیوه و به صورت غیرتعاملی اجرا میشود، در صورت وجود داشتن و قابل خواندن بودن فایل ~/.bashrc، دستورات را از آن خوانده و اجرا میکند. Bash در صورتی که به عنوان sh فراخوانی شده باشد این فایل را نمیخواند. گزینه --norc از این رفتار جلوگیری میکند، و گزینه --rcfile باعث میشود که bash به جای ~/.bashrc از فایل دیگری استفاده کند، اما معمولاً نه rshd و نه sshd پوسته را با این گزینهها فراخوانی نمیکنند و اجازه مشخص کردن آنها را نیز نمیدهند.
اگر پوسته در حالتی آغاز به کار کند که شناسه کاربری (گروهی) موثر آن برابر با شناسه کاربری (گروهی) واقعی نباشد، و گزینه -p ارائه نشده باشد، هیچ فایل راهاندازی خوانده نمیشود، توابع پوسته از محیط به ارث برده نمیشوند، متغیرهای SHELLOPTS، BASHOPTS، CDPATH و GLOBIGNORE در صورت وجود در محیط نادیده گرفته میشوند، و شناسه کاربری موثر به شناسه کاربری واقعی تنظیم میشود. اگر گزینه -p هنگام فراخوانی ارائه شده باشد، رفتار راهاندازی یکسان خواهد بود، اما شناسه کاربری موثر بازنشانی نمیگردد.
تعاریف (DEFINITIONS)
تعاریف زیر در سراسر این سند مورد استفاده قرار میگیرند.
- blank
- یک نویسه فاصله (space) یا تب (tab).
- whitespace
- نویسهای که در لوکال فعلی متعلق به کلاس نویسهای space باشد، یا تابعی مانند isspace(3) برای آن مقدار درستی برگرداند.
- word
- دنبالهای از نویسهها که توسط پوسته به عنوان یک واحد مجزا در نظر گرفته میشود. همچنین با عنوان token (نشانه) نیز شناخته میشود.
- name
- یک word که تنها شامل نویسههای الفبایی-عددی و زیرخط (underscore) بوده، و با یک نویسه الفبایی یا زیرخط آغاز میشود. همچنین به عنوان identifier (شناسه) نیز از آن یاد میشود.
- metacharacter
- نویسهای
که در صورت
عدم
قرارگیری
در
نقلقول،
کلمات را از
یکدیگر جدا
میکند. یکی
از موارد
زیر:
| & ; ( ) < > space tab newline
- عملگر کنترلی (control operator)
- یک نشانه (token) که یک تابع کنترلی را انجام میدهد. این عملگر یکی از نمادهای زیر است:
|| & && ; ;; ;& ;;& ( ) | |& <newline>
کلمات رزرو شده (RESERVED WORDS)
کلمات رزرو شده کلماتی هستند که برای پوسته معنای ویژهای دارند. کلمات زیر در صورتی که نقلقول نشده باشند و کلمه اول یک دستور باشند (به گرامر پوسته (SHELL GRAMMAR) در زیر مراجعه کنید)، کلمه سوم یک دستور case یا select باشند (تنها in معتبر است)، یا کلمه سوم یک دستور for باشند (تنها in و do معتبر هستند) به عنوان کلمات رزرو شده شناخته میشوند:
! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]
گرامر پوسته (SHELL GRAMMAR)
این بخش نحو شکلهای مختلف دستورات پوسته را شرح میدهد.
دستورات ساده (Simple Commands)
یک destور ساده (simple command) دنبالهای از انتسابهای اختیاری متغیر است که با کلمات جدا شده با نویسه خالی (blank) و تغییر مسیرها دنبال میشود، و با یک عملگر کنترلی خاتمه مییابد. کلمه اول دستوری را که باید اجرا شود مشخص میکند و به عنوان آرگومان صفر ارسال میشود. کلمات باقیمانده به عنوان آرگومان به دستور فراخوانیشده ارسال میشوند.
مقدار بازگشتی یک دستور ساده، وضعیت خروج آن است، یا 128+n در صورتی که دستور با سیگنال n خاتمه یافته باشد.
خطوط لوله (Pipelines)
یک خط لوله (pipeline) دنبالهای از یک یا چند دستور است که توسط یکی از عملگرهای کنترلی | یا |& جدا شدهاند. قالب یک خط لوله به صورت زیر است:
[time [-p]] [ ! ] command1 [ [|⎪|&] command2 ... ]
خروجی استاندارد command1 از طریق یک لوله (pipe) به ورودی استاندارد command2 متصل میشود. این اتصال پیش از هرگونه تغییر مسیر مشخصشده توسط command1 انجام میشود (به تغییر مسیر (REDIRECTION) در زیر مراجعه کنید). اگر |& عملگر خط لوله باشد، علاوه بر خروجی استاندارد، خطای استاندارد command1 نیز از طریق لوله به ورودی استاندارد command2 متصل میشود؛ این یک شیوه خلاصهنویسی برای 2>&1 | است. این تغییر مسیر ضمنی خطای استاندارد به خروجی استاندارد، پس از هرگونه تغییر مسیر مشخصشده توسط command1 انجام میشود.
وضعیت بازگشتی یک خط لوله برابر با وضعیت خروج آخرین دستور است، مگر اینکه گزینه pipefail فعال باشد. اگر pipefail فعال باشد، وضعیت بازگشتی خط لوله برابر با مقدار آخرین (راستترین) دستوری است که با وضعیت غیرصفر خارج شده است، یا صفر خواهد بود اگر تمام دستورات با موفقیت خارج شوند. اگر کلمه رزرو شده ! پیش از یک خط لوله قرار گیرد، وضعیت خروج آن خط لوله نقیض منطقی وضعیت خروج توصیفشده در بالا خواهد بود. اگر یک خط لوله به صورت همگام اجرا شود، پوسته پیش از بازگرداندن یک مقدار، منتظر میماند تا تمام دستورات موجود در خط لوله خاتمه یابند.
اگر کلمه رزرو شده time پیش از یک خط لوله قرار گیرد، پوسته در هنگام خاتمه خط لوله، زمان سپریشده و همچنین زمان مصرفشده کاربری و سیستمی اجرای آن را گزارش میدهد. گزینه -p قالب خروجی را به قالبی که توسط POSIX مشخص شده تغییر میدهد. هنگامی که پوسته در حالت posix قرار دارد، در صورتی که نشانه بعدی با یک “-” آغاز شود، time را به عنوان کلمه رزرو شده نمیشناسد. مقدار متغیر TIMEFORMAT یک رشته قالبی است که نحوه نمایش اطلاعات زمانبندی را مشخص میکند؛ شرح TIMEFORMAT را در زیر تحت عنوان متغیرهای پوسته (Shell Variables) ببینید.
هنگامی که پوسته در حالت posix باشد، time ممکن است به تنهایی به عنوان تنها کلمه در یک دستور ساده ظاهر شود. در این حالت، پوسته مجموع زمان کاربر و سیستم مصرف شده توسط پوسته و فرزندان آن را نمایش میدهد. متغیر TIMEFORMAT قالب اطلاعات زمان را مشخص میکند.
هر دستور در یک خط لوله چند دستوره، جایی که لولهها ایجاد میشوند، در یک subshell (زیرپوسته) اجرا میشود که یک فرایند مجزا است. بخش محیط اجرای دستور (COMMAND EXECUTION ENVIRONMENT) را برای شرح زیرپوستهها و محیط زیرپوسته ببینید. اگر گزینه lastpipe با استفاده از دستور توکار shopt فعال شده باشد (شرح shopt را در زیر ببینید)، و مدیریت کارها فعال نباشد، آخرین عنصر یک خط لوله ممکن است توسط فرایند پوسته اجرا شود.
لیستها (Lists)
یک list (لیست) دنبالهای از یک یا چند خط لوله است که با یکی از عملگرهای ;، &، &&، یا || جدا شدهاند، و به صورت اختیاری با یکی از ;، &، یا <newline> خاتمه مییابند.
از بین این عملگرهای لیست، && و || تقدم یکسانی دارند، و پس از آنها ; و & قرار دارند که آنها نیز تقدم برابری دارند.
دنبالهای از یک یا چند خط جدید ممکن است در یک list به جای یک نقطهویرگول (semicolon) برای جداسازی دستورات ظاهر شود.
اگر دستوری با عملگر کنترلی & پایان یابد، پوسته دستور را در پسزمینه در یک زیرپوسته اجرا میکند. پوسته منتظر پایان دستور نمیماند، و وضعیت بازگشتی 0 است. به اینها دستورات ناهمگام (asynchronous) گفته میشود. دستوراتی که با یک ; از هم جدا شدهاند به صورت متوالی اجرا میشوند؛ پوسته به نوبت منتظر پایان هر دستور میماند. وضعیت بازگشتی برابر با وضعیت خروج آخرین دستور اجرا شده است.
لیستهای AND و OR دنبالههایی از یک یا چند خط لوله هستند که به ترتیب با عملگرهای کنترلی && و || جدا شدهاند. لیستهای AND و OR با خاصیت شرکتپذیری از چپ اجرا میشوند. یک لیست AND به شکل زیر است:
command1 && command2
command2 اجرا میشود اگر، و تنها اگر، command1 وضعیت خروج صفر (موفقیتآمیز) را برگرداند.
یک لیست OR به شکل زیر است:
command1 || command2
command2 اجرا میشود اگر، و تنها اگر، command1 وضعیت خروج غیرصفر را برگرداند. وضعیت بازگشتی لیستهای AND و OR برابر با وضعیت خروج آخرین دستور اجرا شده در لیست است.
دستورات مرکب (Compound Commands)
یک compound command (دستور مرکب) یکی از موارد زیر است. در اغلب موارد یک list در توضیحات دستور ممکن است با یک یا چند خط جدید از بقیه دستور جدا شود، و ممکن است به جای یک نقطهویرگول با یک خط جدید دنبال شود.
- (list)
- list در یک زیرپوسته (subshell) اجرا میشود (برای شرح محیط زیرپوسته، محیط اجرای دستور (COMMAND EXECUTION ENVIRONMENT) در زیر را ببینید). انتسابهای متغیر و دستورات توکاری که بر محیط پوسته تأثیر میگذارند پس از تکمیل دستور پابرجا نمیمانند. وضعیت بازگشتی، همان وضعیت خروج list است.
- { list; }
- list در محیط فعلی پوسته اجرا میشود. list باید با یک خط جدید یا یک نقطهویرگول خاتمه یابد. این ساختار به عنوان یک group command (دستور گروهی) شناخته میشود. وضعیت بازگشتی، همان وضعیت خروج list است.
- توجه داشته باشید که برخلاف نویسههای کنترلی (metacharacters) ( و )، { و } جزو کلمات رزرو شده (reserved words) هستند و باید در جایی قرار گیرند که شناسایی یک کلمه رزرو شده مجاز باشد. از آنجا که این نویسهها باعث شکستن کلمه (word break) نمیشوند، باید با فاصله خالی یا یک نویسه کنترلی دیگرِ پوسته از list جدا شوند.
- ((expression))
- عبارت حسابی expression طبق قوانینی که در بخش ارزیابی حسابی (ARITHMETIC EVALUATION) در زیر شرح داده شده ارزیابی میشود. اگر مقدار عبارت غیرصفر باشد، وضعیت بازگشتی 0 است؛ در غیر این صورت وضعیت بازگشتی 1 خواهد بود. عبارت expression دقیقاً متحمل همان بسطهایی میشود که گویی درون علامتهای نقلقول دوتایی قرار دارد، اما نویسههای نقلقول دوتاییِ اسکیپنشده در expression بهطور ویژه پردازش نمیشوند و حذف میگردند. از آنجا که این امر میتواند منجر به رشتههای خالی شود، این دستور با آنها مانند عباراتی که به 0 ارزیابی میشوند رفتار میکند.
- [[ expression ]]
- عبارت شرطی expression را ارزیابی کرده و وضعیت صفر (true) یا غیرصفر (false) را بازمیگرداند. عبارتها از موارد پایهای (primaries) که در زیر تحت بخش عبارات شرطی (CONDITIONAL EXPRESSIONS) شرح داده شدهاند، تشکیل میشوند. کلمات بین [[ و ]] دستخوش تفکیک کلمات (word splitting) و بسط نام مسیر (pathname expansion) نمیشوند. پوسته بسط تیلدا، بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور، جایگزینی فرآیند و حذف نقلقول را روی آن کلمات انجام میدهد. عملگرهای شرطی مانند -f نباید نقلقول شده باشند تا بهعنوان عملگرهای پایه شناسایی شوند.
- هنگام استفاده با [[، عملگرهای < و > با استفاده از لوکال فعلی (current locale) بهصورت الفبایی مرتبسازی میکنند.
- هنگامی که عملگرهای == و != استفاده میشوند، رشته سمت راست عملگر بهعنوان یک الگو در نظر گرفته شده و طبق قوانین شرح داده شده در بخش تطبیق الگو (Pattern Matching) مطابقت داده میشود، گویی گزینه پوستهای extglob فعال است. عملگر = معادل == است. اگر گزینه پوستهای nocasematch فعال باشد، تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف الفبایی انجام میشود. مقدار بازگشتی در صورتی که رشته با الگو مطابقت داشته باشد (==) یا نداشته باشد (!=)، 0 و در غیر این صورت 1 است. اگر هر بخشی از الگو نقلقول شده باشد، بخش نقلقول شده بهعنوان یک رشته تطبیق داده میشود: هر نویسه در بخش نقلقولشده تنها با خودش تطبیق مییابد، به جای اینکه معنای ویژه تطبیق الگو داشته باشد.
- عملگر دودویی دیگری نیز به نام =~ در دسترس است که اولویتی یکسان با == و != دارد. هنگامی که استفاده میشود، رشته سمت راست عملگر بهعنوان یک POSIX عبارت باقاعده گسترشیافته (extended regular expression) در نظر گرفته شده و بر این اساس مطابقت مییابد (با استفاده از رابطهای POSIX regcomp و regexec که معمولاً در regex(3) شرح داده شدهاند). مقدار بازگشتی در صورتی که رشته با الگو مطابقت کند 0 و در غیر این صورت 1 است. اگر عبارت باقاعده از نظر نحوی نادرست باشد، مقدار بازگشتی عبارت شرطی 2 خواهد بود. اگر گزینه پوستهای nocasematch فعال باشد، تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف الفبایی انجام میشود.
- اگر هر بخشی از الگو نقلقول شده باشد، بخش نقلقولشده عیناً (literally) تطبیق داده میشود، همانطور که در بالا ذکر شد. اگر الگو در یک متغیر پوسته ذخیره شده باشد، نقلقول کردن بسط متغیر باعث میشود که کل الگو بهصورت لفظی و عینی تطبیق داده شود. با عبارات براکتی (bracket expressions) در عبارات باقاعده با احتیاط رفتار کنید، زیرا نویسههای نقلقول معمولی و الگو معنای خود را در میان براکتها از دست میدهند.
- اگر الگو با هر بخشی از رشته مطابقت کند، تطبیق موفقیتآمیز است. برای وادار کردن آن به تطبیق با کل رشته، الگو را با استفاده از عملگرهای عبارت باقاعده ^ و $ مهار (anchor) کنید.
- متغیر آرایهای BASH_REMATCH ثبت میکند که کدام بخشهای رشته با الگو تطبیق یافتهاند. عنصر BASH_REMATCH با اندیس 0 شامل بخشی از رشته است که با کل عبارت باقاعده مطابقت یافته است. زیررشتههای تطبیقیافته توسط زیرعبارتهای درون پرانتز در عبارت باقاعده، در اندیسهای باقیمانده BASH_REMATCH ذخیره میشوند. عنصر BASH_REMATCH با اندیس n بخشی از رشته است که با nـمین زیرعبارت پرانتزدار مطابقت یافته است. Bash متغیر BASH_REMATCH را در دامنه سراسری (global scope) تنظیم میکند؛ اعلان آن بهعنوان یک متغیر محلی (local) منجر به نتایج غیرمنتظره خواهد شد.
- عبارتها را میتوان با استفاده از عملگرهای زیر با یکدیگر ترکیب کرد که به ترتیب کاهش اولویت فهرست شدهاند:
- ( expression )
- مقدار expression را برمیگرداند. از این ساختار میتوان برای لغو و تغییر اولویت معمول عملگرها استفاده کرد.
- ! expression
- درست است اگر expression نادرست باشد.
- expression1 && expression2
- درست است اگر هم expression1 و هم expression2 درست باشند.
- expression1 || expression2
- درست است اگر حداقل یکی از expression1 یا expression2 درست باشد.
عملگرهای && و || در صورتی که مقدار expression1 برای تعیین مقدار بازگشتی کل عبارت شرطی کافی باشد، expression2 را ارزیابی نمیکنند.
- for name [ [ in word ... ] ; ] do list ; done
- ابتدا، فهرست کلمات پس از in بسط داده میشود و فهرستی از آیتمها ایجاد میگردد. سپس، متغیر name به نوبت برابر با هر یک از اعضای این فهرست قرار میگیرد و list در هر بار اجرا میشود. اگر in word حذف شود، دستور for فهرست list را یک بار به ازای هر پارامتر مکانیِ تنظیمشده اجرا میکند (بخش پارامترها (PARAMETERS) در زیر را ببینید). وضعیت بازگشتی برابر با وضعیت خروج آخرین دستور اجراشده است. اگر بسط آیتمهای پس از in منجر به یک فهرست خالی شود، هیچ دستوری اجرا نمیشود و وضعیت بازگشتی 0 خواهد بود.
- for (( expr1 ; expr2 ; expr3 )) [;] do list ; done
- ابتدا، عبارت حسابی expr1 مطابق با قواعد شرحدادهشده در زیر تحت ارزیابی حسابی (ARITHMETIC EVALUATION) ارزیابی میشود. سپس، عبارت حسابی expr2 به طور مکرر ارزیابی میگردد تا زمانی که مقدار آن برابر با صفر شود. هر بار که expr2 به یک مقدار غیر صفر ارزیابی شود، list اجرا شده و عبارت حسابی expr3 ارزیابی میشود. اگر هر یک از عبارتها حذف شود، رفتاری مشابه ارزیابی شدن به ۱ خواهد داشت. مقدار بازگشتی برابر با وضعیت خروج آخرین دستور اجراشده در list است، یا در صورتی که هر یک از عبارتها نامعتبر باشد، یک مقدار غیر صفر خواهد بود.
- از دستورات توکار break و continue (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید) برای کنترل اجرای حلقه استفاده کنید.
- select name [ in word ] ; do list ; done
- ابتدا، فهرست کلمات پس از in بسط داده میشود، فهرستی از آیتمها تولید میگردد، و مجموعه کلمات بسطیافته روی خطای استاندارد چاپ میشود، در حالی که پیش از هر کدام یک عدد قرار میگیرد. اگر in word حذف شود، پارامترهای مکانی چاپ میشوند (بخش پارامترها (PARAMETERS) در زیر را ببینید). سپس select اعلانِ PS3 را نمایش داده و یک خط از ورودی استاندارد میخواند. اگر خط شامل عددی منطبق بر یکی از کلمات نمایشدادهشده باشد، آنگاه select مقدار name را برابر با آن کلمه قرار میدهد. اگر خط خالی باشد، select کلمات و اعلان را دوباره نمایش میدهد. اگر EOF خوانده شود، select خاتمه یافته و 1 را برمیگرداند. هر مقدار دیگری، مقدار name را به تهی (null) تنظیم میکند. خط خواندهشده در متغیر REPLY ذخیره میشود. فهرست list پس از هر انتخاب اجرا میشود تا زمانی که یک دستور break اجرا شود. وضعیت خروج select برابر با وضعیت خروج آخرین دستور اجراشده در list است، یا اگر هیچ دستوری اجرا نشده باشد، صفر خواهد بود.
- case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
- دستور case ابتدا word را بسط میدهد و تلاش میکند آن را به نوبت با هر pattern تطبیق دهد، حرکت از اولین تا آخرین الگو انجام میشود، با استفاده از قواعد تطبیق شرح داده شده ذیل Pattern Matching در زیر. یک لیست الگو مجموعهای از یک یا چند الگو است که با جدا شدهاند، و عملگر ) به لیست الگو خاتمه میدهد. کلمه word با استفاده از بسط تیلدا، بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور، جایگزینی فرآیند و حذف نقلقول بسط داده میشود. هر pattern بررسی شده با استفاده از بسط تیلدا، بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور، جایگزینی فرآیند و حذف نقلقول بسط داده میشود. اگر گزینه پوسته nocasematch فعال باشد، تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف الفبایی انجام میشود. یک clause یک لیست الگو و یک list مرتبط است.
- هنگامی که یک تطبیق یافت شد، case دستور list متناظر را اجرا میکند. اگر عملگر ;; به عبارت case خاتمه دهد، دستور case پس از اولین تطبیق به پایان میرسد. استفاده از ;& به جای ;; باعث میشود اجرای دستورات با list مرتبط با لیست الگوی بعدی ادامه یابد. استفاده از ;;& به جای ;; باعث میشود پوسته لیست الگوی بعدی در دستور را (در صورت وجود) آزمایش کند و در صورت موفقیتآمیز بودن تطبیق، هر list مرتبط را اجرا کند، و اجرای دستور case را به گونهای ادامه دهد که گویی لیست الگو تطبیق نیافته است. اگر هیچ الگویی تطبیق پیدا نکند، وضعیت خروج صفر است.
- در غیر این صورت، وضعیت خروج برابر با وضعیت خروج آخرین دستور اجرا شده در آخرین list اجرا شده است.
- if list; then list; [ elif list; then list; ] ... [ else list; ] fi
- ابتدا if list اجرا میشود. اگر وضعیت خروج آن صفر باشد، then list اجرا میشود. در غیر این صورت، هر elif list به نوبت اجرا میشود، و اگر وضعیت خروج آن صفر باشد، then list متناظر اجرا شده و دستور خاتمه مییابد. در غیر این صورت، else list (در صورت وجود) اجرا میشود. وضعیت خروج برابر با وضعیت خروج آخرین دستور اجرا شده است، یا صفر اگر هیچ شرطی درست ارزیابی نشود.
- while list-1; do list-2; done
- until list-1; do list-2; done
- دستور while تا زمانی که آخرین دستور در لیست list-1 وضعیت خروج صفر را برگرداند، به طور مداوم لیست list-2 را اجرا میکند. دستور until کاملاً مشابه دستور while است، با این تفاوت که آزمایش نقیض شده است: list-2 تا زمانی که آخرین دستور در list-1 وضعیت خروج غیر صفر برگرداند اجرا میشود. وضعیت خروج دستورات while و until برابر با وضعیت خروج آخرین دستور اجرا شده در list-2 است، یا در صورتی که هیچ دستوری اجرا نشده باشد صفر خواهد بود.
همروندها (Coprocesses)
یک همروند (coprocess) یک دستور پوسته است که کلمه رزرو شده coproc پیش از آن قرار میگیرد. یک همروند به صورت ناهمگام در یک زیرپوسته (subshell) اجرا میشود، گویی که دستور با عملگر کنترلی & پایان یافته است، همراه با یک لوله دوطرفه که بین پوسته در حال اجرا و همروند برقرار شده است.
نحو یک همروند به صورت زیر است:
coproc [NAME] command [redirections]
این دستور یک همروند با نام NAME ایجاد میکند. command میتواند یک دستور ساده یا یک دستور مرکب باشد (به بخش بالا مراجعه کنید). NAME نام یک متغیر پوسته است. اگر NAME ارائه نشود، نام پیشفرض COPROC است.
شکل توصیهشده برای استفاده از یک همروند (coprocess) عبارت است از
coproc NAME { command [redirections]; }
این شکل ترجیح داده میشود زیرا در دستورات ساده نام همروند همواره COPROC خواهد بود، و استفاده از آن سادهتر و نسبت به سایر دستورات مرکب کاملتر است.
اگر command یک دستور مرکب باشد، تعیین NAME اختیاری است. کلمهای که پس از coproc میآید تعیین میکند که آیا آن کلمه به عنوان یک نام متغیر تفسیر شود یا خیر: در صورتی که یک کلمه رزرو شده که آغازگر یک دستور مرکب است نباشد، به عنوان NAME تفسیر میشود. اگر command یک دستور ساده باشد، استفاده از NAME مجاز نیست؛ این امر برای جلوگیری از اشتباه گرفتن NAME با نخستین کلمه دستور ساده است.
هنگامی که همروند اجرا میشود، پوسته یک متغیر آرایهای (به آرایهها (Arrays) در زیر مراجعه کنید) به نام NAME در بستر پوسته در حال اجرا ایجاد میکند. خروجی استاندارد command از طریق یک لوله (pipe) به یک توصیفکننده فایل در پوسته در حال اجرا متصل میشود، و آن توصیفکننده فایل به NAME[0] اختصاص مییابد. ورودی استاندارد command از طریق یک لوله به یک توصیفکننده فایل در پوسته در حال اجرا متصل میشود، و آن توصیفکننده فایل به NAME[1] اختصاص مییابد. این لوله پیش از هرگونه تغییر مسیری که توسط دستور مشخص شده برقرار میشود (به تغییر مسیر (REDIRECTION) در زیر مراجعه کنید). توصیفکنندههای فایل را میتوان با استفاده از بسطهای استاندارد کلمه، به عنوان آرگومانهای دستورات پوسته و تغییر مسیرها به کار برد. به غیر از مواردی که برای اجرای جایگزینی دستور و فرایند ایجاد میشوند، این توصیفکنندههای فایل در زیرپوستهها (subshells) در دسترس نیستند.
شناسه فرایند (PID) پوستهای که برای اجرای همروند ایجاد شده است، به عنوان مقدار متغیر NAME_PID در دسترس است. از دستور توکار wait میتوان برای انتظار جهت خاتمه همروند استفاده کرد.
از آنجا که همروند به عنوان یک دستور ناهمگام (asynchronous) ایجاد میشود، دستور coproc همیشه وضعیت موفقیت را برمیگرداند. وضعیت خروج یک همروند، همان وضعیت خروج command است.
تعریف توابع پوسته (Shell Function Definitions)
یک تابع پوسته شیئی است که مانند یک دستور ساده فراخوانی میشود و یک دستور مرکب را با مجموعهای جدید از پارامترهای مکانی اجرا میکند. توابع پوسته به صورت زیر اعلان میشوند:
- fname () compound-command [redirection]
- function fname [()] compound-command [redirection]
- این عبارت تابعی به نام fname را تعریف میکند. کلمه رزرو شده function اختیاری است. اگر کلمه رزرو شده function آورده شود، پرانتزها اختیاری هستند. بدنه تابع همان دستور مرکب compound-command است (به دستورات مرکب (Compound Commands) در بالا مراجعه کنید). این دستور معمولاً یک فهرست از دستورات بین { و } است، اما میتواند هر دستوری باشد که در بخش دستورات مرکب در بالا ذکر شده است. اگر کلمه رزرو شده function استفاده شود ولی پرانتزها آورده نشوند، استفاده از آکولادها توصیه میشود. compound-command هر زمان که fname به عنوان نام یک دستور ساده مشخص شود اجرا میگردد. در حالت posix، نام fname باید یک name معتبر برای پوسته باشد و نباید نام یکی از POSIX دستورات توکار ویژه باشد. در حالت پیشفرض، نام تابع میتواند هر کلمه نقلقولنشده در پوسته باشد که حاوی $ نباشد.
هرگونه تغییر مسیر (به تغییر مسیر (REDIRECTION) در زیر مراجعه کنید) که هنگام تعریف یک تابع تعیین شود، هنگام اجرای تابع انجام میگیرد.
وضعیت خروج تعریف یک تابع صفر است، مگر اینکه خطای نگارشی (syntax error) رخ دهد یا تابعی فقطخواندنی با همان نام از قبل موجود باشد. هنگام اجرا، وضعیت خروج یک تابع برابر با وضعیت خروج آخرین دستور اجرا شده در بدنه آن است. (به توابع (FUNCTIONS) در زیر مراجعه کنید.)
توضیحات (COMMENTS)
در یک پوسته غیرتعاملی، یا پوسته تعاملی که در آن گزینه interactive_comments برای دستور توکار shopt فعال است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید)، کلمهای که با # شروع شود، یک کامنت (توضیح) را آغاز میکند. یک کلمه در ابتدای خط، پس از فضای خالی بدون نقلقول، یا پس از یک عملگر شروع میشود. کامنت باعث میشود آن کلمه و تمام نویسههای باقیمانده در آن خط نادیده گرفته شوند. یک پوسته تعاملی بدون فعال بودن گزینه interactive_comments اجازه درج کامنت را نمیدهد. گزینه interactive_comments بهطور پیشفرض در پوستههای تعاملی فعال است.
نقلقول (QUOTING)
نقلقول (Quoting) برای حذف معنای ویژه برخی نویسهها یا کلمات برای پوسته استفاده میشود. از نقلقول میتوان برای غیرفعال کردن رفتار ویژه نویسههای خاص، جلوگیری از شناسایی کلمات رزرو شده به عنوان کلمه رزرو، و جلوگیری از بسط پارامتر استفاده کرد.
هر یک از نویسههای متغیر (metacharacters) فهرستشده در بالا زیر عنوان تعاریف (DEFINITIONS) معنای خاصی برای پوسته دارند و اگر قرار است نشاندهنده خود آن نویسه باشند، باید در نقلقول قرار گیرند.
هنگامی که امکانات بسط تاریخچه دستورات در حال استفاده است (بخش بسط تاریخچه (HISTORY EXPANSION) در زیر را ببینید)، نویسه بسط تاریخچه، که معمولاً ! است، باید برای جلوگیری از بسط تاریخچه در نقلقول قرار گیرد.
چهار سازوکار نقلقول وجود دارد: نویسه گریز (escape character)، نقلقول تکی (single quotes)، نقلقول دوگانه (double quotes)، و نقلقول دلار-تکی (dollar-single quotes).
یک بکاسلش بدون نقلقول (\) همان نویسه گریز است. این نویسه ارزش تحتاللفظی نویسه بعدی را حفظ کرده و هرگونه معنای ویژه آن را سلب میکند، به استثنای <newline>. اگر یک جفت \<newline> ظاهر شود و خود بکاسلش در نقلقول نباشد، با \<newline> به عنوان ادامه خط رفتار میشود (یعنی از جریان ورودی حذف شده و عملاً نادیده گرفته میشود).
قرار دادن نویسهها در نقلقول تکی ارزش تحتاللفظی تک تک نویسههای درون نقلقول را حفظ میکند. یک نقلقول تکی نمیتواند بین نقلقولهای تکی قرار گیرد، حتی اگر پیش از آن بکاسلش آمده باشد.
قرار دادن نویسهها در نقلقول دوگانه ارزش تحتاللفظی تمام نویسههای درون نقلقول را حفظ میکند، به استثنای $، `، \، و در صورت فعال بودن بسط تاریخچه، !. هنگامی که پوسته در حالت posix است، ! هیچ معنای ویژهای در نقلقول دوگانه ندارد، حتی زمانی که بسط تاریخچه فعال باشد. نویسههای $ و ` معنای ویژه خود را در نقلقول دوگانه حفظ میکنند. بکاسلش تنها در صورتی معنای ویژه خود را حفظ میکند که پس از آن یکی از نویسههای زیر آمده باشد: $، `، "، \، یا <newline>. بکاسلشهایی که پیش از نویسههای بدون معنای ویژه قرار دارند، دستنخورده باقی میمانند.
یک نقلقول دوگانه را میتوان با قرار دادن یک بکاسلش قبل از آن، در داخل نقلقول دوگانه نقل کرد. در صورت فعال بودن، بسط تاریخچه انجام خواهد شد مگر اینکه یک ! که در نقلقول دوگانه ظاهر میشود با استفاده از بکاسلش گریز داده شود. بکاسلش قبل از ! حذف نمیشود.
پارامترهای ویژهٔ * و @ هنگامی که درون نقلقول دوتایی (double quotes) قرار گیرند معنای ویژهای دارند (بخش پارامترها (PARAMETERS) در زیر را ببینید).
توالیهای نویسهای به شکل $'string' به عنوان گونهٔ ویژهای از نقلقول تکی (single quotes) در نظر گرفته میشوند. این توالی به string بسط مییابد، به طوری که نویسههای گریز با بکاسلش (backslash-escaped) در string طبق استاندارد ANSI C جایگزین میشوند. توالیهای گریز بکاسلش، در صورت وجود، به شرح زیر رمزگشایی میشوند:
- \a
- هشدار یا زنگ (alert/bell)
- \b
- پسبر یا پسفاصله (backspace)
- \e
- \E
- یک نویسهٔ گریز (escape character)
- \f
- برگهخور (form feed)
- \n
- خط جدید (new line)
- \r
- بازگشت به ابتدای خط (carriage return)
- \t
- تب افقی (horizontal tab)
- \v
- تب عمودی (vertical tab)
- \\
- بکاسلش (backslash)
- \'
- نقلقول تکی (single quote)
- \"
- نقلقول دوتایی (double quote)
- \?
- علامت سؤال (question mark)
- \nnn
- نویسهٔ هشت بیتی که مقدار آن مقدار اکتال nnn است (یک تا سه رقم اکتال یا هشتهشتی).
- \xHH
- نویسهٔ هشت بیتی که مقدار آن مقدار هگزادسیمال HH است (یک یا دو رقم هگزادسیمال یا شانزدهشانزدهی).
- \uHHHH
- نویسهٔ یونیکد (ISO/IEC 10646) که مقدار آن مقدار هگزادسیمال HHHH است (یک تا چهار رقم هگزادسیمال).
- \UHHHHHHHH
- نویسهٔ یونیکد (ISO/IEC 10646) که مقدار آن مقدار هگزادسیمال HHHHHHHH است (یک تا هشت رقم هگزادسیمال).
- \cx
- یک نویسهٔ کنترل-x.
نتیجهٔ بسطیافته در نقلقول تکی قرار میگیرد، درست مانند این که علامت دلار وجود نداشته است.
ترجمهٔ رشتهها
یک رشتهٔ درون نقلقول دوتایی که پیش از آن علامت دلار قرار دارد ($"string") باعث میشود که رشته مطابق با محلیسازی (locale) فعلی ترجمه شود. زیرساخت gettext عمل جستجو و ترجمه را با استفاده از متغیرهای پوستهٔ LC_MESSAGES، TEXTDOMAINDIR و TEXTDOMAIN انجام میدهد. اگر محلیسازی فعلی C یا POSIX باشد، اگر هیچ ترجمهای در دسترس نباشد، یا اگر رشته ترجمه نشود، علامت دلار نادیده گرفته میشود و با رشته مانند حالت نقلقول دوتایی به شکلی که در بالا توصیف شد رفتار میشود. این نوعی از نقلقول دوتایی است، بنابراین رشته به طور پیشفرض چه ترجمه و جایگزین شود و چه نشود، درون نقلقول دوتایی باقی میماند. اگر گزینهٔ noexpand_translation با استفاده از دستور توکار shopt فعال شده باشد، رشتههای ترجمهشده به جای نقلقول دوتایی در نقلقول تکی قرار میگیرند. توضیحات مربوط به shopt را در زیر بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) ببینید.
پارامترها (PARAMETERS)
یک parameter (پارامتر) موجودیتی است که مقادیر را ذخیره میکند. این موجودیت میتواند یک name، یک عدد، یا یکی از نویسههای ویژه فهرستشده در بخش پارامترهای ویژه (Special Parameters) در زیر باشد. یک variable (متغیر) پارامتری است که با یک name مشخص میشود. یک متغیر دارای یک value (مقدار) و صفر یا چند attribute (ویژگی) است. ویژگیها با استفاده از دستور توکار declare تخصیص داده میشوند (به declare در زیر، در بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) مراجعه کنید). دستورات توکار export و readonly ویژگیهای خاصی را تخصیص میدهند.
یک پارامتر در صورتی مقداردهیشده (set) محسوب میشود که مقداری به آن تخصیص یافته باشد. رشته تهی (null string) یک مقدار معتبر است. هنگامی که متغیری مقداردهی شد، تنها با استفاده از دستور توکار unset میتوان آن را لغو مقداردهی (unset) کرد (به بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر مراجعه کنید).
تخصیص مقدار به یک variable با استفاده از عبارتی به شکل زیر انجام میشود:
name=[value]
اگر value داده نشود، رشته تهی به متغیر تخصیص مییابد. همه valueها تحت بسط تیلده (tilde expansion)، بسط پارامتر و متغیر، جایگزینی دستور، بسط حسابی، و حذف نقلقول قرار میگیرند (به بخش بسط (EXPANSION) در زیر مراجعه کنید). اگر ویژگی integer متغیر تنظیم شده باشد، آنگاه value به عنوان یک عبارت حسابی ارزیابی میشود حتی اگر بسط $((...)) استفاده نشده باشد (به بسط حسابی (Arithmetic Expansion) در زیر مراجعه کنید). تفکیک کلمات و بسط مسیر (pathname expansion) انجام نمیشوند. عبارات انتساب همچنین میتوانند به عنوان آرگومانهای دستورات توکار alias، declare، typeset، export، readonly، و local ظاهر شوند (دستورات declaration یا اعلانی). در حالت posix، این دستورات توکار میتوانند در یک دستور پس از یک یا چند نمونه از دستور توکار command ظاهر شده و این ویژگیهای عبارت انتساب را حفظ کنند.
در زمینهای که یک عبارت انتساب در حال تخصیص مقدار به یک متغیر پوسته یا اندیس آرایه است، عملگر “+=” به مقدار قبلی متغیر الحاق میکند یا به آن میافزاید. این شامل آرگومانهای دستورات declaration مانند declare که عبارات انتساب را میپذیرند نیز میشود. هنگامی که “+=” روی متغیری اعمال میشود که ویژگی integer آن تنظیم شده است، مقدار فعلی متغیر و value هر کدام به عنوان عبارات حسابی ارزیابی میشوند، و مجموع نتایج به عنوان مقدار متغیر تخصیص مییابد. مقدار فعلی معمولاً یک عدد صحیح ثابت است، اما میتواند یک عبارت باشد. هنگامی که “+=” با استفاده از انتساب مرکب روی یک متغیر آرایه اعمال میشود (به آرایهها (Arrays) در زیر مراجعه کنید)، مقدار متغیر لغو (unset) نمیشود (برخلاف زمانی که از “=” استفاده میشود)، و مقادیر جدید به آرایه الحاق میشوند، که از یک واحد بیشتر از حداکثر اندیس آرایه (برای آرایههای اندیسی) آغاز میشود یا به عنوان جفتهای کلید-مقدار اضافی در یک آرایه انجمنی (associative) افزوده میشود. هنگامی که روی یک متغیر با مقدار رشتهای اعمال میشود، value بسط یافته و به مقدار متغیر الحاق میشود.
یک متغیر میتواند با استفاده از گزینهٔ -n در دستورات توکار declare یا local صفت nameref را دریافت کند (توضیحات مربوط به declare و local را در زیر ببینید) تا یک nameref یا مرجعی به متغیر دیگر ایجاد شود. این ویژگی اجازه میدهد متغیرها به صورت غیرمستقیم دستکاری شوند. هر زمان که به متغیر nameref ارجاع داده شود، مقداری به آن انتساب یابد، حذف (unset) شود، یا صفات آن تغییر یابد (به جز استفاده یا تغییر خود صفت nameref)، این عملیات در واقع روی متغیری انجام میشود که با مقدار متغیر nameref مشخص شده است. یک nameref معمولاً در توابع پوسته برای ارجاع به متغیری استفاده میشود که نام آن به عنوان آرگومان به تابع منتقل شده است. به عنوان مثال، اگر نام یک متغیر به عنوان اولین آرگومان به یک تابع پوسته ارسال شود، اجرای
declare -n ref=$1
در داخل تابع، یک متغیر محلی nameref به نام ref ایجاد میکند که مقدار آن نام متغیری است که به عنوان اولین آرگومان ارسال شده است. ارجاعات و انتسابها به ref، و تغییرات در صفات آن، به عنوان ارجاع، انتساب و تغییر صفات به متغیری که نام آن به عنوان $1 ارسال شده بود در نظر گرفته میشوند. اگر متغیر کنترلی در یک حلقهٔ for صفت nameref را داشته باشد، لیست کلمات میتواند لیستی از متغیرهای پوسته باشد، و هنگام اجرای حلقه، به نوبت برای هر کلمه در لیست یک مرجع نامی برقرار میشود. به متغیرهای آرایه نمیتوان صفت nameref داد. با این حال، متغیرهای nameref میتوانند به متغیرهای آرایه و متغیرهای آرایه با اندیس ارجاع دهند. متغیرهای nameref را میتوان با استفاده از گزینهٔ -n در دستور توکار unset حذف کرد. در غیر این صورت، اگر unset با نام یک متغیر nameref به عنوان آرگومان اجرا شود، متغیری که توسط متغیر nameref به آن ارجاع داده شده است حذف خواهد شد.
هنگامی که پوسته شروع به کار میکند، محیط خود را میخواند و همانطور که در زیر شرح داده شده است، از هر متغیر محیطی که نام معتبری دارد یک متغیر پوسته ایجاد میکند (ببینید ENVIRONMENT).
پارامترهای مکانی (Positional Parameters)
یک پارامتر مکانی پارامتری است که با یک یا چند رقم، غیر از تکرقم 0، مشخص میشود. پارامترهای مکانی هنگام فراخوانی پوسته از آرگومانهای آن مقداردهی میشوند، و ممکن است با استفاده از دستور توکار set مجدداً مقداردهی شوند. نمیتوان با استفاده از عبارات انتساب به پارامترهای مکانی مقدار تخصیص داد. هنگامی که یک تابع پوسته اجرا میشود، پارامترهای مکانی موقتاً جایگزین میشوند (ببینید FUNCTIONS در زیر).
هنگامی که یک پارامتر مکانی شامل بیش از یک رقم بسط داده میشود، باید درون آکولاد قرار گیرد (ببینید EXPANSION در زیر). بدون آکولاد، یک رقم پس از $ تنها میتواند به یکی از نه پارامتر مکانی اول ($1-$9) یا پارامتر ویژهٔ $0 اشاره کند (بخش بعدی را ببینید).
پارامترهای ویژه (Special Parameters)
پوسته با چند پارامتر به طور ویژه رفتار میکند. به این پارامترها تنها میتوان ارجاع داد؛ انتساب مقدار به آنها مجاز نیست. پارامترهای ویژه با یکی از نویسههای زیر مشخص میشوند.
- *
- ($*) به پارامترهای مکانی بسط مییابد، که از یک شروع میشود. هنگامی که بسط درون نقلقول دوتایی (دابل کوتیشن) نباشد، هر پارامتر مکانی به یک کلمهٔ جداگانه بسط مییابد. در زمینههایی که بسط کلمات انجام میشود، این کلمات مشمول تفکیک کلمات و بسط مسیر میشوند. هنگامی که بسط درون نقلقول دوتایی رخ میدهد، به یک کلمهٔ واحد بسط مییابد که در آن مقدار هر پارامتر با نویسهٔ اول متغیر IFS جدا میشود. به عبارت دیگر، "$*" معادل است با "$1c$2c..."، که در آن c اولین نویسه از مقدار متغیر IFS است. اگر IFS تنظیم نشده باشد (unset)، پارامترها با فاصله (space) از هم جدا میشوند. اگر IFS تهی (null) باشد، پارامترها بدون جداکننده به هم متصل میشوند.
- @
- ($@) به پارامترهای موقعیتی (positional parameters)، با شروع از یک، بسط مییابد. در زمینههایی که تفکیک کلمات (word splitting) انجام میشود، این پارامتر هر پارامتر موقعیتی را به یک کلمه جداگانه بسط میدهد؛ اگر درون نقلقول دوتایی (double quotes) نباشد، این کلمات مشمول تفکیک کلمات خواهند شد. در زمینههایی که تفکیک کلمات انجام نمیشود، مانند بخش مقدار در یک دستور انتساب (assignment statement)، به یک کلمه واحد بسط مییابد که در آن هر پارامتر موقعیتی با یک فاصله (space) جدا شده است. هنگامی که بسط درون نقلقول دوتایی رخ میدهد، و تفکیک کلمات انجام میشود، هر پارامتر به یک کلمه جداگانه بسط مییابد. یعنی، "$@" معادل است با "$1" "$2" ... اگر بسط نقلقول دوتایی درون یک کلمه رخ دهد، بسطِ اولین پارامتر با بسطِ بخش آغازین کلمه اصلی پیوند میخورد، و بسطِ آخرین پارامتر با بسطِ بخش پایانی کلمه اصلی پیوند مییابد. هنگامی که هیچ پارامتر موقعیتی وجود ندارد، "$@" و $@ به هیچ چیز بسط نمییابند (یعنی حذف میشوند).
- #
- ($#) به تعداد پارامترهای موقعیتی در مبنای ده (decimal) بسط مییابد.
- ?
- ($?) به وضعیت خروج (exit status) آخرین دستور اجرا شده بسط مییابد.
- -
- ($-) به فلگهای گزینه فعلی، آنگونه که هنگام فراخوانی، توسط دستور توکار set یا مواردی که توسط خود پوسته تعیین شدهاند (مانند گزینه -i) مشخص شده است، بسط مییابد.
- $
- ($$) به شناسه فرآیند (process ID) پوسته بسط مییابد. در یک زیرپوسته (subshell)، به شناسه فرآیند پوسته والد بسط مییابد، نه زیرپوسته.
- !
- ($!) به شناسه فرآیند کاری که اخیراً به پسزمینه فرستاده شده است بسط مییابد، خواه به عنوان یک دستور ناهمگام (asynchronous) اجرا شده باشد یا با استفاده از دستور توکار bg (به بخش مدیریت کارها (JOB CONTROL) در زیر مراجعه کنید).
- 0
- ($0) به نام پوسته یا اسکریپت پوسته بسط مییابد. این مقدار هنگام راهاندازی اولیه پوسته مقداردهی میشود. اگر bash با یک فایل حاوی دستورات فراخوانی شود، $0 روی نام آن فایل تنظیم میشود. اگر bash با گزینه -c شروع شود، آنگاه $0 روی اولین آرگومان پس از رشتهای که قرار است اجرا شود، در صورت وجود، تنظیم میشود. در غیر این صورت، به نام فایلی که برای فراخوانی bash استفاده شده است، مطابق آنچه توسط آرگومان صفر ارائه شده، تنظیم میشود.
متغیرهای پوسته
پوسته متغیرهای زیر را مقداردهی میکند:
- _
- ($_، یک خط زیرین یا underscore) این متغیر بسته به زمینه، چندین معنا دارد. هنگام راهاندازی اولیه پوسته، _ به نام مسیر استفادهشده برای فراخوانی پوسته یا اسکریپت پوسته در حال اجرا، طبق آنچه در محیط یا فهرست آرگومانها منتقل شده، مقداردهی میشود. سپس، به آخرین آرگومان دستور ساده قبلی اجرا شده در پیشزمینه، پس از بسط، بسط مییابد. همچنین روی نام مسیر کامل استفادهشده برای فراخوانی هر دستور اجرا شده تنظیم میشود و در محیط صادرشده (exported environment) به آن دستور قرار میگیرد. هنگام بررسی ایمیل، $_ به نام فایل ایمیلی که در حال حاضر بررسی میشود بسط مییابد.
- BASH
- به نام فایل کاملِ استفادهشده برای فراخوانی این نمونه از bash بسط مییابد.
- BASHOPTS
- فهرستی جداشده با دونقطه از گزینههای فعال پوسته است. هر کلمه در این فهرست یک آرگومان معتبر برای گزینهٔ -s در دستور توکار shopt است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید). گزینههایی که در BASHOPTS ظاهر میشوند همان مواردی هستند که توسط shopt با وضعیت on گزارش میشوند. اگر این متغیر هنگام بالا آمدن bash در محیط موجود باشد، پوسته پیش از خواندن هر فایل راهاندازی، هر یک از گزینههای موجود در فهرست را فعال میکند. اگر این متغیر صادر (export) شود، پوستههای فرزند هر گزینه در فهرست را فعال خواهند کرد. این متغیر فقطخواندنی است.
- BASHPID
- به شناسهٔ فرایند (PID) فرایند جاری bash بسط مییابد. این در شرایط خاصی با $$ متفاوت است، مانند زیرپوستههایی که نیازی به مقداردهی اولیهٔ مجدد bash ندارند. مقداردهی به BASHPID هیچ تأثیری ندارد. اگر BASHPID از حالت مقداردهی خارج (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_ALIASES
- یک متغیر آرایهٔ انجمنی است که اعضای آن با فهرست داخلی نامهای مستعار که توسط دستور توکار alias نگهداری میشود، تطابق دارد. عناصری که به این آرایه افزوده میشوند در فهرست نامهای مستعار ظاهر خواهند شد؛ با این حال، خارج کردن عناصر آرایه از حالت مقداردهی در حال حاضر نامهای مستعار را از فهرست نامهای مستعار حذف نمیکند. اگر BASH_ALIASES از حالت مقداردهی خارج شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_ARGC
- یک متغیر آرایهای است که مقادیر آن تعداد پارامترها در هر فریم از پشتهٔ فراخوانی اجرای جاری bash است. تعداد پارامترهای زیرروال جاری (تابع پوسته یا اسکریپت اجراشده با . یا source) در بالای پشته قرار دارد. هنگامی که یک زیرروال اجرا میشود، تعداد پارامترهای ارسالی به روی BASH_ARGC رانده (push) میشود. پوسته BASH_ARGC را تنها در حالت اشکالزدایی گسترده مقداردهی میکند (توضیحات مربوط به گزینهٔ extdebug از دستور توکار shopt در زیر را ببینید). تنظیم extdebug پس از اینکه پوسته اجرای اسکریپت را آغاز کرده است، یا ارجاع به این متغیر در زمانی که extdebug تنظیم نشده است، ممکن است منجر به مقادیر ناهمخوان شود. مقداردهی به BASH_ARGC هیچ تأثیری ندارد، و نمیتوان آن را از حالت تنظیم خارج (unset) کرد.
- BASH_ARGV
- یک متغیر آرایهای حاوی تمام پارامترها در پشتهٔ فراخوانی اجرای جاری bash است. آخرین پارامترِ آخرین فراخوانی زیرروال در بالای پشته قرار دارد؛ اولین پارامترِ فراخوانی اولیه در پایین پشته است. هنگامی که یک زیرروال اجرا میشود، پوسته پارامترهای ارائهشده را به روی BASH_ARGV میراند (push میکند). پوسته BASH_ARGV را تنها در حالت اشکالزدایی گسترده مقداردهی میکند (توضیحات مربوط به گزینهٔ extdebug از دستور توکار shopt در زیر را ببینید). تنظیم extdebug پس از اینکه پوسته اجرای اسکریپت را آغاز کرده است، یا ارجاع به این متغیر هنگامی که extdebug تنظیم نشده است، ممکن است منجر به مقادیر ناهمخوان شود. مقداردهی به BASH_ARGV هیچ تأثیری ندارد، و نمیتوان آن را از حالت تنظیم خارج (unset) کرد.
- BASH_ARGV0
- هنگام ارجاع به این متغیر، به نام پوسته یا اسکریپت پوسته بسط مییابد (همانند $0؛ توضیحات پارامتر ویژه 0 در بالا را ببینید). مقداردهی به BASH_ARGV0 مقدار $0 را برابر با همان مقدار قرار میدهد. اگر BASH_ARGV0 حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_CMDS
- یک متغیر آرایه انجمنی که اعضای آن متناظر با جدول درهمسازی (hash table) داخلی دستورات است، به همان صورت که توسط دستور توکار hash نگهداری میشود. افزودن عناصر به این آرایه موجب ظاهر شدن آنها در جدول درهمسازی میشود؛ با این حال، حذف عناصر این آرایه در حال حاضر نام دستورات را از جدول درهمسازی پاک نمیکند. اگر BASH_CMDS حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_COMMAND
- به دستوری بسط مییابد که در حال حاضر در حال اجرا است یا در شرف اجرا میباشد، مگر اینکه پوسته در نتیجه یک تله (trap) دستوری را اجرا کند، که در این صورت دستوری است که در زمان اجرای تله در حال اجرا بوده است. اگر BASH_COMMAND حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_EXECUTION_STRING
- آرگومان دستور برای گزینه فراخوانی -c.
- BASH_LINENO
- یک متغیر آرایهای که اعضای آن شماره خطوط در فایلهای مبدأ هستند، جایی که هر یک از اعضای متناظر در FUNCNAME فراخوانی شدهاند. ${BASH_LINENO[$i]} شماره خط در فایل مبدأ (${BASH_SOURCE[$i+1]}) است که در آن ${FUNCNAME[$i]} صدا زده شده است (یا اگر درون یک تابع پوسته دیگر به آن ارجاع داده شود، ${BASH_LINENO[$i-1]}). از LINENO برای دریافت شماره خط فعلی استفاده کنید. مقداردهی به BASH_LINENO هیچ تأثیری ندارد و نمیتوان آن را حذف (unset) کرد.
- BASH_LOADABLES_PATH
- فهرستی از دایرکتوریها با جداکننده دو نقطه (colon-separated) که دستور enable در آنها به دنبال دستورات توکار قابل بارگذاری پویا میگردد.
- BASH_MONOSECONDS
- هر بار که به این متغیر ارجاع داده شود، در صورت در دسترس بودن، به مقدار بازگردانده شده توسط ساعت یکنواخت (monotonic clock) سیستم بسط مییابد. اگر ساعت یکنواختی وجود نداشته باشد، این معادل با EPOCHSECONDS خواهد بود. اگر BASH_MONOSECONDS حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر پس از آن مجدداً مقداردهی شود.
- BASH_REMATCH
- یک متغیر آرایهای که اعضای آن توسط عملگر دوتایی =~ در دستور شرطی [[ مقداردهی میشوند. عنصر با نمایه 0 بخشی از رشته است که با کل عبارت باقاعده (regular expression) مطابقت دارد. عنصر با نمایه n بخشی از رشته است که با nامین زیرعبارت داخل پرانتز تطبیق دارد.
- BASH_SOURCE
- یک متغیر آرایهای که اعضای آن نام فایلهای مبدأ هستند، جایی که نام توابع متناظر پوسته در متغیر آرایهای FUNCNAME تعریف شدهاند. تابع پوسته ${FUNCNAME[$i]} در فایل ${BASH_SOURCE[$i]} تعریف شده و از ${BASH_SOURCE[$i+1]} فراخوانی شده است. مقداردهی به BASH_SOURCE هیچ تأثیری ندارد و نمیتوان آن را حذف (unset) کرد.
- BASH_SUBSHELL
- هنگامی که پوسته شروع به اجرا در هر زیرپوسته (subshell) یا محیط زیرپوسته میکند، مقدار این متغیر یک واحد افزایش مییابد. مقدار اولیه آن 0 است. اگر BASH_SUBSHELL نامقدار (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً مقداردهی مجدد شود.
- BASH_TRAPSIG
- در حین اجرای یک اقدام trap، برابر با شماره سیگنال مربوط به آن قرار میگیرد. برای اطلاعات بیشتر درباره شمارههای سیگنال و اجرای trap، شرح دستور trap را در بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در ادامه ببینید.
- BASH_VERSINFO
- یک متغیر آرایهای فقطخواندنی که اعضای آن حاوی اطلاعات نگارش این نمونه از bash میباشند. مقادیر تخصیصیافته به اعضای این آرایه به شرح زیر است:
- BASH_VERSINFO[0]
- شماره نگارش اصلی (نگارش انتشار یا release).
- BASH_VERSINFO[1]
- شماره نگارش فرعی (version).
- BASH_VERSINFO[2]
- سطح وصله (patch level).
- BASH_VERSINFO[3]
- نگارش ساخت (build version).
- BASH_VERSINFO[4]
- وضعیت انتشار (مانند beta).
- BASH_VERSINFO[5]
- مقدار MACHTYPE.
- BASH_VERSION
- به یک رشته توصیفکننده نگارش این نمونه از bash بسط مییابد (مانند 5.2.37(3)-release).
- COMP_CWORD
- یک اندیس به ${COMP_WORDS} برای کلمهای که موقعیت فعلی مکاننما را دربردارد. این متغیر فقط در توابع پوستهای که توسط امکانات تکمیل خودکار قابل برنامهریزی فراخوانی میشوند در دسترس است (به تکمیل خودکار قابل برنامهریزی (Programmable Completion) در ادامه مراجعه کنید).
- COMP_KEY
- کلید (یا آخرین کلید از یک دنباله کلید) که برای فراخوانی تابع تکمیل خودکار فعلی استفاده شده است. این متغیر فقط در توابع پوسته و دستورات خارجی فراخوانیشده توسط امکانات تکمیل خودکار قابل برنامهریزی در دسترس است (به تکمیل خودکار قابل برنامهریزی (Programmable Completion) در ادامه مراجعه کنید).
- COMP_LINE
- خط فرمان فعلی. این متغیر فقط در توابع پوسته و دستورات خارجی فراخوانیشده توسط امکانات تکمیل خودکار قابل برنامهریزی در دسترس است (به تکمیل خودکار قابل برنامهریزی (Programmable Completion) در ادامه مراجعه کنید).
- COMP_POINT
- اندیس موقعیت فعلی مکاننما نسبت به ابتدای فرمان جاری. اگر مکاننما در انتهای فرمان فعلی باشد، مقدار این متغیر برابر با ${#COMP_LINE} خواهد بود. این متغیر فقط در توابع پوسته و دستورات خارجی فراخوانیشده توسط امکانات تکمیل خودکار قابل برنامهریزی در دسترس است (به تکمیل خودکار قابل برنامهریزی (Programmable Completion) در ادامه مراجعه کنید).
- COMP_TYPE
- برابر با یک مقدار عدد صحیح مربوط به نوع تکمیل درخواستی که باعث فراخوانی تابع تکمیل شده است، تنظیم میشود: TAB برای تکمیل عادی، ? برای فهرست کردن تکمیلها پس از فشردن متوالی Tab، ! برای فهرست کردن گزینههای جایگزین در صورت تکمیل جزئی کلمه، @ برای فهرست کردن گزینهها در صورتی که کلمه بدون تغییر نمانده باشد، یا % برای تکمیل به صورت منو. این متغیر فقط در توابع پوسته و دستورات خارجی فراخوانیشده توسط امکانات تکمیل خودکار قابل برنامهریزی در دسترس است (به تکمیل خودکار قابل برنامهریزی (Programmable Completion) در ادامه مراجعه کنید).
- COMP_WORDBREAKS
- مجموعهای از نویسهها که کتابخانهٔ readline هنگام انجام تکمیل کلمات، آنها را به عنوان جداکنندههای کلمه در نظر میگیرد. اگر COMP_WORDBREAKS از حالت مقداردهی خارج شود (unset شود)، ویژگیهای خاص خود را از دست میدهد، حتی اگر بعداً دوباره مقداردهی شود.
- COMP_WORDS
- یک متغیر آرایهای (به بخش آرایهها (Arrays) در زیر مراجعه کنید) شامل کلمات مجزای خط فرمان فعلی. این خط دقیقاً همانگونه که readline آن را با استفاده از COMP_WORDBREAKS (همانطور که در بالا توضیح داده شد) تقسیم میکند، به کلمات مجزا شکسته میشود. این متغیر تنها در توابع پوستهای که توسط سازوکارهای تکمیل قابل برنامهریزی فراخوانی میشوند، در دسترس است (به بخش تکمیل برنامهپذیر (Programmable Completion) در زیر مراجعه کنید).
- COPROC
- یک متغیر آرایهای (به بخش آرایهها (Arrays) در زیر مراجعه کنید) که برای نگهداری توصیفکنندههای فایل جهت خروجی از و ورودی به یک همروند (coprocess) بدون نام ایجاد شده است (به بخش همروندها (Coprocesses) در بالا مراجعه کنید).
- DIRSTACK
- یک متغیر آرایهای (به بخش آرایهها (Arrays) در زیر مراجعه کنید) شامل محتویات فعلی پشتهٔ دایرکتوریها. دایرکتوریها به همان ترتیبی در پشته ظاهر میشوند که توسط دستور توکار dirs نمایش داده میشوند. انتساب مقدار به عناصر این متغیر آرایهای میتواند برای اصلاح دایرکتوریهایی که از قبل در پشته هستند استفاده شود، اما برای افزودن و حذف دایرکتوریها باید از دستورات توکار pushd و popd استفاده کرد. انتساب مقدار به این متغیر، دایرکتوری جاری را تغییر نمیدهد. اگر DIRSTACK از حالت مقداردهی خارج شود (unset شود)، ویژگیهای خاص خود را از دست میدهد، حتی اگر بعداً دوباره مقداردهی شود.
- EPOCHREALTIME
- هر بار که به این پارامتر ارجاع داده شود، به تعداد ثانیههای سپریشده از مبدأ یونیکس (Unix Epoch) (به time(3) مراجعه کنید) به عنوان یک مقدار ممیز شناور با دقت میکروثانیه بسط مییابد. انتساب مقدار به EPOCHREALTIME نادیده گرفته میشود. اگر EPOCHREALTIME از حالت مقداردهی خارج شود (unset شود)، ویژگیهای خاص خود را از دست میدهد، حتی اگر بعداً دوباره مقداردهی شود.
- EPOCHSECONDS
- هر بار که به این پارامتر ارجاع داده شود، به تعداد ثانیههای سپریشده از مبدأ یونیکس (Unix Epoch) (به time(3) مراجعه کنید) بسط مییابد. انتساب مقدار به EPOCHSECONDS نادیده گرفته میشود. اگر EPOCHSECONDS از حالت مقداردهی خارج شود (unset شود)، ویژگیهای خاص خود را از دست میدهد، حتی اگر بعداً دوباره مقداردهی شود.
- EUID
- به شناسهٔ کاربری مؤثر (effective user ID) کاربر جاری بسط مییابد که در هنگام راهاندازی پوسته مقداردهی اولیه میشود. این متغیر فقطخواندنی است.
- FUNCNAME
- یک متغیر آرایهای شامل نام تمام توابع پوستهای که در حال حاضر در پشتهٔ فراخوانی اجرا قرار دارند. عنصر با اندیس 0، نام هر تابع پوستهای است که در حال حاضر در حال اجرا است. پایینترین عنصر (عنصری که بالاترین اندیس را دارد) “main” است. این متغیر فقط زمانی وجود دارد که یک تابع پوسته در حال اجرا باشد. انتساب مقدار به FUNCNAME هیچ تأثیری ندارد. اگر FUNCNAME از حالت مقداردهی خارج شود (unset شود)، ویژگیهای خاص خود را از دست میدهد، حتی اگر بعداً دوباره مقداردهی شود.
- این متغیر را میتوان به همراه BASH_LINENO و BASH_SOURCE به کار برد. هر عنصر از FUNCNAME دارای عناصر متناظری در BASH_LINENO و BASH_SOURCE برای توصیف پشتهٔ فراخوانی است. برای نمونه، ${FUNCNAME[$i]} از فایل ${BASH_SOURCE[$i+1]} در شماره خط ${BASH_LINENO[$i]} فراخوانی شده است. دستور توکار caller با استفاده از این اطلاعات، پشتهٔ فراخوانی فعلی را نمایش میدهد.
- GROUPS
- یک متغیر آرایهای حاوی فهرستی از گروههایی که کاربر جاری عضو آنها است. مقداردهی به GROUPS هیچ تاثیری ندارد. اگر GROUPS حذف شود (unset)، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً دوباره مقداردهی شود.
- HISTCMD
- شماره تاریخچه، یا اندیس در فهرست تاریخچه، مربوط به دستور جاری. مقداردهی به HISTCMD هیچ تاثیری ندارد. اگر HISTCMD حذف شود (unset)، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً دوباره مقداردهی شود.
- HOSTNAME
- بهطور خودکار با نام میزبان جاری تنظیم میشود.
- HOSTTYPE
- بهطور خودکار با رشتهای تنظیم میشود که نوع ماشینی را که bash روی آن اجرا میشود، بهطور یکتا توصیف میکند. مقدار پیشفرض وابسته به سیستم است.
- LINENO
- هر بار که به این پارامتر ارجاع داده میشود، پوسته یک عدد دهدهی را جایگزین میکند که بیانگر شماره خط ترتیبی جاری (شروع از ۱) در یک اسکریپت یا تابع است. در صورتی که درون یک اسکریپت یا تابع نباشد، مقداری که جایگزین میشود تضمین نمیشود که معنادار باشد. اگر LINENO حذف شود (unset)، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً دوباره مقداردهی شود.
- MACHTYPE
- بهطور خودکار با رشتهای تنظیم میشود که نوع سیستمی را که bash روی آن اجرا میشود، در قالب استاندارد گنو بهصورت cpu-company-system بهطور کامل توصیف میکند. مقدار پیشفرض وابسته به سیستم است.
- MAPFILE
- یک متغیر آرایهای (بخش آرایهها (Arrays) در زیر را ببینید) که ایجاد میشود تا متنی را که توسط دستور توکار mapfile خوانده شده است، در صورت عدم ارائه نام متغیر، نگهداری کند.
- OLDPWD
- دایرکتوری کاری قبلی، آنگونه که توسط دستور cd تنظیم شده است.
- OPTARG
- مقدار آخرین آرگومان گزینهای که توسط دستور توکار getopts پردازش شده است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
- OPTIND
- اندیس آرگومان بعدی که قرار است توسط دستور توکار getopts پردازش شود (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
- OSTYPE
- بهطور خودکار با رشتهای تنظیم میشود که سیستمعاملی را که bash روی آن اجرا میشود، توصیف میکند. مقدار پیشفرض وابسته به سیستم است.
- PIPESTATUS
- یک متغیر آرایهای (بخش آرایهها (Arrays) در زیر را ببینید) حاوی فهرستی از مقادیر وضعیت خروج دستورات در جدیدترین خطلوله (pipeline) اجراشده در پیشزمینه، که ممکن است تنها از یک دستور ساده تشکیل شده باشد (بخش گرامر پوسته (SHELL GRAMMAR) در بالا را ببینید). Bash متغیر PIPESTATUS را پس از اجرای خطلولههای چندعنصری، خطلولههای زمانبندیشده و نفیشده، دستورات ساده، زیرپوستههای ایجادشده با عملگر (، دستورات مرکب [[ و (( و پس از شرایط خطایی که منجر به لغو اجرای دستور توسط پوسته میشوند، تنظیم میکند.
- PPID
- شناسه فرایند (PID) والد پوسته. این متغیر فقطخواندنی است.
- PWD
- دایرکتوری کاری فعلی که توسط دستور cd تنظیم شده است.
- RANDOM
- هر بار که به این پارامتر ارجاع داده شود، به یک عدد صحیح تصادفی بین 0 و 32767 بسط مییابد. انتساب مقدار به RANDOM توالی اعداد تصادفی را مقداردهی اولیه (بذردهی) میکند. بذردهی مولد اعداد تصادفی با مقدار ثابت یکسان، همان توالی مقادیر را تولید میکند. اگر RANDOM حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً مجدداً مقداردهی شود.
- READLINE_ARGUMENT
- هر آرگومان عددی دادهشده به یک دستور readline که با استفاده از “bind -x” تعریف شده است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید) هنگام فراخوانی آن.
- READLINE_LINE
- محتویات بافر خط readline برای استفاده به همراه “bind -x” (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
- READLINE_MARK
- موقعیت نشانه (نقطه درج ذخیرهشده) در بافر خط readline برای استفاده به همراه “bind -x” (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید). نویسههای بین نقطه درج و نشانه اغلب ناحیه (region) نامیده میشوند.
- READLINE_POINT
- موقعیت نقطه درج در بافر خط readline برای استفاده به همراه “bind -x” (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
- REPLY
- روی خط ورودی خواندهشده توسط دستور توکار read تنظیم میشود وقتی هیچ آرگومانی ارائه نشده باشد.
- SECONDS
- هر بار که به این پارامتر ارجاع داده شود، به تعداد ثانیههای سپریشده از زمان فراخوانی پوسته بسط مییابد. اگر مقداری به SECONDS اختصاص داده شود، مقدار بازگرداندهشده در مراجعات بعدی برابر با تعداد ثانیههای سپریشده از زمان انتساب به علاوه مقدار اختصاصدادهشده خواهد بود. تعداد ثانیهها در زمان فراخوانی پوسته و زمان فعلی همواره با استعلام از ساعت سیستم با تفکیکپذیری یک ثانیهای تعیین میشوند. اگر SECONDS حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً دوباره مقداردهی شود.
- SHELLOPTS
- فهرستی جداشده با دونقطه (:) از گزینههای فعال پوسته. هر کلمه در فهرست، یک آرگومان معتبر برای گزینه -o دستور توکار set است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید). گزینههایی که در SHELLOPTS ظاهر میشوند همانهایی هستند که توسط set -o به صورت on گزارش شدهاند. اگر این متغیر هنگام شروع به کار bash در محیط وجود داشته باشد، پوسته هر گزینه موجود در فهرست را قبل از خواندن هر فایل راهاندازی فعال میکند. اگر این متغیر صادر (export) شود، پوستههای فرزند هر گزینه موجود در فهرست را فعال خواهند کرد. این متغیر فقطخواندنی است.
- SHLVL
- هر بار که نمونهای از bash آغاز به کار میکند، یک واحد به مقدار آن افزوده میشود.
- SRANDOM
- هر بار که به این متغیر ارجاع داده شود، به یک عدد تصادفی کاذب ۳۲ بیتی بسط مییابد. تولیدکنندهٔ اعداد تصادفی در سیستمهایی که از /dev/urandom یا arc4random(3) پشتیبانی میکنند خطی نیست، بنابراین هیچ رابطهای بین هر عدد بازگردانده شده با اعداد پیش از آن وجود ندارد. تولیدکنندهٔ اعداد تصادفی نمیتواند مقداردهی اولیه (seed) شود، بنابراین مقداردهی به این متغیر هیچ اثری ندارد. اگر SRANDOM حذف (unset) شود، ویژگیهای خاص خود را از دست میدهد، حتی اگر متعاقباً مجدداً تنظیم شود.
- UID
- به شناسهٔ کاربری کاربر فعلی بسط مییابد، که در هنگام راهاندازی پوسته مقداردهی اولیه میشود. این متغیر فقطخواندنی است.
پوسته از متغیرهای زیر استفاده میکند. در برخی موارد، bash یک مقدار پیشفرض به متغیر اختصاص میدهد؛ این موارد در ادامه ذکر شدهاند.
- BASH_COMPAT
- این مقدار برای تنظیم سطح سازگاری پوسته استفاده میشود. برای شرحی از سطوح مختلف سازگاری و اثرات آنها، بخش حالت سازگاری پوسته (SHELL COMPATIBILITY MODE) در زیر را ببینید. این مقدار ممکن است یک عدد اعشاری (مثلاً 4.2) یا یک عدد صحیح (مثلاً 42) متناظر با سطح سازگاری مورد نظر باشد. اگر BASH_COMPAT تنظیم نشده باشد (unset) یا روی رشتهٔ خالی تنظیم شود، سطح سازگاری روی مقدار پیشفرض نسخهٔ فعلی تنظیم میگردد. اگر BASH_COMPAT روی مقداری تنظیم شود که جزو سطوح سازگاری معتبر نباشد، پوسته یک پیام خطا چاپ کرده و سطح سازگاری را روی مقدار پیشفرض نسخهٔ فعلی تنظیم میکند. زیرمجموعهای از مقادیر معتبر متناظر با سطوح سازگاری توصیفشده در زیر در بخش حالت سازگاری پوسته (SHELL COMPATIBILITY MODE) هستند. برای مثال، 4.2 و 42 مقادیر معتبری هستند که متناظر با گزینهٔ compat42 در دستور shopt بوده و سطح سازگاری را روی 42 تنظیم میکنند. نسخهٔ فعلی نیز یک مقدار معتبر است.
- BASH_ENV
- اگر این پارامتر هنگام اجرای یک اسکریپت پوسته توسط bash تنظیم شده باشد، مقدار بسطیافتهٔ آن بهعنوان یک نام فایل حاوی دستوراتی تفسیر میشود که قبل از خواندن و اجرای دستورات اسکریپت، پوسته را مقداردهی اولیه میکنند. مقدار BASH_ENV پیش از آنکه بهعنوان نام فایل تفسیر شود، تحت بسط پارامتر، جایگزینی دستور، و بسط حسابی قرار میگیرد. از PATH برای جستجوی نام فایل حاصله استفاده نمیشود.
- BASH_XTRACEFD
- اگر روی یک عدد صحیح متناظر با یک توصیفگر فایل معتبر تنظیم شود، bash خروجی ردگیری (trace) تولید شده در هنگام فعال بودن “set -x” را بهجای خطای استاندارد، درون آن توصیفگر فایل مینویسد. هنگامی که BASH_XTRACEFD حذف (unset) شود یا مقدار جدیدی به آن اختصاص یابد، توصیفگر فایل بسته میشود. حذف کردن BASH_XTRACEFD یا اختصاص رشتهٔ خالی به آن موجب میشود که خروجی ردگیری به خطای استاندارد ارسال شود. توجه داشته باشید که تنظیم BASH_XTRACEFD روی 2 (توصیفگر فایل خطای استاندارد) و سپس حذف آن (unset) منجر به بسته شدن خطای استاندارد خواهد شد.
- CDPATH
- مسیر جستجو برای دستور cd. این متغیر فهرستی جداشده با دونقطه از دایرکتوریهایی است که پوسته در آنها به دنبال دایرکتوریهای مشخصشده بهعنوان آرگومان برای دستور cd میگردد. یک مقدار نمونه عبارت است از “.:~:/usr”.
- CHILD_MAX
- تعداد مقادیر وضعیت خروج فرزندان را تعیین میکند تا پوسته آنها را به خاطر بسپارد. Bash اجازه نخواهد داد این مقدار از حداقل تعیینشده توسط POSIXکاهش یابد، و یک مقدار حداکثر نیز وجود دارد (در حال حاضر ۸۱۹۲) که این متغیر نمیتواند از آن فراتر رود. مقدار حداقل وابسته به سیستم است.
- COLUMNS
- توسط دستور مرکب select برای تعیین عرض ترمینال هنگام چاپ فهرستهای گزینش استفاده میشود. در صورت فعال بودن گزینه checkwinsize یا در یک پوسته تعاملی پس از دریافت SIGWINCH، بهطور خودکار تنظیم میشود.
- COMPREPLY
- یک متغیر آرایهای که bash از آن تکمیلهای احتمالی تولیدشده توسط یک تابع پوسته را که توسط امکان تکمیل برنامهپذیر فراخوانی شده است میخواند (بخش تکمیل برنامهپذیر (Programmable Completion) در زیر را ببینید). هر عنصر آرایه شامل یک تکمیل احتمالی است.
- EMACS
- اگر هنگام شروع به کار پوسته، bash این متغیر را در محیط با مقدار “t” بیابد، فرض میکند که پوسته در یک بافر پوسته Emacs اجرا میشود و ویرایش خط را غیرفعال میکند.
- ENV
- هنگامی که یک پوسته تعاملی در حالت posix فراخوانی میشود، مشابه BASH_ENV (بخش فراخوانی (INVOCATION) در بالا را ببینید) بسط داده شده و اجرا میشود.
- EXECIGNORE
- فهرستی جداشده با دونقطه از الگوهای پوسته (بخش تطبیق الگو (Pattern Matching) را ببینید) که مجموعهای از نام پروندهها را تعریف میکند تا در جستجوی دستور با استفاده از PATH نادیده گرفته شوند. پروندههایی که نام مسیر کامل آنها با یکی از این الگوها مطابقت داشته باشد، برای اهداف تکمیل و اجرای دستور از طریق جستجوی PATH بهعنوان پروندههای قابل اجرا در نظر گرفته نمیشوند. این متغیر بر رفتار دستورات [، test و [[ تأثیری ندارد. نام مسیرهای کامل در جدول هش دستورات مشمول EXECIGNORE نمیشوند. از این متغیر برای نادیده گرفتن پروندههای کتابخانه مشترک که بیت اجرایی آنها تنظیم شده اما پروندههای اجرایی نیستند، استفاده کنید. تطبیق الگو از تنظیمات گزینه پوسته extglob پیروی میکند.
- FCEDIT
- ویرایشگر پیشفرض برای دستور توکار fc.
- FIGNORE
- فهرستی جداشده با دونقطه از پسوندها برای نادیده گرفتن هنگام انجام تکمیل نام پرونده (بخش خط خوان (READLINE) در زیر را ببینید). پروندهای که پسوند آن با یکی از مدخلهای موجود در FIGNORE مطابقت داشته باشد، از فهرست نام پروندههای مطابقتیافته کنار گذاشته میشود. یک مقدار نمونه عبارت است از “.o:~”.
- FUNCNEST
- اگر روی یک مقدار عددی بزرگتر از ۰ تنظیم شود، حداکثر سطح تو در تویی تابع را تعریف میکند. فراخوانیهای تابعی که از این سطح تو در تویی فراتر روند، باعث لغو دستور جاری میشوند.
- GLOBIGNORE
- فهرستی از الگوها که با دونقطه (:) از هم جدا شدهاند و مجموعهای از نامهای فایلی را مشخص میکنند که باید در بسط مسیر نادیده گرفته شوند. اگر یک نام فایل که با یک الگوی بسط مسیر مطابقت دارد، با یکی از الگوهای موجود در GLOBIGNORE نیز مطابقت داشته باشد، از فهرست موارد منطبق حذف میشود. تطبیق الگو از تنظیمات گزینه پوسته extglob پیروی میکند.
- GLOBSORT
- نحوه مرتبسازی نتایج بسط نام مسیر را کنترل میکند. مقدار این متغیر معیار مرتبسازی و ترتیب مرتبسازی را برای نتایج بسط نام مسیر مشخص میکند. اگر این متغیر تنظیم نشده باشد یا روی یک رشته خالی (null) تنظیم شده باشد، بسط نام مسیر از رفتار تاریخی مرتبسازی بر اساس نام استفاده میکند، به ترتیب واژهنگاشتی صعودی همانطور که توسط متغیر پوسته LC_COLLATE تعیین میشود.
- در صورت تنظیم، یک مقدار معتبر با یک + اختیاری که نادیده گرفته میشود، یا - که ترتیب مرتبسازی را از صعودی به نزولی معکوس میکند شروع میشود، و به دنبال آن یک مشخصکننده مرتبسازی قرار میگیرد. مشخصکنندههای معتبر مرتبسازی عبارتند از name، numeric، size، mtime، atime، ctime، و blocks، که به ترتیب فایلها را بر اساس نام، نامها بر اساس ترتیب عددی به جای ترتیب واژهنگاشتی، اندازه فایل، زمان آخرین تغییر، زمان آخرین دسترسی، زمان تغییر inode، و تعداد بلوکها مرتب میکنند. اگر هر یک از کلیدهای غیرنام برابر مقایسه شوند (به عنوان مثال، اگر اندازه دو فایل یکسان باشد)، مرتبسازی از نام به عنوان کلید مرتبسازی ثانویه استفاده میکند.
- به عنوان مثال، مقدار -mtime نتایج را به ترتیب نزولی بر اساس زمان تغییر مرتب میکند (جدیدترین در ابتدا).
- مشخصکننده numeric با نامهایی که صرفاً از ارقام تشکیل شدهاند مانند اعداد رفتار میکند و آنها را با استفاده از مقدار عددیشان مرتب میکند (بنابراین، به عنوان مثال، “2” قبل از “10” مرتب میشود). هنگام استفاده از numeric، نامهای حاوی نویسههای غیررقمی پس از تمام نامهای کاملاً رقمی قرار میگیرند و با استفاده از رفتار سنتی بر اساس نام مرتب میشوند.
- مشخصکننده مرتبسازی nosort مرتبسازی را به طور کامل غیرفعال میکند؛ bash نتایج را به همان ترتیبی که از سیستم فایل خوانده میشوند برمیگرداند، و هرگونه - ابتدایی را نادیده میگیرد.
- اگر مشخصکننده مرتبسازی وجود نداشته باشد، به طور پیشفرض روی name قرار میگیرد، بنابراین مقدار + معادل رشته خالی است، و مقدار - بر اساس نام به ترتیب نزولی مرتب میکند. هر مقدار نامعتبر، رفتار مرتبسازی تاریخی را بازمیگرداند.
- HISTCONTROL
- فهرستی از مقادیر که با دونقطه (:) از هم جدا شدهاند و نحوه ذخیره دستورات در فهرست تاریخچه را کنترل میکنند. اگر فهرست مقادیر شامل ignorespace باشد، خطوطی که با یک نویسه فاصله (space) شروع میشوند در فهرست تاریخچه ذخیره نمیشوند. مقدار ignoredups باعث میشود خطوطی که با ورودی قبلی تاریخچه مطابقت دارند ذخیره نشوند. مقدار ignoreboth کوتاهنوشتی برای ignorespace و ignoredups است. مقدار erasedups باعث میشود تمام خطوط قبلی که با خط جاری مطابقت دارند، قبل از ذخیره شدن آن خط، از فهرست تاریخچه حذف شوند. هر مقداری که در فهرست بالا نباشد نادیده گرفته میشود. اگر HISTCONTROL تنظیم نشده باشد، یا حاوی مقدار معتبری نباشد، bash تمام خطوط خوانده شده توسط مفسر پوسته را با توجه به مقدار HISTIGNORE، در فهرست تاریخچه ذخیره میکند. اگر خط اول یک دستور مرکب چندخطی ذخیره شده باشد، خطوط دوم و بعدی بررسی نمیشوند، و بدون در نظر گرفتن مقدار HISTCONTROL به تاریخچه افزوده میشوند. اگر خط اول ذخیره نشده باشد، خطوط دوم و بعدی دستور نیز ذخیره نمیشوند.
- HISTFILE
- نام فایلی که تاریخچه دستورات در آن ذخیره میشود (به HISTORY در زیر مراجعه کنید). Bash مقدار پیشفرضی برابر با ~/.bash_history به آن اختصاص میدهد. اگر HISTFILE تنظیمنشده (unset) یا تهی (null) باشد، پوسته هنگام خروج، تاریخچه دستورات را ذخیره نمیکند.
- HISTFILESIZE
- حداکثر تعداد خطوط موجود در فایل تاریخچه. هنگامی که مقداری به این متغیر اختصاص داده میشود، در صورت نیاز، فایل تاریخچه با حذف قدیمیترین مدخلها کوتاه (truncate) میشود تا تعداد مدخلهای تاریخچهای که در مجموع بیش از آن تعداد خط نمیشوند را در خود جای دهد. اگر فهرست تاریخچه شامل مدخلهای چندخطی باشد، ممکن است فایل تاریخچه برای جلوگیری از باقی گذاشتن مدخلهای تاریخچه ناقص، خطوط بیشتری نسبت به این حداکثر داشته باشد. فایل تاریخچه همچنین پس از نوشتن در آن هنگام خروج پوسته یا توسط دستور توکار history به این اندازه بریده و کوتاه میشود. اگر مقدار 0 باشد، فایل تاریخچه به اندازه صفر بریده و خالی میشود. مقادیر غیرعددی و مقادیر عددی کمتر از صفر، مانع از کوتاه شدن فایل میشوند. پوسته مقدار پیشفرض را پس از خواندن فایلهای راهاندازی، به مقدار HISTSIZE تنظیم میکند.
- HISTIGNORE
- فهرستی از الگوهای جداشده با دونقطه (:) که برای تصمیمگیری درباره اینکه کدام خطوط فرمان باید در فهرست تاریخچه ذخیره شوند، استفاده میشود. اگر یک خط فرمان با یکی از الگوهای موجود در مقدار HISTIGNORE مطابقت داشته باشد، در فهرست تاریخچه ذخیره نمیشود. هر الگو به ابتدای خط مهار شده است (anchored) و باید با کل خط مطابقت داشته باشد (bash بهطور ضمنی یک “*” به آن اضافه نمیکند). هر الگو پس از اعمال بررسیهای مشخصشده توسط HISTCONTROL روی خط آزمایش میشود. علاوه بر نویسههای معمول تطبیق الگوی پوسته، “&” با خط تاریخچه قبلی مطابقت دارد. یک نویسه اسلش وارو (backslash) نویسه “&” را گریزدهی (escape) میکند؛ اسلش وارو قبل از تلاش برای تطبیق حذف میشود. اگر خط اول یک دستور مرکب چندخطی ذخیره شده باشد، خط دوم و خطوط بعدی آزمایش نمیشوند، و بدون در نظر گرفتن مقدار HISTIGNORE به تاریخچه اضافه میشوند. اگر خط اول ذخیره نشده باشد، خط دوم و خطوط بعدی دستور نیز ذخیره نخواهند شد. تطبیق الگو از تنظیمات گزینه پوستهای extglob پیروی میکند.
- HISTIGNORE برخی از عملکردهای HISTCONTROL را نیز در بر میگیرد. الگوی “&” همانند “ignoredups” است، و الگوی “[ ]*” همانند “ignorespace” است. ترکیب این دو الگو با جدا کردن آنها توسط دونقطه (:)، قابلیت “ignoreboth” را فراهم میکند.
- HISTSIZE
- تعداد دستوراتی که باید در تاریخچه دستورات به خاطر سپرده شوند (به HISTORY در زیر مراجعه کنید). اگر مقدار 0 باشد، دستورات در فهرست تاریخچه ذخیره نمیشوند. مقادیر عددی کمتر از صفر باعث میشوند که تمام دستورات در فهرست تاریخچه ذخیره شوند (هیچ محدودیتی وجود نخواهد داشت). پوسته پس از خواندن فایلهای راهاندازی، مقدار پیشفرض را روی 500 تنظیم میکند.
- HISTTIMEFORMAT
- اگر این متغیر مقداردهی شده و تهی نباشد، مقدار آن به عنوان یک رشته قالببندی برای strftime(3) جهت چاپ برچسب زمان مرتبط با هر مدخل تاریخچه که توسط دستور توکار history نمایش داده میشود، استفاده میگردد. اگر این متغیر مقداردهی شده باشد، پوسته برچسبهای زمانی را در فایل تاریخچه مینویسد تا در نشستهای مختلف پوسته حفظ شوند. این سازوکار از نویسه توضیح تاریخچه برای تشخیص برچسبهای زمانی از سایر خطوط تاریخچه استفاده میکند.
- HOME
- دایرکتوری خانگی کاربر فعلی؛ آرگومان پیشفرض برای دستور توکار cd. مقدار این متغیر همچنین هنگام انجام بسط مدک (تغییرمسیر تیلده) استفاده میشود.
- HOSTFILE
- شامل نام فایلی با همان قالب /etc/hosts است که باید هنگامی که پوسته نیاز به تکمیل نام میزبان دارد خوانده شود. فهرست تکمیلهای ممکن نام میزبان ممکن است در حین اجرای پوسته تغییر کند؛ دفعه بعد که پس از تغییر مقدار، تکمیل نام میزبان تلاش شود، bash محتویات فایل جدید را به فهرست موجود اضافه میکند. اگر HOSTFILE تنظیم شده باشد ولی مقداری نداشته باشد، یا نام فایلی قابلخواندن را مشخص نکند، bash تلاش میکند تا /etc/hosts را برای دریافت فهرست تکمیلهای ممکن نام میزبان بخواند. هنگامی که HOSTFILE تنظیمنشده (unset) باشد، bash فهرست نام میزبان را پاک میکند.
- IFS
- به معنی جداکننده فیلد داخلی (Internal Field Separator) است که برای تفکیک کلمات پس از بسط و همچنین تقسیم خطوط به کلمات با استفاده از دستور توکار read به کار میرود. تفکیک کلمات در زیر در بخش بسط (EXPANSION) شرح داده شده است. مقدار پیشفرض “<space><tab><newline>” است.
- IGNOREEOF
- رفتار یک پوسته محاورهای را هنگام دریافت نویسه EOF به عنوان تنها ورودی کنترل میکند. اگر تنظیم شود، مقدار آن تعداد متوالی نویسههای EOF است که باید قبل از خروج bash به عنوان نخستین نویسهها در یک خط ورودی تایپ شوند. اگر متغیر تنظیم شده باشد ولی مقدار عددی نداشته باشد، یا مقدار آن تهی باشد، مقدار پیشفرض ۱۰ است. اگر تنظیم نشده باشد، EOF بیانگر پایان ورودی به پوسته است.
- INPUTRC
- نام فایل برای فایل راهاندازی readline است، که جایگزین مقدار پیشفرض ~/.inputrc میشود (به خط خوان (READLINE) در زیر مراجعه کنید).
- INSIDE_EMACS
- اگر این متغیر هنگام شروع به کار پوسته در محیط ظاهر شود، bash فرض میکند که درون یک بافر پوسته Emacs در حال اجراست و ممکن است بسته به مقدار TERM، ویرایش خط را غیرفعال کند.
- LANG
- برای تعیین ردهٔ محلی (locale) برای هر ردهای که صریحاً با متغیری که با LC_ آغاز میشود مشخص نشده باشد، استفاده میگردد.
- LC_ALL
- این متغیر مقدار LANG و هر متغیر دیگری که با LC_ شروع شده و یک ردهٔ محلی را تعیین میکند، بازنویسی (باطل) مینماید.
- LC_COLLATE
- این متغیر ترتیب تطبیق و مقایسه (collation order) را هنگام مرتبسازی نتایج بسط نام مسیر (pathname expansion) تعیین کرده، و رفتار عبارات بازهای، کلاسهای همارزی و توالیهای تطبیقی را در داخل بسط نام مسیر و تطبیق الگو کنترل میکند.
- LC_CTYPE
- این متغیر تفسیر کاراکترها و رفتار کلاسهای کاراکتری را در درون بسط نام مسیر و تطبیق الگو تعیین میکند.
- LC_MESSAGES
- این متغیر محلی (locale) مورد استفاده برای ترجمهٔ رشتههای نقلقول دوتایی (double-quoted) را که قبل از آنها یک $ آمده است، تعیین مینماید.
- LC_NUMERIC
- این متغیر ردهٔ محلی مورد استفاده برای قالببندی اعداد را تعیین میکند.
- LC_TIME
- این متغیر ردهٔ محلی مورد استفاده برای قالببندی تاریخ و زمان را تعیین میکند.
- LINES
- توسط دستور مرکب select برای تعیین طول ستون جهت چاپ لیستهای انتخابی استفاده میشود. در صورت فعال بودن گزینهٔ checkwinsize یا در یک پوستهٔ تعاملی هنگام دریافت سیگنال SIGWINCH به طور خودکار تنظیم میگردد.
- اگر مقدار آن روی نام یک فایل یا دایرکتوری تنظیم شده باشد و متغیر MAILPATH تنظیم نشده باشد، bash کاربر را از رسیدن ایمیل به فایل مشخصشده یا دایرکتوری با قالب Maildir باخبر میسازد.
- MAILCHECK
- مشخص میکند که هر چند وقت یکبار (بر حسب ثانیه) bash ایمیل را بررسی کند. مقدار پیشفرض ۶۰ ثانیه است. هنگامی که زمان بررسی ایمیل فرا برسد، پوسته این کار را قبل از نمایش اعلان اولیه (primary prompt) انجام میدهد. اگر این متغیر مقداردهی نشده باشد، یا مقداری غیرعددی یا عددی کوچکتر از صفر داشته باشد، پوسته بررسی ایمیل را غیرفعال میکند.
- MAILPATH
- فهرستی از نامهای فایل جداشده با دونقطه (colon) برای بررسی ایمیل. پیامی که باید هنگام رسیدن ایمیل به یک فایل خاص چاپ شود را میتوان با جدا کردن نام فایل از پیام به وسیلهٔ یک “?” مشخص کرد. هنگامی که در متن پیام استفاده شود، $_ به نام فایل ایمیل فعلی بسط مییابد. به عنوان مثال:
MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
Bash میتواند طوری پیکربندی شود که یک مقدار پیشفرض برای این متغیر فراهم کند (به طور پیشفرض هیچ مقداری وجود ندارد)، اما محل فایلهای ایمیل کاربر که از آن استفاده میکند وابسته به سیستم است (مثلاً /var/mail/$USER).
- OPTERR
- اگر روی مقدار ۱ تنظیم شده باشد، bash پیامهای خطای ایجاد شده توسط دستور توکار getopts را نمایش میدهد (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید). OPTERR هر بار که پوسته فراخوانی میشود یا یک اسکریپت پوسته اجرا میگردد، با مقدار ۱ مقداردهی اولیه میشود.
- PATH
- مسیر جستجو برای دستورات. این یک فهرست جداشده با دونقطه (:) از دایرکتوریهایی است که در آنها پوسته به دنبال دستورات میگردد (بخش اجرای دستور (COMMAND EXECUTION) در زیر را ببینید). یک نام دایرکتوری با طول صفر (تهی/null) در مقدار PATH نشاندهنده دایرکتوری جاری است. یک نام دایرکتوری تهی ممکن است به صورت دو دونقطه متوالی، یا به صورت یک دونقطه در ابتدا یا انتهای مقدار ظاهر شود. مسیر پیشفرض وابسته به سیستم است، و توسط مدیری که bash را نصب میکند تنظیم میشود. یک مقدار رایج به شرح زیر است:
/usr/local/bin:/usr/local/sbin: /usr/bin:/usr/sbin:/bin:/sbin
- POSIXLY_CORRECT
- اگر این متغیر هنگام شروع bash در محیط وجود داشته باشد، پوسته قبل از خواندن فایلهای راهاندازی وارد حالت posix میشود، درست مانند اینکه گزینه فراخوانی --posix ارائه شده باشد. اگر این متغیر در حین اجرای پوسته تنظیم شود، bash حالت posix را فعال میکند، گویی دستور “set -o posix” اجرا شده است. هنگامی که پوسته وارد حالت posix میشود، در صورتی که این متغیر قبلاً تنظیم نشده باشد، آن را تنظیم میکند.
- PROMPT_COMMAND
- اگر این متغیر تنظیم شده باشد و یک آرایه باشد، مقدار هر عنصر مقداردهیشده قبل از صدور هر خط اعلان اصلی به عنوان یک دستور اجرا میشود. اگر تنظیم شده باشد اما متغیر آرایهای نباشد، مقدار آن به عنوان دستوری برای اجرا در نظر گرفته میشود.
- PROMPT_DIRTRIM
- اگر روی عددی بزرگتر از صفر تنظیم شود، این مقدار به عنوان تعداد بخشهای انتهایی دایرکتوری برای نگهداشتن هنگام بسط کدهای گریز رشته خط اعلان \w و \W استفاده میشود (بخش خط اعلان (PROMPTING) در زیر را ببینید). نویسههای حذفشده با سه نقطه (...) جایگزین میشوند.
- PS0
- مقدار این پارامتر بسط داده میشود (بخش خط اعلان (PROMPTING) در زیر را ببینید) و توسط پوستههای تعاملی پس از خواندن یک دستور و قبل از اجرای آن نمایش داده میشود.
- PS1
- مقدار این پارامتر بسط داده میشود (بخش خط اعلان (PROMPTING) در زیر را ببینید) و به عنوان رشته خط اعلان اصلی استفاده میشود. مقدار پیشفرض آن “\s-\v\$ ”. است.
- PS2
- مقدار این پارامتر همانند PS1 بسط داده میشود و به عنوان رشته خط اعلان ثانویه استفاده میشود. پیشفرض آن “> ”. است.
- PS3
- مقدار این پارامتر به عنوان خط اعلان برای دستور select استفاده میشود (بخش گرامر پوسته (SHELL GRAMMAR) در بالا را ببینید).
- PS4
- مقدار این پارامتر همانند PS1 بسط داده میشود و مقدار آن قبل از هر دستوری که bash در طول ردیابی اجرا (execution trace) نمایش میدهد، چاپ میشود. نخستین نویسه از مقدار بسطیافته PS4 در صورت لزوم، برای نشان دادن چندین سطح از ارجاع غیرمستقیم، چندین بار تکرار میشود. پیشفرض آن “+ ”. است.
- SHELL
- این متغیر به نام مسیر کامل پوسته بسط مییابد. اگر هنگام شروع به کار پوسته مقداردهی نشده باشد، bash نام مسیر کامل پوسته ورود به سیستم کاربر فعلی را به آن اختصاص میدهد.
- TIMEFORMAT
- مقدار این پارامتر بهعنوان یک رشته قالببندی استفاده میشود که نحوه نمایش اطلاعات زمانبندی برای خطوط لولهای که با کلمه رزرو شده time شروع میشوند را مشخص میکند. نویسه % معرف یک دنباله گریز است که به یک مقدار زمانی یا سایر اطلاعات بسط داده میشود. دنبالههای گریز و معانی آنها به شرح زیر هستند؛ قلابها بخشهای اختیاری را نشان میدهند.
- %%
- یک نویسه واقعی %.
- %[p][l]R
- زمان سپریشده به ثانیه.
- %[p][l]U
- تعداد ثانیههای CPU سپریشده در حالت کاربر (user mode).
- %[p][l]S
- تعداد ثانیههای CPU سپریشده در حالت سیستم (system mode).
- %P
- درصد استفاده از CPU، محاسبهشده بهصورت (%U + %S) / %R.
- شناسه اختیاری p رقمی است که دقت (precision) را مشخص میکند، یعنی تعداد ارقام اعشاری پس از ممیز. مقدار 0 باعث میشود ممیز یا رقم اعشاری در خروجی نمایش داده نشود. time حداکثر شش رقم بعد از ممیز را چاپ میکند؛ مقادیر p بزرگتر از 6 به 6 تبدیل میشوند. اگر p مشخص نشده باشد، time سه رقم بعد از ممیز را چاپ میکند.
- گزینه اختیاری l قالبی طولانیتر شامل دقیقهها را به شکل MMmSS.FFs مشخص میکند. مقدار p تعیین میکند که آیا بخش اعشاری گنجانده شود یا خیر.
- اگر این متغیر مقداردهی نشده باشد، bash طوری رفتار میکند که گویی دارای مقدار $'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' است. اگر مقدار آن تهی (null) باشد، bash هیچگونه اطلاعات زمانبندی را نمایش نمیدهد. هنگام نمایش رشته قالببندی، یک خط جدید در انتهای آن افزوده میشود.
- TMOUT
- اگر به مقداری بزرگتر از صفر تنظیم شود، دستور توکار read از این مقدار بهعنوان مهلت زمانی (timeout) پیشفرض خود استفاده میکند. دستور select در صورتی که ورودی از یک ترمینال باشد و پس از TMOUT ثانیه ورودی دریافت نشود، خاتمه مییابد. در یک پوسته تعاملی، این مقدار بهعنوان تعداد ثانیههایی تفسیر میشود که باید پس از نمایش اعلان اصلی برای دریافت یک سطر ورودی منتظر ماند. اگر یک سطر کامل از ورودی دریافت نشود، Bash پس از انتظار برای آن تعداد ثانیه خاتمه مییابد.
- TMPDIR
- در صورت تنظیم، bash از مقدار آن بهعنوان نام دایرکتوریای استفاده میکند که bash فایلهای موقت را برای استفاده پوسته در آن ایجاد مینماید.
- auto_resume
- این متغیر نحوه تعامل پوسته با کاربر و مدیریت کارها (job control) را کنترل میکند. اگر این متغیر تنظیم شود، دستورات سادهای که تنها از یک کلمه تشکیل شدهاند، بدون تغییر مسیرها، بهعنوان کاندیداهایی برای ازسرگیری یک کار متوقفشده موجود در نظر گرفته میشوند. هیچ ابهامی مجاز نیست؛ اگر بیش از یک کار وجود داشته باشد که با آن کلمه شروع شود یا حاوی آن کلمه باشد، کاری که اخیراً دسترسی بیشتری داشته است انتخاب میشود. نام یک کار متوقفشده، در این زمینه، همان خط فرمانی است که برای شروع آن به کار رفته، همانطور که توسط jobs نمایش داده میشود. اگر به مقدار exact تنظیم شود، کلمه باید دقیقاً با نام کار متوقفشده مطابقت داشته باشد؛ اگر به substring تنظیم شود، کلمه باید با یک زیررشته از نام کار متوقفشده مطابقت کند. مقدار substring عملکردی مشابه با شناسه کار %? ارائه میدهد (بخش مدیریت کارها (JOB CONTROL) را در زیر ببینید). اگر به هر مقدار دیگری تنظیم شود (برای مثال، prefix)، کلمه باید پیشوندی از نام کار متوقفشده باشد؛ این حالت عملکردی مشابه شناسه کار %string را ارائه میدهد.
- histchars
- دو یا سه نویسهای که بسط تاریخچه، جایگزینی سریع و نشانهگذاری (توکنبندی) را کنترل میکنند (بخش بسط تاریخچه (HISTORY EXPANSION) در زیر را ببینید). نویسه اول، نویسه بسط تاریخچه است؛ نویسهای که یک بسط تاریخچه را آغاز میکند، که معمولاً “!” است. نویسه دوم، نویسه جایگزینی سریع است، که معمولاً “^” است. هنگامی که به عنوان اولین نویسه در خط ظاهر میشود، جایگزینی تاریخچه، دستور قبلی را با جایگزین کردن یک رشته به جای رشته دیگر، تکرار میکند. نویسه اختیاری سوم، نویسه توضیحات تاریخچه است، که معمولاً “#” است، و نشان میدهد که بقیه خط یک توضیح (کامنت) است هنگامی که به عنوان اولین نویسه یک کلمه ظاهر شود. نویسه توضیحات تاریخچه، جایگزینی تاریخچه را برای کلمات باقیمانده در خط غیرفعال میکند. این امر لزوماً باعث نمیشود که تجزیهکننده پوسته بقیه خط را به عنوان یک توضیح در نظر بگیرد.
آرایهها (Arrays)
Bash متغیرهای آرایه یکبعدی اندیسدار و متناظر (انجمنی) را فراهم میکند. هر متغیری میتواند به عنوان یک آرایه اندیسدار استفاده شود؛ دستور توکار declare به طور صریح یک آرایه را اعلان میکند. هیچ محدودیت حداکثری برای اندازه یک آرایه وجود ندارد، و هیچ الزامی هم نیست که اعضا به طور پیوسته اندیسگذاری یا مقداردهی شوند. آرایههای اندیسدار با استفاده از عبارات حسابی ارجاع داده میشوند که باید به یک عدد صحیح بسط یابند (بخش ارزیابی حسابی (ARITHMETIC EVALUATION) در زیر را ببینید) و مبتنی بر صفر هستند؛ آرایههای متناظر با استفاده از رشتههای دلخواه ارجاع داده میشوند. مگر در مواردی که خلاف آن ذکر شده باشد، اندیسهای آرایه اندیسدار باید اعداد صحیح غیرمنفی باشند.
پوسته بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور، و حذف نقلقول را روی زیرنویسهای (اندیسهای) آرایه اندیسدار انجام میدهد. از آنجا که این کار میتواند به طور بالقوه منجر به رشتههای خالی شود، اندیسگذاری زیرنویس با آنها به عنوان عباراتی رفتار میکند که به 0 ارزیابی میشوند.
پوسته بسط تیلدا، بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور، و حذف نقلقول را روی زیرنویسهای (کلیدهای) آرایه متناظر انجام میدهد. رشتههای خالی نمیتوانند به عنوان کلیدهای آرایه متناظر استفاده شوند.
Bash در صورتی که هر متغیری با استفاده از ساختار زیر مقداردهی شود، به طور خودکار یک آرایه اندیسدار ایجاد میکند:
آرایههای متناظر با استفاده از دستور زیر ایجاد میشوند:
ویژگیها (سمتها) را میتوان برای یک متغیر آرایه با استفاده از دستورات توکار declare و readonly مشخص کرد. هر ویژگی برای تمام اعضای یک آرایه اعمال میشود.
مقداردهی آرایهها با استفاده از انتسابهای مرکب به فرم name=(value1 ... valuen) انجام میشود، که در آن هر value میتواند به فرم [subscript]=string باشد. انتسابهای آرایه نمایهدار به چیزی جز string نیاز ندارند. هر value در این فهرست با استفاده از بسطهای پوسته که در ادامه ذیل EXPANSION توضیح داده شده است بسط مییابد، اما valueهایی که انتسابهای معتبر متغیر شامل کروشهها و زیرنویس هستند، مانند انتسابهای متغیر تکی، تحت بسط آک BeautifulSoup (بسط قلاب) و تفکیک کلمات قرار نمیگیرند.
هنگام انتساب به آرایههای نمایهدار، اگر کروشهها و زیرنویس اختیاری ارائه شوند، به آن نمایه انتساب داده میشود؛ در غیر این صورت، نمایه عنصری که به آن مقدار اختصاص داده میشود، آخرین نمایه اختصاصیافته توسط عبارت بهعلاوه یک است. نمایهگذاری از صفر آغاز میشود.
هنگام انتساب به یک آرایه انجمنی، کلمات موجود در یک انتساب مرکب میتوانند عبارات انتساب باشند که برای آنها زیرنویس الزامی است، یا فهرستی از کلمات باشند که به عنوان توالی متناوب کلیدها و مقادیر تفسیر میشوند: name=( key1 value1 key2 value2 ...). اینها رفتاری کاملاً یکسان با name=( [key1]=value1 [key2]=value2 ...) دارند. اولین کلمه در فهرست مشخص میکند که کلمات باقیمانده چگونه تفسیر شوند؛ تمام انتسابها در یک فهرست باید از یک نوع باشند. هنگام استفاده از جفتهای کلید/مقدار، کلیدها نباید وجود نداشته یا خالی باشند؛ نبود مقدار نهایی مانند رشته خالی در نظر گرفته میشود.
این نحو همچنین توسط دستور توکار declare پذیرفته میشود. عناصر مجزای آرایه را میتوان با استفاده از نحو name[subscript]=value که در بالا معرفی شد، مقداردهی کرد.
هنگام انتساب به یک آرایه نمایهدار، اگر name با یک عدد منفی زیرنویسگذاری شده باشد، آن عدد بهصورت نسبی نسبت به یکی بزرگتر از حداکثر نمایه name تفسیر میشود، بنابراین نمایههای منفی از انتهای آرایه به عقب شمارش میشوند و نمایه -1 به آخرین عنصر اشاره میکند.
عملگر “+=” هنگام انتساب با استفاده از نحو انتساب مرکب، به یک متغیر آرایه اضافه میکند؛ PARAMETERS در بالا را ببینید.
به یک عنصر آرایه با استفاده از ${name[subscript]} ارجاع داده میشود. آکولادها برای جلوگیری از تداخل با بسط مسیر الزامی هستند. اگر subscript برابر با @ یا * باشد، کلمه به تمام اعضای name بسط مییابد، مگر اینکه در توضیحات یک دستور توکار یا بسط کلمه طور دیگری ذکر شده باشد. این زیرنویسها تنها زمانی متفاوت عمل میکنند که کلمه درون جفتکوتیشن (نقلقول دوگانه) قرار گیرد. اگر کلمه درون جفتکوتیشن باشد، ${name[*]} به یک کلمه واحد با مقدار هر عضو آرایه که با اولین نویسه متغیر ویژه IFS جدا شده است بسط مییابد، و ${name[@]} هر عنصر name را به یک کلمه جداگانه بسط میدهد. هنگامی که هیچ عضو آرایهای وجود ندارد، ${name[@]} به هیچ چیزی بسط نمییابد. اگر بسط درون جفتکوتیشن در داخل یک کلمه رخ دهد، بسط پارامتر اول با بخش ابتدایی بسط کلمه اصلی الحاق میشود، و بسط آخرین پارامتر با بخش پایانی بسط کلمه اصلی الحاق میگردد. این رفتار مشابه بسط پارامترهای ویژه * و @ است (بخش Special Parameters در بالا را ببینید).
عبارت ${#name[subscript]} به طول ${name[subscript]} بسط مییابد. اگر subscript برابر با * یا @ باشد، حاصل بسط تعداد عناصر موجود در آرایه خواهد بود.
اگر subscript (زیرنویس/اندیس) استفادهشده برای ارجاع به عنصری از یک آرایه نمایهشده به مقداری کمتر از صفر ارزیابی شود، بهصورت نسبی نسبت به یکی بیشتر از بیشترین اندیس آرایه تفسیر میشود؛ بنابراین اندیسهای منفی از انتهای آرایه به سمت عقب شمرده میشوند، و اندیس -1 به آخرین عنصر ارجاع میدهد.
ارجاع به یک متغیر آرایهای بدون زیرنویس معادل ارجاع به آرایه با زیرنویس 0 است. هرگونه ارجاع به یک متغیر با استفاده از یک زیرنویس معتبر، مجاز است؛ bash در صورت لزوم یک آرایه ایجاد میکند.
یک متغیر آرایهای در صورتی مقداردهیشده (set) در نظر گرفته میشود که به یک زیرنویس آن مقداری اختصاص داده شده باشد. رشته تهی یک مقدار معتبر است.
بهدست آوردن کلیدها (اندیسها)ی یک آرایه به همان صورت مقادیر امکانپذیر است. ${!name[@]} و ${!name[*]} به اندیسهای اختصاصیافته در متغیر آرایهای name بسط مییابند. رفتار آن در صورت قرار گرفتن در دوگان نقلقول (double quotes) مشابه بسط پارامترهای ویژه @ و * درون دوگان نقلقول است.
دستور توکار unset برای از بین بردن آرایهها استفاده میشود. unset name[subscript] عنصر آرایه در اندیس subscript را، هم برای آرایههای نمایهشده و هم انجمنی، حذف میکند. زیرنویسهای منفی برای آرایههای نمایهشده همانطور که در بالا شرح داده شد تفسیر میشوند. حذف آخرین عنصر یک متغیر آرایهای، خود متغیر را حذف نمیکند. unset name، جایی که name یک آرایه است، کل آرایه را حذف میکند. unset name[subscript] بسته به این که name یک آرایه نمایهشده است یا انجمنی، هنگامی که subscript برابر * یا @ باشد، رفتار متفاوتی دارد. اگر name یک آرایه انجمنی باشد، این کار عنصری با زیرنویس * یا @ را حذف میکند. اگر name یک آرایه نمایهشده باشد، unset تمام عناصر را پاک میکند ولی خود آرایه را حذف نمیکند.
هنگام استفاده از نام متغیر به همراه زیرنویس به عنوان یک آرگومان برای یک دستور، مانند unset، بدون استفاده از نحو بسط کلمه که در بالا شرح داده شد، (بهعنوان مثال، unset a[4])، آرگومان مشمول بسط نام مسیر (pathname expansion) میشود. اگر بسط نام مسیر مطلوب نیست، آرگومان را درون نقلقول قرار دهید (بهعنوان مثال، unset 'a[4]').
دستورات توکار declare، local، و readonly هر کدام یک گزینه -a را برای تعیین یک آرایه نمایهشده و یک گزینه -A را برای تعیین یک آرایه انجمنی میپذیرند. اگر هر دو گزینه ارائه شوند، -A اولویت دارد. دستور توکار read یک گزینه -a را برای اختصاص فهرستی از کلمات خواندهشده از ورودی استاندارد به یک آرایه میپذیرد. دستورات توکار set و declare مقادیر آرایه را به شیوهای نمایش میدهند که امکان استفاده مجدد از آنها به عنوان انتسابها را فراهم میکند. سایر دستورات توکار نیز آرگومانهای نام آرایه را میپذیرند (بهعنوان مثال، mapfile)؛ برای جزئیات به توضیحات دستورات توکار منفرد در زیر مراجعه کنید. پوسته تعدادی متغیر آرایهای توکار فراهم میکند.
بسط (EXPANSION)
بسط روی خط فرمان پس از تقسیم شدن آن به کلمات انجام میشود. پوسته این بسطها را انجام میدهد: بسط آکولاد (brace expansion)، بسط مدک (tilde expansion)، بسط پارامتر و متغیر (parameter and variable expansion)، جایگزینی دستور (command substitution)، بسط حسابی (arithmetic expansion)، تفکیک کلمات (word splitting)، بسط نام مسیر (pathname expansion)، و حذف نقلقول (quote removal).
ترتیب انجام بسطها به این صورت است: بسط آکولاد (brace expansion)؛ بسط تیلدا (tilde expansion)، بسط پارامتر و متغیر (parameter and variable expansion)، بسط حسابی (arithmetic expansion)، و جایگزینی دستور (command substitution) (که به صورت چپبهراست انجام میشوند)؛ تفکیک کلمات (word splitting)؛ بسط نام مسیر (pathname expansion)؛ و حذف نقلقول (quote removal).
روی سیستمهایی که توانایی پشتیبانی از آن را دارند، یک بسط اضافی نیز در دسترس است: جایگزینی فرایند (process substitution). این بسط همزمان با بسطهای تیلدا، پارامتر، متغیر، حسابی و جایگزینی دستور انجام میشود.
حذف نقلقول (Quote removal) همواره در آخرین مرحله انجام میگیرد. این عمل کاراکترهای نقلقول موجود در کلمه اصلی را حذف میکند، نه مواردی که در اثر یکی از بسطهای دیگر ایجاد شدهاند، مگر اینکه خود آنها نیز داخل نقلقول قرار گرفته باشند.
تنها بسط آکولاد، تفکیک کلمات و بسط نام مسیر میتوانند تعداد کلمات حاصل از بسط را افزایش دهند؛ سایر بسطها یک کلمه منفرد را به یک کلمه منفرد بسط میدهند. تنها استثناهای این قاعده، بسطهای "$@" و "${name[@]}", و در اکثر موارد، $* و ${name[*]} هستند، همانطور که در بالا توضیح داده شد (ببینید پارامترها (PARAMETERS)).
بسط آکولاد (Brace Expansion)
بسط آکولاد (Brace expansion) سازوکاری است برای تولید رشتههای اختیاری و دلخواه با پیشوند و پسوند مشترک، که هر یک از آنها میتواند خالی باشد. این سازوکار شبیه به بسط نام مسیر (pathname expansion) است، اما نام فایلهای تولیدشده الزاماً نباید وجود خارجی داشته باشند. الگوهایی که قرار است با آکولاد بسط داده شوند، از یک پیشدرآمد (preamble) اختیاری تشکیل میشوند، که به دنبال آن یا مجموعهای از رشتههای جداشده با ویرگول یا یک عبارت دنبالهای (sequence expression) درون یک جفت آکولاد میآید، و در انتها یک پسدرآمد (postscript) اختیاری قرار میگیرد. پیشدرآمد به ابتدای هر یک از رشتههای موجود درون آکولاد اضافه میشود، و سپس پسدرآمد به انتهای هر رشته حاصل الحاق میگردد، و بسط از چپ به راست صورت میگیرد.
بسطهای آکولاد میتوانند به صورت تو در تو باشند. نتایج حاصل از هر رشته بسطیافته مرتبسازی (sort) نمیشوند؛ بسط آکولاد ترتیب چپ به راست را حفظ میکند. برای مثال، a{d,c,b}e به “ade ace abe” بسط مییابد.
یک عبارت دنبالهای شکلی مانند x..y[..incr] به خود میگیرد، که در آن x و y یا اعداد صحیح هستند یا تکحرفها، و incr، که گام افزایشی اختیاری است، یک عدد صحیح است. هنگامی که اعداد صحیح ارائه شوند، عبارت به تکتک اعداد بین x و y، شامل خود آنها، بسط پیدا میکند. اگر x یا y با یک صفر شروع شود، هر عبارت تولیدشده دارای تعداد ارقام یکسانی خواهد بود، و در صورت لزوم با صفرهای اولیه پر میشود (zero-padding). هنگامی که حروف ارائه شوند، عبارت به تکتک کاراکترهایی که بر اساس ترتیب واژهنگاشتی (lexicographically) بین x و y، شامل خود آنها، با استفاده از لوکال C قرار دارند، بسط داده میشود. توجه داشته باشید که هر دوی x و y باید از یک نوع یکسان (عدد صحیح یا حرف) باشند. هنگامی که مقدار افزایشی (increment) ارائه شود، از آن به عنوان تفاضل میان هر عبارت استفاده میشود. مقدار افزایشی پیشفرض بر حسب نیاز 1 یا -1 است.
بسط آکولاد پیش از هر بسط دیگری اجرا میشود، و هر کاراکتر ویژهای که متعلق به بسطهای دیگر باشد در نتیجه حفظ خواهد شد. عملکرد آن کاملاً متنی است. Bash هیچگونه تفسیر نحوی (syntactic interpretation) را بر بافت متنِ بسط دادهشده یا متن درون آکولادها اعمال نمیکند.
یک بسط آکولاد با ساختار صحیح باید شامل آکولادهای باز و بسته بدون نقلقول، و حداقل یک ویرگولِ بدون نقلقول یا یک عبارت دنبالهای معتبر باشد. هر بسط آکولادی با ساختار نادرست بدون تغییر باقی میماند.
یک “{” یا Q , میتواند با یک بکاسلش نقلقول شود تا از در نظر گرفته شدن آن به عنوان بخشی از یک عبارت آکولادی جلوگیری شود. به منظور اجتناب از تداخل با بسط پارامتر، رشته “${” واجد شرایط بسط آکولاد در نظر گرفته نمیشود، و تا رسیدن به “}” بسته، از انجام بسط آکولاد جلوگیری میکند.
این ساختار معمولاً به عنوان یک روش خلاصهنویسی زمانی استفاده میشود که پیشوند مشترک رشتههایی که قرار است تولید شوند، طولانیتر از مثال بالا باشد:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
بسط آکولاد ناسازگاری جزئی با نسخههای تاریخی sh ایجاد میکند. sh با آکولادهای باز یا بسته هنگامی که به عنوان بخشی از یک کلمه ظاهر میشوند رفتار خاصی ندارد و آنها را در خروجی حفظ میکند. Bash به عنوان نتیجهای از بسط آکولاد، آکولادها را از کلمات حذف میکند. به عنوان مثال، کلمهای که در sh به صورت “file{1,2}” وارد شود، عیناً در خروجی ظاهر میشود. Bash پس از بسط آکولاد، آن کلمه را به صورت “file1 file2” خروجی میدهد. برای سازگاری دقیق با sh، bash را با گزینه +B شروع کنید یا بسط آکولاد را با گزینه +B در دستور set غیرفعال نمایید (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
بسط تیلدا (Tilde Expansion)
اگر کلمهای با یک نویسه تیلدای نقلقولنشده شروع شود (“~”)، تمام نویسههای قبل از نخستین ممیز (اسلش) نقلقولنشده (یا همه نویسهها، اگر هیچ ممیز نقلقولنشدهای وجود نداشته باشد) به عنوان یک tilde-prefix (پیشوند تیلدا) در نظر گرفته میشوند. اگر هیچیک از نویسههای موجود در پیشوند تیلدا نقلقول نشده باشند، نویسههای موجود در پیشوند تیلدا پس از تیلدا به عنوان یک login name (نام کاربری ورود) احتمالی در نظر گرفته میشوند. اگر این نام کاربری ورود یک رشته تهی باشد، تیلدا با مقدار پارامتر پوسته HOME جایگزین میشود. اگر HOME تنظیم نشده باشد، تیلدا به جای آن به دایرکتوری خانگی کاربری که پوسته را اجرا میکند بسط مییابد. در غیر این صورت، پیشوند تیلدا با دایرکتوری خانگی مرتبط با نام کاربری ورود مشخصشده جایگزین میشود.
اگر پیشوند تیلدا یک “~+” باشد، مقدار متغیر پوسته PWD جایگزین پیشوند تیلدا میشود. اگر پیشوند تیلدا یک “~-” باشد، پوسته مقدار متغیر پوسته OLDPWD را در صورت تنظیم بودن جایگزین میکند. اگر نویسههای پس از تیلدا در پیشوند تیلدا از یک عدد N تشکیل شده باشند که اختیاری با یک “+” یا یک “-” پیشوند شده باشد، پیشوند تیلدا با عنصر متناظر از پشته دایرکتوری جایگزین میشود، همانطور که توسط دستور توکار dirs هنگام فراخوانی با نویسههای پس از تیلدا در پیشوند تیلدا به عنوان آرگومان نمایش داده میشود. اگر نویسههای پس از تیلدا در پیشوند تیلدا شامل یک عدد بدون “+” یا “-” در ابتدا باشند، بسط تیلدا فرض میکند که علامت “+” است.
نتایج بسط تیلدا بهگونهای رفتار میشوند که گویی نقلقول شدهاند، بنابراین جایگزینی مشمول جداسازی کلمات و بسط مسیر پرونده نمیشود.
اگر نام ورود به سیستم نامعتبر باشد یا بسط تیلدا با شکست مواجه شود، پیشوند تیلدا بدون تغییر باقی میماند.
Bash هر مقداردهی متغیر را برای پیشوندهای تیلدای بدون نقلقول که بلافاصله پس از یک : یا اولین = میآیند بررسی کرده و در این موارد بسط تیلدا را انجام میدهد. در نتیجه، میتوان از نامهای فایل حاوی تیلدا در انتسابها به PATH، MAILPATH، و CDPATH استفاده کرد و پوسته مقدار بسطیافته را منتسب میکند.
Bash همچنین بسط تیلدا را روی کلماتی که شرایط مقداردهی متغیرها را برآورده میکنند (همانطور که در بالا ذیل PARAMETERS شرح داده شد) هنگامی که بهعنوان آرگومان برای دستورات ساده ظاهر میشوند، انجام میدهد. Bash در حالت posix این کار را، بهجز برای دستورات declaration فهرستشده در بالا، انجام نمیدهد.
بسط پارامتر (Parameter Expansion)
نویسه “$” معرف بسط پارامتر، جایگزینی دستور، یا بسط حسابی است. نام پارامتر یا نمادی که باید بسط داده شود ممکن است در آکولاد محصور شود؛ آکولادها اختیاری هستند اما برای محافظت از متغیری که قرار است بسط یابد در برابر نویسههای بلافاصله پس از آن که ممکن است بهعنوان بخشی از نام تفسیر شوند، به کار میروند.
هنگامی که از آکولاد استفاده میشود، آکولاد پایانی متناظر اولین “}” است که با بکاسلش گریز داده نشده یا درون یک رشته نقلقولشده نباشد، و درون یک بسط حسابی توکار، جایگزینی دستور، یا بسط پارامتر قرار نگرفته باشد.
شکل پایه بسط پارامتر به این صورت است:
${parameter}
که مقدار parameter را جایگزین میکند. آکولادها در صورتی الزامی هستند که parameter یک پارامتر موضعی با بیش از یک رقم باشد، یا زمانی که parameter توسط نویسهای دنبال شود که نباید بهعنوان بخشی از نام آن تفسیر گردد. parameter یک پارامتر پوسته است همانگونه که در بالا (PARAMETERS) شرح داده شد یا یک ارجاع آرایه (Arrays) است.
اگر اولین نویسه parameter یک علامت تعجب (!) باشد، و parameter یک nameref نباشد، سطحی از غیراستفاده مستقیم (indirection) را معرفی میکند. Bash مقداری را که با بسط بقیه parameter تشکیل میشود بهعنوان parameter جدید به کار میگیرد؛ سپس این پارامتر جدید بسط داده میشود و آن مقدار به جای بسط parameter اصلی، در بقیه فرایند بسط استفاده میشود. این حالت بهعنوان بسط نامستقیم (indirect expansion) شناخته میشود. این مقدار مشمول بسط تیلدا، بسط پارامتر، جایگزینی دستور و بسط حسابی است. اگر parameter یک nameref باشد، جهت حفظ سازگاری، به جای انجام بسط نامستقیم کامل، به نام پارامتری که توسط parameter به آن ارجاع شده است بسط مییابد. استثنائات این قاعده، بسطهای ${!prefix*} و ${!name[@]} هستند که در زیر شرح داده شدهاند. علامت تعجب برای ایجاد حالت نامستقیم باید بلافاصله پس از آکولاد چپ بیاید.
در هر یک از موارد زیر، word مشمول بسط تیلدا، بسط پارامتر، جایگزینی دستور و بسط حسابی است.
هنگامی که بسط زیررشته انجام نمیشود، با استفاده از اشکال مستندشده در زیر (برای نمونه، :-)، bash پارامتر را از نظر تنظیمنشده (unset) یا خالی (null) بودن بررسی میکند. حذف دونقطه، پارامتر را تنها از نظر تنظیمنشده بودن میآزماید.
- ${parameter:-word}
- استفاده از مقادیر پیشفرض. اگر parameter تنظیم نشده یا تهی (null) باشد، بسط یافتهٔ word جایگزین میشود. در غیر این صورت، مقدار parameter جایگزین خواهد شد.
- ${parameter:=word}
- تخصیص مقادیر پیشفرض. اگر parameter تنظیم نشده یا تهی باشد، بسط یافتهٔ word به parameter اختصاص داده میشود، و این بسط، مقدار نهایی parameter خواهد بود. پارامترهای موضعی و پارامترهای خاص را نمیتوان بدین شیوه مقداردهی کرد.
- ${parameter:?word}
- نمایش خطا در صورت تهی بودن یا تنظیمنشدن. اگر parameter تهی یا تنظیمنشده باشد، پوسته بسط یافتهٔ word را (یا در صورت عدم وجود word پیامی مبنی بر این موضوع را) در خروجی استاندارد خطا مینویسد و چنانچه تعاملی نباشد، با وضعیتی غیر از صفر خارج میشود. یک پوستهٔ تعاملی خارج نمیشود، اما دستوری را که با این بسط همراه است اجرا نمیکند. در غیر این صورت، مقدار parameter جایگزین خواهد شد.
- ${parameter:+word}
- استفاده از مقدار جایگزین. اگر parameter تهی یا تنظیمنشده باشد، چیزی جایگزین نمیشود؛ در غیر این صورت بسط یافتهٔ word جایگزین میگردد. مقدار parameter استفاده نمیشود.
- ${parameter:offset}
- ${parameter:offset:length}
- Bبسط زیررشته. تا حداکثر length نویسه از مقدار parameter را با شروع از نویسهٔ مشخصشده توسط offset بسط میدهد. اگر parameter برابر با @ یا *، یک آرایهٔ اندیسدار با زیرنویس @ یا *، یا نام یک آرایهٔ متناظر باشد، نتایج طبق آنچه در زیر توضیح داده شده تفاوت خواهد داشت. اگر :length حذف شده باشد (حالت اول در بالا)، این عبارت به زیررشتهای از مقدار parameter بسط مییابد که از نویسهٔ مشخصشده با offset آغاز میشود و تا انتهای مقدار ادامه دارد. اگر offset حذف شده باشد، به عنوان 0 در نظر گرفته میشود. اگر length حذف شده باشد، اما دونقطهٔ بعد از offset درج شده باشد، به عنوان 0 در نظر گرفته خواهد شد. length و offset عبارات حسابی هستند (به بخش ارزیابی حسابی (ARITHMETIC EVALUATION) در زیر مراجعه کنید).
- اگر مقدار offset عددی کمتر از صفر ارزیابی شود، از آن مقدار به عنوان جابهجایی بر حسب نویسه از انتهای مقدار parameter استفاده میشود. اگر مقدار length عددی کمتر از صفر ارزیابی شود، به عنوان جابهجایی بر حسب نویسه از انتهای مقدار parameter تفسیر میشود و نه تعداد نویسهها، و نتیجهٔ بسط، نویسههای بین offset و آن مقدار خواهد بود. توجه داشته باشید که آفست منفی باید حداقل با یک فاصله از دونقطه جدا شود تا با بسط :- اشتباه گرفته نشود.
- اگر parameter برابر با @ یا * باشد، نتیجه شامل تعداد length پارامتر موضعی است که از offset آغاز میشوند. یک offset منفی نسبت به یکی بیشتر از بزرگترین پارامتر موضعی محاسبه میشود؛ بنابراین آفست -1 برابر با آخرین پارامتر موضعی خواهد بود (یا اگر پارامتر موضعی وجود نداشته باشد، برابر با 0). چنانچه length عددی کمتر از صفر ارزیابی شود، یک خطای بسط رخ میدهد.
- اگر parameter نام یک آرایهٔ اندیسدار با زیرنویس @ یا * باشد، نتیجه شامل length عضو از آرایه خواهد بود که با ${parameter[offset]} شروع میشوند. یک offset منفی نسبت به یکی بیشتر از بیشترین اندیس آرایهٔ مشخصشده محاسبه میشود. چنانچه length به عددی کمتر از صفر ارزیابی شود، یک خطای بسط به وجود میآید.
- اعمال بسط زیررشته روی یک آرایهٔ متناظر (associative array) نتایج نامشخصی تولید میکند.
- اندیسگذاری زیررشته از صفر آغاز میشود، مگر آنکه از پارامترهای موضعی استفاده شود؛ در این صورت، اندیسگذاری به صورت پیشفرض از 1 آغاز میشود. اگر offset برابر با 0 باشد و از پارامترهای موضعی استفاده شود، $0 به ابتدای فهرست افزوده میشود.
- ${!prefix*}
- ${!prefix@}
- نامهای منطبق با پیشوند. به نام متغیرهایی بسط مییابد که نامشان با prefix شروع میشود، و با اولین نویسهٔ متغیر ویژهٔ IFS از یکدیگر جدا میشوند. هنگامی که از @ استفاده میشود و بسط درون علامت دابل کوت (نقلقول دوگانه) قرار میگیرد، هر نام متغیر به یک کلمهٔ جداگانه بسط مییابد.
- ${!name[@]}
- ${!name[*]}
- فهرست کلیدهای آرایه. اگر name یک متغیر آرایه باشد، به فهرستی از اندیسهای آرایه (کلیدها) که در name مقداردهی شدهاند بسط مییابد. اگر name آرایه نباشد، چنانچه name مقداردهی شده باشد به 0 و در غیر این صورت به تهی (null) بسط مییابد. هنگامی که از @ استفاده میشود و بسط درون علامت دابل کوت قرار میگیرد، هر کلید به یک کلمهٔ مجزا بسط مییابد.
- ${#parameter}
- طول پارامتر. طول مقدار بسطیافتهٔ parameter را بر حسب نویسهها جایگزین میکند. اگر parameter برابر * یا @ باشد، مقدار جایگزینشده برابر با تعداد پارامترهای مکانی خواهد بود. اگر parameter نام یک آرایه باشد که اندیس آن * یا @ تعیین شده باشد، مقدار جایگزینشده برابر با تعداد اعضای آرایه خواهد بود. اگر parameter نام یک آرایهٔ نمایهدار باشد که اندیس آن عددی منفی باشد، آن عدد نسبت به یک واحد بیشتر از بیشترین اندیس parameter تفسیر میشود، بنابراین اندیسهای منفی از انتهای آرایه به سمت عقب شمارش میشوند، و اندیس -1 به آخرین عنصر اشاره دارد.
- ${parameter#word}
- ${parameter##word}
- حذف الگوی پیشوند منطبق. عبارت word همانند بسط نام مسیر بسط مییابد تا الگویی تولید کند، و با استفاده از قواعد شرحدادهشده در بخش تطبیق الگو (Pattern Matching) در زیر، با مقدار بسطیافتهٔ parameter تطبیق داده میشود. اگر الگو با ابتدای مقدار parameter منطبق شود، نتیجهٔ بسط همان مقدار بسطیافتهٔ parameter خواهد بود با این تفاوت که کوتاهترین الگوی منطبق (حالت “#” ) یا بلندترین الگوی منطبق (حالت “##” ) از ابتدای آن حذف میشود. اگر parameter برابر @ یا * باشد، عملیات حذف الگو به نوبت بر روی هر یک از پارامترهای مکانی اعمال میشود، و بسط حاصل، فهرست بهدستآمده خواهد بود. اگر parameter یک متغیر آرایه با اندیس @ یا * باشد، عملیات حذف الگو به نوبت بر روی هر عضو آرایه اعمال میشود، و بسط حاصل، فهرست بهدستآمده خواهد بود.
- ${parameter%word}
- ${parameter%%word}
- حذف الگوی پسوند منطبق. عبارت word برای تولید یک الگو درست مانند بسط نام مسیر بسط مییابد، و بر اساس قواعد شرح دادهشده ذیل تطبیق الگو (Pattern Matching) در ادامه، با مقدار بسطیافته parameter تطبیق داده میشود. اگر الگو با بخش انتهایی مقدار بسطیافته parameter منطبق شود، نتیجه این بسط برابر با مقدار بسطیافته parameter با حذف کوتاهترین الگوی منطبق (حالت “%” ) یا بلندترین الگوی منطبق (حالت “%%” ) خواهد بود. اگر parameter برابر با @ یا * باشد، عملیات حذف الگو به نوبت بر روی هر یک از پارامترهای مکانی اعمال میشود و بسط حاصل، فهرست بهدستآمده خواهد بود. اگر parameter یک متغیر آرایهای اندیسگذاریشده با @ یا * باشد، عملیات حذف الگو به نوبت بر روی هر یک از اعضای آرایه اعمال میشود و بسط حاصل، فهرست بهدستآمده خواهد بود.
- ${parameter/pattern/string}
- ${parameter//pattern/string}
- ${parameter/#pattern/string}
- ${parameter/%pattern/string}
- جایگزینی الگو. عبارت pattern برای ایجاد یک الگو بسط مییابد و همانطور که در بخش تطبیق الگو (Pattern Matching) در ادامه شرح داده شده است، با مقدار بسطیافته parameter مطابقت داده میشود. طولانیترین تطابق pattern در مقدار بسطیافته با string جایگزین میشود. روی string بسط مدک (tilde expansion)، بسط متغیر و پارامتر، بسط حسابی، جایگزینی دستور و فرایند، و حذف نقلقول انجام میشود.
- در اولین شکل بالا، تنها اولین تطابق جایگزین میشود. اگر دو اسلش جداکننده parameter و pattern باشند (شکل دوم در بالا)، تمام تطابقهای pattern با string جایگزین میشوند. اگر قبل از pattern علامت # بیاید (شکل سوم در بالا)، الگو باید در ابتدای مقدار بسطیافته parameter مطابقت داشته باشد. اگر قبل از pattern علامت % بیاید (شکل چهارم در بالا)، الگو باید در انتهای مقدار بسطیافته parameter مطابقت داشته باشد.
- اگر بسط string تهی (null) باشد، تطابقهای pattern حذف میشوند و ممکن است علامت / بعد از pattern حذف شود.
- اگر گزینه پوسته patsub_replacement با استفاده از shopt فعال شده باشد، هر نمونه بدون نقلقول از & در string با بخش منطبقشده pattern جایگزین میشود.
- قرار دادن هر بخشی از string در نقلقول مانع از جایگزینی در بسط بخش نقلقولشده میشود، از جمله رشتههای جایگزینی که در متغیرهای پوسته ذخیره شدهاند. کاراکتر بکاسلش از & در string گریز (escape) ایجاد میکند؛ بکاسلش حذف میشود تا امکان درج نویسه & بهصورت لفظی (literal) در رشته جایگزین فراهم شود. همچنین میتوان از بکاسلش برای گریز دادن خود بکاسلش استفاده کرد؛ عبارت \\ منجر به ایجاد یک بکاسلش لفظی در جایگزینی میشود. در صورتی که string داخل جفت نقلقول دوگانه (double quotes) قرار گرفته باشد، کاربران باید مراقب تداخلهای ناخواسته بین بکاسلش و جفت نقلقول باشند، زیرا بکاسلش درون جفت نقلقول معنای ویژهای دارد. جایگزینی الگو، بررسی برای & بدون نقلقول را پس از بسط دادن string انجام میدهد؛ برنامهنویسان پوسته باید هر رخداد & را که میخواهند بهصورت لفظی در جایگزینی لحاظ شود در نقلقول قرار دهند و اطمینان حاصل کنند که هر نمونه از & که قصد جایگزینی آن را دارند بدون نقلقول باشد.
- همانند عملگرهای حذف الگو، قرار دادن رشته جایگزین درون جفت نقلقول دوگانه کاراکترهای بسطیافته را نقلقول میکند، در حالی که قرار دادن کل عبارت جایگزینی پارامتر درون جفت نقلقول چنین اثری ندارد، زیرا بسط در زمینهای انجام میشود که جفت نقلقول احاطهکننده را در نظر نمیگیرد.
- اگر گزینه پوسته nocasematch فعال باشد، تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف الفبا انجام میشود.
- اگر parameter برابر با @ یا * باشد، عملیات جایگزینی به نوبت بر روی هر یک از پارامترهای مکانی اعمال میشود و بسط حاصل، فهرست بهدستآمده خواهد بود. اگر parameter یک متغیر آرایهای اندیسگذاریشده با @ یا * باشد، عملیات جایگزینی به نوبت بر روی هر یک از اعضای آرایه اعمال میشود و بسط حاصل، فهرست بهدستآمده خواهد بود.
- ${parameter^pattern}
- ${parameter^^pattern}
- ${parameter,pattern}
- ${parameter,,pattern}
- تغییر بزرگی و کوچکی حروف (Case modification). این بسط بزرگی و کوچکی حروف الفبایی موجود در parameter را تغییر میدهد. ابتدا، pattern همانطور که در زیر در بخش تطبیق الگو (Pattern Matching) شرح داده شده است، بسط مییابد تا یک الگو تولید کند. سپس Bash نویسههای موجود در مقدار بسطیافتهٔ parameter را در برابر pattern همانگونه که در زیر آمده بررسی میکند. اگر نویسهای با الگو تطابق داشته باشد، بزرگی/کوچکی آن تبدیل میشود. الگو نباید برای تطبیق بیش از یک نویسه تلاش کند.
- استفاده از “^” حروف کوچکِ منطبق با pattern را به حروف بزرگ تبدیل میکند؛ “,” حروف بزرگِ منطبق را به حروف کوچک تبدیل میکند. انواع ^ و , نخستین نویسه در مقدار بسطیافته را بررسی کرده و در صورت تطابق با pattern، بزرگی/کوچکی آن را تبدیل میکنند؛ انواع ^^ و ,, تمامی نویسهها را در مقدار بسطیافته بررسی کرده و هر کدام را که با pattern مطابقت داشته باشد تبدیل میکنند. اگر pattern حذف شود، مانند ? با آن رفتار میشود که با هر نویسهای تطابق دارد.
- اگر parameter برابر با @ یا * باشد، عملیات تغییر بزرگی/کوچکی حروف به نوبت روی هر پارامتر مکانی اعمال میشود و بسط، فهرست حاصل خواهد بود. اگر parameter یک متغیر آرایهای با اندیس @ یا * باشد، عملیات تغییر بزرگی/کوچکی حروف به نوبت روی هر عضو از آرایه اعمال میشود و بسط، فهرست حاصل خواهد بود.
- ${parameter@operator}
- تبدیل پارامتر (Parameter transformation). بسط یا تبدیلی از مقدار parameter است یا اطلاعاتی دربارهٔ خود parameter، بسته به مقدار operator. هر operator یک تکحرف است:
- U
- بسط رشتهای است که مقدار parameter است بهطوریکه حروف الفبایی کوچک آن به حروف بزرگ تبدیل شدهاند.
- u
- بسط رشتهای است که مقدار parameter است بهطوریکه نخستین نویسهٔ آن در صورت الفبایی بودن به حروف بزرگ تبدیل شده است.
- L
- بسط رشتهای است که مقدار parameter است بهطوریکه حروف الفبایی بزرگ آن به حروف کوچک تبدیل شدهاند.
- Q
- بسط رشتهای است که مقدار parameter نقلقولشده در قالبی است که میتواند مجدداً بهعنوان ورودی استفاده شود.
- E
- بسط رشتهای است که مقدار parameter است بهطوریکه توالیهای گریز بکاسلش در آن مانند سازوکار نقلقول $'...' بسط یافتهاند.
- P
- بسط رشتهای است که نتیجهٔ بسط مقدار parameter است بهگونهای که گویی یک رشتهٔ خط اعلان است (بخش خط اعلان (PROMPTING) را در زیر ببینید).
- A
- بسط رشتهای در قالب یک عبارت انتساب یا دستور declare است که در صورت ارزیابی، parameter را به همراه ویژگیها و مقدار آن مجدداً بازتولید میکند.
- K
- نسخهای احتمالاً نقلقولشده از مقدار parameter را تولید میکند، با این تفاوت که مقادیر آرایههای نمایهشده و انجمنی را به صورت دنبالهای از جفتهای کلید-مقدار نقلقولشده چاپ میکند (بخش آرایهها (Arrays) در بالا را ببینید). کلیدها و مقادیر در قالبی نقلقول میشوند که بتوان دوباره به عنوان ورودی از آنها استفاده کرد.
- a
- این بسط رشتهای متشکل از مقادیر فلگ است که ویژگیهای parameter را نشان میدهند.
- k
- مانند تبدیل K عمل میکند، اما کلیدها و مقادیر آرایههای نمایهشده و انجمنی را پس از تفکیک کلمات به کلمات جداگانه بسط میدهد.
اگر parameter برابر با @ یا * باشد، این عملیات به نوبت روی هر پارامتر مکانی اعمال میشود و بسط، فهرست حاصل خواهد بود. اگر parameter یک متغیر آرایهای با زیرنویس @ یا * باشد، این عملیات به نوبت روی هر عضو آرایه اعمال میشود و بسط، فهرست حاصل خواهد بود.
نتیجه این بسط مشمول تفکیک کلمات و بسط مسیر، همانطور که در زیر شرح داده شده است، میشود.
جایگزینی دستور (Command Substitution)
جایگزینی دستور اجازه میدهد خروجی یک دستور جایگزین خود دستور شود. دو قالب استاندارد وجود دارد:
$(command)
Bash این بسط را با اجرای command در یک محیط زیرپوسته (subshell) و جایگزین کردن جایگزینی دستور با خروجی استاندارد دستور، همراه با حذف خطوط جدید انتهایی انجام میدهد. خطوط جدید تعبیهشده در میان متن حذف نمیشوند، اما ممکن است هنگام تفکیک کلمات برداشته شوند. جایگزینی دستور $(cat file) میتواند با قالب معادل اما سریعتر $(< file) جایگزین شود.
در شیوه قدیمی جایگزینی با بکتیک، بکاسلش معنای تحتاللفظی خود را حفظ میکند مگر زمانی که پس از آن $، `، یا \ بیاید. اولین بکتیکی که قبل از آن بکاسلش نیامده باشد، جایگزینی دستور را خاتمه میدهد. هنگام استفاده از قالب $(command)، تمام نویسههای بین پرانتزها دستور را تشکیل میدهند؛ با هیچکدام رفتار خاصی صورت نمیگیرد.
یک شکل جایگزین دیگر برای جایگزینی دستور وجود دارد:
${c command;}
که command را در محیط اجرای فعلی اجرا کرده و خروجی آن را میگیرد؛ در اینجا نیز خطوط جدید انتهایی حذف میشوند.
نویسه c پس از آکولاد باز باید یک فاصله، تب، خط جدید، یا | باشد، و آکولاد بسته باید در موقعیتی قرار گیرد که یک کلمه رزرو شده میتواند ظاهر شود (یعنی قبل از آن یک پایاندهنده دستور مانند سمیکالن آمده باشد). Bash اجازه میدهد آکولاد بسته به نویسههای باقیمانده در کلمه متصل شود بدون آنکه لازم باشد پس از آن یک فرا-نویسه پوسته بیاید، برخلاف آنچه معمولاً برای کلمات رزرو شده الزامی است.
هرگونه اثرات جانبی command بلافاصله در محیط اجرای فعلی اعمال میشود و پس از اتمام دستور نیز در محیط فعلی باقی میماند (به عنوان مثال، دستور توکار exit از پوسته خارج میشود).
این نوع از جایگزینی دستور در ظاهر شبیه به اجرای یک تابع بینام پوسته است: متغیرهای محلی همانند زمان اجرای یک تابع پوسته ایجاد میشوند، و دستور توکار return command را وادار به پایان یافتن میکند؛ با این حال، بقیه محیط اجرا، از جمله پارامترهای مکانی، با فراخواننده به اشتراک گذاشته میشود.
اگر اولین نویسه پس از آک getUserآکولاد باز یک | باشد، این ساختار پس از اجرای command به مقدار متغیر پوسته REPLY بسط مییابد، بدون اینکه خطهای جدید پایانی حذف شوند، و خروجی استاندارد command همانند پوسته فراخواننده باقی میماند. Bash هنگام اجرای command، متغیر REPLY را به عنوان یک متغیر محلی که در ابتدا مقداردهینشده است ایجاد میکند، و پس از اتمام command، REPLY را به مقداری که قبل از جایگزینی دستور داشت بازمیگرداند، همانند هر متغیر محلی دیگر.
جایگزینیهای دستور ممکن است تو در تو باشند. برای تو در تو کردن هنگام استفاده از قالب بکتیک (backquote)، بکتیکهای داخلی را با بکاسلش گریزدهی (escape) کنید.
اگر جایگزینی درون جفتکوتیشن (double quotes) ظاهر شود، bash تفکیک کلمات و بسط نام مسیر را روی نتایج اعمال نمیکند.
بسط حسابی (Arithmetic Expansion)
بسط حسابی یک عبارت حسابی را ارزیابی کرده و نتیجه را جایگزین میکند. قالب بسط حسابی به این صورت است:
$((expression))
عبارت expression دستخوش همان بسطهایی میشود که گویی درون جفتکوتیشن قرار داشته است، اما نویسههای جفتکوتیشن گریزدهینشده در expression به صورت خاص در نظر گرفته نمیشوند و حذف میگردند. تمام توکنهای موجود در عبارت تحت بسط پارامتر و متغیر، جایگزینی دستور، و حذف کوتیشن قرار میگیرند. نتیجه به عنوان عبارت حسابی برای ارزیابی در نظر گرفته میشود. از آنجا که نحوه مدیریت جفتکوتیشنها توسط Bash میتواند به رشتههای خالی منجر شود، بسط حسابی با آنها به عنوان عباراتی که حاصل ارزیابیشان ۰ است رفتار میکند. بسطهای حسابی میتوانند تو در تو باشند.
ارزیابی بر اساس قواعد ذکر شده در زیر بخش ارزیابی حسابی (ARITHMETIC EVALUATION) انجام میشود. اگر expression نامعتبر باشد، bash پیامی مبنی بر شکست در خروجی خطای استاندارد چاپ میکند، جایگزینی را انجام نمیدهد، و دستور مرتبط با بسط را اجرا نمیکند.
جایگزینی فرآیند (Process Substitution)
جایگزینی فرآیند اجازه میدهد تا با استفاده از نام یک فایل، به ورودی یا خروجی یک فرآیند ارجاع داده شود. این ساختار به شکل <(list) یا >(list) است. فرآیند list به صورت ناهمگام اجرا میشود، و ورودی یا خروجی آن به صورت نام یک فایل ظاهر میگردد. این نام فایل به عنوان نتیجه بسط، به عنوان یک آرگومان به دستور جاری پاس داده میشود.
اگر از قالب >(list) استفاده شود، نوشتن در فایل ورودیِ list را فراهم میکند. اگر از قالب <(list) استفاده شود، خواندن فایل خروجی list را به دست میآورد. هیچ فاصلهای نباید بین < یا > و پرانتز چپ وجود داشته باشد، در غیر این صورت این ساختار به عنوان یک تغییر مسیر تفسیر خواهد شد.
جایگزینی فرآیند در سیستمهایی که از لولههای نامگذاریشده (FIFOs) یا روش /dev/fd برای نامگذاری فایلهای باز پشتیبانی میکنند، پشتیبانی میشود.
در صورت وجود، جایگزینی فرآیند به صورت همزمان با بسط پارامتر و متغیر، جایگزینی دستور، و بسط حسابی انجام میشود.
تفکیک کلمات (Word Splitting)
پوسته نتایجِ بسط پارامتر، جایگزینی دستور، و بسط حسابی را که درون جفتکوتیشن رخ ندادهاند، برای تفکیک کلمات بررسی میکند. کلماتی که بسط داده نشدهاند، تفکیک نمیشوند.
پوسته با هر نویسه از IFS بهعنوان یک جداکننده رفتار میکند، و نتایج سایر بسطها را با استفاده از این نویسهها بهعنوان پایاندهندههای فیلد، به کلمات تقسیم میکند.
یک نویسه فاصلهسفید IFS نویسه فاصلهسفیدی است همانطور که در بالا تعریف شد (بخش تعاریف را ببینید) که در مقدار IFS ظاهر میشود. فاصله (Space)، تب (Tab)، و خط جدید (Newline) همواره بهعنوان فاصلهسفید IFS در نظر گرفته میشوند، حتی اگر در دستهبندی space در محلیسازی (locale) وجود نداشته باشند.
اگر IFS تنظیم نشده باشد، تفکیک فیلد طوری عمل میکند که گویی مقدار آن <space><tab><newline> است، و با این نویسهها بهعنوان فاصلهسفید IFS رفتار میکند. اگر مقدار IFS تهی (null) باشد، هیچ تفکیک کلمهای رخ نمیدهد، اما شناسههای تهی ضمنی (به زیر مراجعه کنید) همچنان حذف میشوند.
تفکیک کلمات با حذف توالی نویسههای فاصلهسفید IFS از ابتدا و انتهای نتایج بسطهای قبلی آغاز میشود، سپس کلمات باقیمانده را تفکیک میکند.
اگر مقدار IFS تنها شامل فاصلهسفید IFS باشد، هر توالی از نویسههای فاصلهسفید IFS یک فیلد را جدا میسازد، بنابراین یک فیلد شامل نویسههایی است که فاصلهسفید IFS بدون نقلقول نیستند، و فیلدهای تهی تنها از نقلقول حاصل میشوند.
اگر IFS شامل نویسهای غیر از فاصلهسفید باشد، در این صورت هر نویسهای در مقدار IFS که فاصلهسفید IFS نیست، به همراه هر نویسه فاصلهسفید IFS مجاور، یک فیلد را مرزبندی میکند. این بدان معناست که جداکنندههای مجاور غیر فاصلهسفید IFS یک فیلد تهی ایجاد میکنند. توالی از نویسههای فاصلهسفید IFS نیز یک فیلد را مرزبندی میکند.
شناسههای تهی صریح ("" یا '') حفظ میشوند و بهعنوان رشتههای خالی به دستورات ارسال میشوند. شناسههای تهی ضمنی بدون نقلقول، حاصل از بسط پارامترهایی که مقداری ندارند، حذف میشوند. بسط یک پارامتر بدون مقدار درون نقلقول دوتایی (double quotes) یک فیلد تهی ایجاد میکند، که حفظ شده و بهعنوان یک رشته خالی به دستور ارسال میگردد.
هنگامی که یک شناسه تهی نقلقولشده بهعنوان بخشی از یک کلمه ظاهر میشود که بسط آن غیر تهی است، تفکیک کلمه بخش شناسه تهی را حذف میکند، و بسط غیر تهی را باقی میگذارد. یعنی، کلمه “-d''” پس از تفکیک کلمات و حذف شناسه تهی، به “-d” تبدیل میشود.
بسط نام مسیر (Pathname Expansion)
پس از تفکیک کلمات، مگر اینکه گزینه -f تنظیم شده باشد، bash هر کلمه را برای یافتن نویسههای *، ؟، و [ پویش میکند. اگر یکی از این نویسهها ظاهر شود و داخل نقلقول نباشد، کلمه بهعنوان یک الگو(pattern) در نظر گرفته میشود، و با فهرستی مرتبشده از نام فایلهای منطبق با الگو جایگزین میگردد (بخش تطبیق الگو در زیر را ببینید) که وابسته به مقدار متغیر پوسته GLOBSORT است.
اگر هیچ نام فایل منطبقی پیدا نشود، و گزینه پوسته nullglob فعال نباشد، کلمه بدون تغییر باقی میماند. اگر گزینه nullglob تنظیم شده باشد و هیچ انطباقی یافت نشود، کلمه حذف میشود. اگر گزینه پوسته failglob تنظیم شده باشد و هیچ انطباقی پیدا نشود، bash یک پیام خطا چاپ کرده و دستور را اجرا نمیکند. اگر گزینه پوسته nocaseglob فعال باشد، تطبیق بدون توجه به کوچک و بزرگی حروف الفبا انجام میشود.
هنگامی که از یک الگو برای بسط نام مسیر استفاده میشود، نویسه “.” در ابتدای یک نام یا بلافاصله پس از یک اسلش باید بهطور صریح مطابقت داده شود، مگر اینکه گزینه پوسته dotglob تنظیم شده باشد. به منظور تطابق نام فایلهای . و ..، الگو باید با “.” شروع شود (برای مثال، “.?”)، حتی اگر dotglob تنظیم شده باشد. اگر گزینه پوسته globskipdots فعال باشد، نام فایلهای . و .. هرگز مطابقت داده نمیشوند، حتی اگر الگو با یک “.” آغاز شود. هنگامی که نامهای مسیر تطبیق داده نمیشوند، با نویسه “.” بهطور ویژه رفتار نمیشود.
هنگام تطبیق نام مسیر، نویسه اسلش همیشه باید بهطور صریح با یک اسلش در الگو مطابقت داده شود، اما در سایر زمینههای تطبیق میتوان آن را با یک نویسه الگوی ویژه همانطور که در زیر در تطبیق الگو (Pattern Matching) شرح داده شده است، مطابقت داد.
توضیحات مربوط به shopt را در زیر بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) برای شرحی از گزینههای پوسته nocaseglob، nullglob، globskipdots، failglob و dotglob ببینید.
متغیر پوسته GLOBIGNORE ممکن است برای محدود کردن مجموعه نام فایلهای مطابق با یک pattern بهکار رود. اگر GLOBIGNORE تنظیم شده باشد، هر نام فایل منطبقی که همچنین با یکی از الگوهای موجود در GLOBIGNORE مطابقت داشته باشد، از فهرست موارد منطبق حذف میشود. اگر گزینه nocaseglob تنظیم شده باشد، تطبیق در برابر الگوهای موجود در GLOBIGNORE بدون در نظر گرفتن بزرگی و کوچکی حروف انجام میشود. نام فایلهای . و .. همیشه نادیده گرفته میشوند، زمانی که GLOBIGNORE تنظیم شده و تهی نباشد. با این حال، تنظیم GLOBIGNORE روی یک مقدار غیر تهی این اثر را دارد که گزینه پوسته dotglob را فعال میکند، بنابراین تمام نام فایلهای دیگر که با یک “.” شروع میشوند، تطبیق داده خواهند شد. برای به دست آوردن رفتار قدیمی در نادیده گرفتن نام فایلهایی که با “.” شروع میشوند، “.*” را یکی از الگوهای موجود در GLOBIGNORE قرار دهید. گزینه dotglob هنگامی که GLOBIGNORE لغو تنظیم (unset) شود، غیرفعال میگردد. تطبیق الگوی GLOBIGNORE تنظیمات گزینه پوسته extglob را محترم میشمارد.
مقدار متغیر پوستهٔ GLOBSORT چگونگی مرتبسازی نتایج بسط مسیر را کنترل میکند، همانطور که در بالا ذیل متغیرهای پوسته (Shell Variables) شرح داده شد.
تطبیق الگو (Pattern Matching)
هر نویسهای که در یک الگو ظاهر شود، غیر از نویسههای ویژهٔ الگو که در زیر شرح داده شدهاند، با خودش تطبیق مییابد. نویسهٔ NUL نباید در یک الگو قرار گیرد. یک بکاسلش (backslash) نویسهٔ پس از خود را گریزدهی (escape) میکند؛ بکاسلشِ گریزدهنده هنگام تطبیق کنار گذاشته میشود. نویسههای ویژهٔ الگو در صورتی که قرار است بهطور لغوی (عینی) تطبیق داده شوند، باید نقلقول گردند.
نویسههای ویژهٔ الگو دارای معانی زیر هستند:
- *
- با هر رشتهای، از جمله رشتهٔ تهی، تطبیق مییابد. هنگامی که گزینهٔ پوستهٔ globstar فعال باشد، و * در بافتار بسط مسیر استفاده شود، دو * مجاور هم که به عنوان یک الگوی واحد به کار رفتهاند، با تمام فایلها و صفر یا چند دایرکتوری و زیردایرکتوری تطبیق مییابند. اگر پس از آن یک / بیاید، دو * مجاور هم تنها با دایرکتوریها و زیردایرکتوریها تطبیق مییابند.
- ?
- با هر تکنویسهای تطبیق مییابد.
- [...]
- با هر یک از نویسههای محصور میان قلابها (brackets) تطبیق مییابد. این عبارت به عنوان یک bracket expression (عبارت قلاب) شناخته میشود و با یک تکنویسه تطبیق مییابد. یک جفت نویسه که با یک خط پیوند (hyphen) از هم جدا شدهاند، نشاندهندهٔ یک range expression (عبارت بازه) هستند؛ هر نویسهای که با استفاده از ترتیب تطبیق (collating sequence) و مجموعه نویسههای لوکال فعلی، بین آن دو نویسه (شامل خود آنها) قرار گیرد، تطبیق مییابد. اگر اولین نویسه پس از [ یک ! یا یک ^ باشد، آنگاه هر نویسهای که درون بازه قرار ندارد تطبیق مییابد. برای تطبیق نویسهٔ -، آن را به عنوان اولین یا آخرین نویسه در مجموعه قرار دهید. برای تطبیق نویسهٔ ]، آن را به عنوان اولین نویسه در مجموعه قرار دهید.
- ترتیب مرتبسازی نویسهها در عبارات بازه، و نویسههای موجود در بازه، توسط لوکال فعلی و در صورت تنظیم بودن، مقادیر متغیرهای پوستهٔ LC_COLLATE یا LC_ALL تعیین میشوند. برای به دست آوردن تفسیر سنتی از عبارات بازه، که در آن [a-d] معادل [abcd] است، مقدار متغیرهای پوستهٔ LC_COLLATE یا LC_ALL را برابر با C قرار دهید، یا گزینهٔ پوستهٔ globasciiranges را فعال کنید.
- درون یک عبارت قلاب، کلاسهای نویسه (character classes) میتوانند با استفاده از نحو [:class:] مشخص شوند، که در آن class یکی از کلاسهای زیر است که در استاندارد POSIX تعریف شدهاند:
- یک کلاس نویسه با هر نویسهای که متعلق به آن کلاس باشد تطبیق مییابد. کلاس نویسهٔ word با حروف، ارقام، و نویسهٔ _ تطبیق مییابد.
- درون یک عبارت قلاب، یک کلاس همارزی (equivalence class) میتواند با استفاده از نحو [=c=] مشخص شود، که با تمام نویسههایی که وزن ترتیبی یکسان (همانطور که توسط لوکال فعلی تعریف شده) با نویسهٔ c دارند، تطبیق مییابد.
- درون یک عبارت قلاب، نحو [.symbol.] با نماد ترتیبی symbol تطبیق مییابد.
اگر گزینهٔ پوستهٔ extglob با استفاده از دستور توکار shopt فعال شده باشد، پوسته چندین عملگر تطبیق الگوی گسترشیافته را شناسایی میکند. در توضیحات زیر، یک pattern-list فهرستی از یک یا چند الگو است که با | از هم جدا شدهاند. الگوهای ترکیبی ممکن است با استفاده از یک یا چند زیرالگوی زیر تشکیل شوند:
- ?(pattern-list)
- با صفر یا یک بار وقوع الگوهای دادهشده تطبیق مییابد.
- *(pattern-list)
- با صفر یا چند بار وقوع الگوهای دادهشده تطبیق مییابد.
- +(pattern-list)
- با یک یا چند بار وقوع الگوهای دادهشده تطبیق مییابد.
- @(pattern-list)
- دقیقاً با یکی از الگوهای دادهشده تطبیق مییابد.
- !(pattern-list)
- با هر چیزی به جز یکی از الگوهای دادهشده تطبیق مییابد.
گزینهٔ extglob رفتار تجزیهکننده (parser) را تغییر میدهد، زیرا پرانتزها معمولاً به عنوان عملگرهایی با مفهوم نحوی در نظر گرفته میشوند. برای اطمینان از اینکه الگوهای تطبیق گسترشیافته به درستی تجزیه میشوند، مطمئن شوید که extglob پیش از تجزیهٔ ساختارهای حاوی الگوها، از جمله توابع پوسته و جایگزینیهای دستور، فعال شده باشد.
هنگام تطبیق نام فایلها، گزینهٔ پوستهٔ dotglob مجموعهٔ نام فایلهایی را که بررسی میشوند تعیین میکند: هنگامی که dotglob فعال است، مجموعهٔ نام فایلها شامل تمام فایلهایی است که با “.” شروع میشوند، اما . و .. باید توسط یک الگو یا زیرالگو که با نقطه شروع میشود تطبیق داده شوند؛ هنگامی که غیرفعال است، این مجموعه شامل هیچ نام فایلی که با “.” شروع شود نخواهد بود، مگر اینکه الگو یا زیرالگو با یک “.” شروع شود. اگر گزینهٔ پوستهٔ globskipdots فعال باشد، نام فایلهای . و .. هرگز در این مجموعه ظاهر نمیشوند. همانند بالا، “.” تنها هنگام تطبیق نام فایلها معنای خاصی دارد.
تطبیق الگوی گسترشیافتهٔ پیچیده در برابر رشتههای طولانی کند است، بهویژه زمانی که الگوها حاوی تناوبها (alternations) باشند و رشتهها شامل چندین تطبیق باشند. استفاده از تطبیقهای جداگانه در برابر رشتههای کوتاهتر، یا استفاده از آرایههایی از رشتهها به جای یک رشتهٔ طولانی منفرد، ممکن است سریعتر باشد.
حذف نقلقول (Quote Removal)
پس از بسطهای قبلی، تمام موارد نقلقولنشده از نویسههای \، '، و " که ناشی از یکی از بسطهای بالا نبودهاند، حذف میشوند.
تغییر مسیر (REDIRECTION)
پیش از اجرای یک دستور، ورودی و خروجی آن ممکن است با استفاده از نشانهگذاری ویژهای که توسط پوسته تفسیر میشود، تغییر مسیر داده شوند. تغییر مسیر اجازه میدهد تا توصیفکنندههای فایل (file handles) دستورات تکثیر شوند، باز شوند، بسته شوند، به فایلهای متفاوتی ارجاع داده شوند، و میتواند فایلهایی را که دستور از آنها میخواند و در آنها مینویسد تغییر دهد. هنگامی که همراه با دستور توکار exec استفاده شود، تغییر مسیرها توصیفکنندههای فایل را در محیط اجرای فعلی پوسته تغییر میدهند. عملگرهای تغییر مسیر زیر ممکن است قبل از یک دستور ساده یا در هر جای آن ظاهر شوند، یا ممکن است پس از یک دستور بیایند. تغییر مسیرها به ترتیبی که ظاهر میشوند، از چپ به راست پردازش میشوند.
هر تغییر مسیری که ممکن است یک شمارهٔ توصیفکنندهٔ فایل پیش از آن بیاید، میتواند در عوض با کلمهای به شکل {varname} همراه شود. در این حالت، برای هر عملگر تغییر مسیر به جز >&- و <&-، پوسته یک توصیفکنندهٔ فایل بزرگتر یا مساوی ۱۰ اختصاص میدهد و آن را به varname منتسب میکند. اگر {varname} پیش از >&- یا <&- بیاید، مقدار varname توصیفکنندهٔ فایلی را که باید بسته شود مشخص میکند. اگر {varname} ارائه شود، تغییر مسیر فراتر از حوزهٔ دستور باقی میماند، که به برنامهنویس پوسته اجازه میدهد تا طول عمر توصیفکنندهٔ فایل را به صورت دستی و بدون استفاده از دستور توکار exec مدیریت کند. گزینهٔ پوستهٔ varredir_close این رفتار را مدیریت میکند.
در توضیحات زیر، اگر شماره توصیفکننده فایل (file descriptor) حذف شود و اولین نویسه از عملگر تغییر مسیر “<” باشد، تغییر مسیر به ورودی استاندارد (توصیفکننده فایل 0) اشاره دارد. اگر اولین نویسه از عملگر تغییر مسیر “>” باشد، تغییر مسیر به خروجی استاندارد (توصیفکننده فایل 1) اشاره دارد.
عبارت word پس از عملگر تغییر مسیر در توضیحات زیر، مگر در مواردی که خلاف آن ذکر شده باشد، مشمول بسط آکولاد (brace expansion)، بسط تیلدا (tilde expansion)، بسط پارامتر و متغیر (parameter and variable expansion)، جایگزینی دستور (command substitution)، بسط حسابی (arithmetic expansion)، حذف نقلقول (quote removal)، بسط مسیر (pathname expansion) و تفکیک کلمات (word splitting) میشود. اگر به بیش از یک کلمه بسط یابد، bash یک خطا گزارش میدهد.
ترتیب تغییر مسیرها اهمیت دارد. به عنوان مثال، دستور
ls > dirlist 2>&1
هم خروجی استاندارد و هم خطای استاندارد را به فایل dirlist هدایت میکند، در حالی که دستور
ls 2>&1 > dirlist
تنها خروجی استاندارد را به فایل dirlist هدایت میکند، زیرا خطای استاندارد قبل از اینکه خروجی استاندارد به dirlist تغییر مسیر داده شود، به خروجی استاندارد هدایت شده بود.
پوسته Bash هنگام استفاده از چندین نام فایل در تغییر مسیرها، همانطور که در جدول زیر آمده است، با آنها به طور ویژهای رفتار میکند. اگر سیستمعاملی که bash روی آن اجرا میشود این فایلهای ویژه را فراهم کند، bash از آنها استفاده میکند؛ در غیر این صورت، آنها را به صورت داخلی با رفتاری که در زیر شرح داده شده، شبیهسازی میکند.
- /dev/fd/fd
- اگر fd یک عدد صحیح معتبر باشد، توصیفکننده فایل fd تکثیر میشود.
- /dev/stdin
- توصیفکننده فایل 0 تکثیر میشود.
- /dev/stdout
- توصیفکننده فایل 1 تکثیر میشود.
- /dev/stderr
- توصیفکننده فایل 2 تکثیر میشود.
- /dev/tcp/host/port
- اگر host یک نام میزبان یا نشانی اینترنتی معتبر باشد و port یک شماره پورت صحیح یا نام سرویس باشد، bash تلاش میکند تا سوکت TCP مربوطه را باز کند.
- /dev/udp/host/port
- اگر host یک نام میزبان یا نشانی اینترنتی معتبر باشد و port یک شماره پورت صحیح یا نام سرویس باشد، bash تلاش میکند تا سوکت UDP مربوطه را باز کند.
عدم موفقیت در باز کردن یا ایجاد یک فایل موجب شکست تغییر مسیر میشود.
تغییر مسیرهایی که از توصیفکنندههای فایل بزرگتر از 9 استفاده میکنند باید با احتیاط به کار روند، چرا که ممکن است با توصیفکنندههای فایلی که پوسته به صورت داخلی استفاده میکند، تداخل داشته باشند.
تغییر مسیر ورودی (Redirecting Input)
تغییر مسیر ورودی باعث باز شدن فایلی میشود که نام آن از بسط word حاصل شده است تا برای خواندن روی توصیفکننده فایل n قرار گیرد، یا اگر n مشخص نشده باشد، روی ورودی استاندارد (توصیفکننده فایل 0) باز میشود.
قالب کلی برای تغییر مسیر ورودی به این صورت است:
[n]<word
تغییر مسیر خروجی (Redirecting Output)
تغییر مسیر خروجی، فایلی را که نام آن حاصل بسط word است برای نوشتن بر روی توصیفگر فایل n، یا خروجی استاندارد (توصیفگر فایل ۱) در صورتی که n مشخص نشده باشد، باز میکند. اگر فایل وجود نداشته باشد ایجاد میشود؛ اگر وجود داشته باشد اندازه آن به صفر تقلیل مییابد (خالی میشود).
قالب کلی برای تغییر مسیر خروجی به این صورت است:
[n]>word
اگر عملگر تغییر مسیر > باشد، و گزینه noclobber برای دستور توکار set فعال شده باشد، در صورتی که فایلی که نام آن حاصل بسط word است وجود داشته و یک فایل معمولی باشد، تغییر مسیر با شکست مواجه میشود. اگر عملگر تغییر مسیر >| باشد، یا عملگر تغییر مسیر > بوده و گزینه noclobber برای دستور توکار set فعال نباشد، bash حتی در صورت وجود فایل نامگذاریشده توسط word برای تغییر مسیر تلاش میکند.
الحاق خروجی تغییر مسیر یافته (Appending Redirected Output)
تغییر مسیر خروجی به این شیوه، فایلی را که نام آن حاصل بسط word است برای الحاق کردن (افزودن به انتها) بر روی توصیفگر فایل n، یا خروجی استاندارد (توصیفگر فایل ۱) در صورتی که n مشخص نشده باشد، باز میکند. اگر فایل وجود نداشته باشد ایجاد میشود.
قالب کلی برای الحاق خروجی به این صورت است:
[n]>>word
تغییر مسیر خروجی استاندارد و خطای استاندارد (Redirecting Standard Output and Standard Error)
این ساختار هم خروجی استاندارد (توصیفگر فایل ۱) و هم خروجی خطای استاندارد (توصیفگر فایل ۲) را به فایلی که نام آن بسطیافته word است تغییر مسیر میدهد.
دو قالب برای تغییر مسیر خروجی استاندارد و خطای استاندارد وجود دارد:
&>word
از این دو شکل، شکل اول ترجیح داده میشود. این شکل از نظر معنایی معادل با عبارت زیر است:
>word 2>&1
هنگام استفاده از شکل دوم، word نباید به یک عدد یا - بسط یابد. اگر چنین شود، به دلایل سازگاری، عملگرهای دیگر تغییر مسیر اعمال میشوند (به بخش تکثیر توصیفگرهای فایل (Duplicating File Descriptors) در زیر مراجعه کنید).
الحاق خروجی استاندارد و خطای استاندارد
این ساختار هم خروجی استاندارد (توصیفکننده فایل ۱) و هم خروجی خطای استاندارد (توصیفکننده فایل ۲) را به فایلی الحاق میکند که نام آن حاصل بسط word است.
قالب الحاق خروجی استاندارد و خطای استاندارد به شکل زیر است:
&>>word
این از نظر معنایی معادل دستور زیر است:
>>word 2>&1
(بخش تکثیر توصیفکنندههای فایل (Duplicating File Descriptors) را در زیر ببینید).
اسناد درجا (Here Documents)
این نوع تغییر مسیر به پوسته دستور میدهد تا ورودی را از منبع فعلی بخواند تا زمانی که خطی را بخواند که تنها شامل delimiter باشد (بدون فاصلههای خالی انتهایی). سپس تمام خطوط خواندهشده تا آن نقطه به ورودی استاندارد (یا توصیفکننده فایل n در صورتی که n مشخص شده باشد) برای یک دستور تبدیل میشوند.
قالب اسناد درجا (here-documents) به شکل زیر است:
[n]<<[-]word
here-document
delimiter
پوسته بسط پارامتر و متغیر، جایگزینی دستور، بسط حسابی یا بسط نام مسیر را روی word انجام نمیدهد.
اگر هر بخشی از word نقلقول شده باشد، delimiter حاصل حذف نقلقول از word خواهد بود و خطوط موجود در سند درجا بسط داده نمیشوند. اگر word بدون نقلقول باشد، delimiter خود word است و متن سند درجا مشابه یک رشته با نقلقول دوتایی رفتار میشود: تمام خطوط سند درجا مشمول بسط پارامتر، جایگزینی دستور و بسط حسابی میشوند، دنباله نویسه \<newline> به صورت تحتاللفظی رفتار میشود، و \ باید برای نقلقول کردن نویسههای \، $ و ` استفاده شود؛ با این حال، نویسههای نقلقول دوتایی معنی خاصی ندارند.
اگر عملگر تغییر مسیر <<- باشد، آنگاه پوسته تمام نویسههای تب ابتدایی را از خطوط ورودی و خط حاوی delimiter حذف میکند. این امکان به اسناد درجا درون اسکریپتهای پوسته اجازه میدهد تا به شکلی طبیعی دندانهدار شوند.
اگر جداکننده (delimiter) نقلقول نشده باشد، دنباله \<newline> به عنوان ادامهدهنده خط تلقی میشود: دو خط به یکدیگر متصل میشوند و نویسه بکاسلش-خطجدید حذف میگردد. این فرآیند هنگام خواندن سند درجا، پیش از بررسی جداکننده پایانی رخ میدهد، بنابراین خطوط متصلشده میتوانند جداکننده پایانی را تشکیل دهند.
رشتههای درجا (Here Strings)
گونهای از اسناد درجا، با قالب زیر است:
[n]<<<word
عبارت word تحت بسط تیلدا، بسط پارامتر و متغیر، جایگزینی دستور، بسط حسابی و حذف نقلقول قرار میگیرد. بسط نام مسیر و تفکیک کلمات انجام نمیشود. نتیجه به عنوان یک رشته واحد، همراه با یک خط جدید الحاق شده، به عنوان ورودی استاندارد دستور (یا توصیفکننده فایل n در صورت مشخص شدن n) ارائه میشود.
تکثیر توصیفکنندههای فایل
عملگر تغییر مسیر
[n]<&word
برای تکثیر توصیفکنندههای فایل ورودی به کار میرود. اگر word به یک یا چند رقم بسط یابد، توصیفکننده فایل n به عنوان کپی از آن توصیفکننده فایل قرار داده میشود. اگر ارقام موجود در word توصیفکننده فایلی را مشخص نکنند که برای ورودی باز شده باشد، یک خطای تغییر مسیر رخ میدهد. اگر word به - ارزیابی شود، توصیفکننده فایل n بسته میشود. اگر n مشخص نشده باشد، از ورودی استاندارد (توصیفکننده فایل 0) استفاده میشود.
عملگر
[n]>&word
مشابه قبل برای تکثیر توصیفکنندههای فایل خروجی به کار میرود. اگر n مشخص نشده باشد، از خروجی استاندارد (توصیفکننده فایل 1) استفاده میشود. اگر ارقام موجود در word توصیفکننده فایلی را مشخص نکنند که برای خروجی باز شده باشد، یک خطای تغییر مسیر رخ میدهد. اگر word به - ارزیابی شود، توصیفکننده فایل n بسته میشود. به عنوان یک حالت خاص، اگر n حذف شده باشد، و word به یک یا چند رقم یا - بسط نیابد، همانطور که پیشتر شرح داده شد، خروجی استاندارد و خطای استاندارد تغییر مسیر داده میشوند.
انتقال توصیفکنندههای فایل
عملگر تغییر مسیر
[n]<&digit-
توصیفکننده فایل digit را به توصیفکننده فایل n، یا به ورودی استاندارد (توصیفکننده فایل 0) در صورتی که n مشخص نشده باشد، منتقل میکند. digit پس از تکثیر به n بسته میشود.
مشابهاً، عملگر تغییر مسیر
[n]>&digit-
توصیفکننده فایل digit را به توصیفکننده فایل n، یا به خروجی استاندارد (توصیفکننده فایل 1) در صورتی که n مشخص نشده باشد، منتقل میکند.
باز کردن توصیفکنندههای فایل برای خواندن و نوشتن
عملگر تغییر مسیر
[n]<>word
فایلی را که نام آن بسطیافته word است، برای هر دو حالت خواندن و نوشتن روی توصیفکننده فایل n، یا روی توصیفکننده فایل 0 در صورت مشخص نبودن n باز میکند. اگر فایل وجود نداشته باشد، ایجاد میشود.
نامهای مستعار (ALIASES)
Aliases (نامهای مستعار) این امکان را فراهم میکنند که یک رشته بهجای کلمهای جایگزین شود که در موقعیتی از ورودی قرار دارد که میتواند کلمه اول یک دستور ساده باشد. نامهای مستعار دارای نامها و مقادیر متناظری هستند که با استفاده از دستورات توکار alias و unalias تنظیم و حذف میشوند (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید).
اگر پوسته یک کلمه بدون نقلقول را در موقعیت مناسب بخواند، بررسی میکند که آیا این کلمه با نام یک نام مستعار مطابقت دارد یا خیر. در صورت تطابق، پوسته کلمه را با مقدار نام مستعار جایگزین کرده، و آن مقدار را چنان میخواند که گویی به جای آن کلمه خوانده شده است. پوسته پیش از تلاش برای جایگزینی نام مستعار، به کاراکترهای پس از کلمه نگاه نمیکند.
کاراکترهای /، $، `، و = و هر یک از ابرکاراکترها (metacharacters) یا کاراکترهای نقلقول پوسته که در بالا فهرست شدهاند، نباید در نام یک نام مستعار ظاهر شوند. متن جایگزین میتواند شامل هر ورودی معتبر پوسته، از جمله ابرکاراکترهای پوسته باشد. کلمه اول متن جایگزین از نظر نامهای مستعار بررسی میشود، اما کلمهای که مشابه با نام مستعار در حال بسط باشد، برای بار دوم بسط داده نمیشود. این بدان معناست که میتوان برای نمونه ls را به ls -F مستعار کرد، و bash سعی نمیکند متن جایگزین را بهطور بازگشتی بسط دهد.
اگر آخرین کاراکتر مقدار نام مستعار یک blank (فاصله خالی) باشد، پوسته کلمه دستور بعدی را که پس از نام مستعار قرار دارد نیز برای بسط نام مستعار بررسی میکند.
نامهای مستعار با دستور alias ایجاد و فهرست میشوند، و با دستور unalias حذف میگردند.
هیچ سازوکاری برای استفاده از آرگومانها در متن جایگزین وجود ندارد. اگر به آرگومانها نیاز است، بهجای آن از یک تابع پوسته (بخش توابع (FUNCTIONS) در زیر را ببینید) استفاده کنید.
نامهای مستعار هنگامی که پوسته تعاملی نیست بسط داده نمیشوند، مگر اینکه گزینه پوسته expand_aliases با استفاده از shopt تنظیم شده باشد (توضیحات مربوط به shopt را در بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر ببینید).
قواعد مربوط به تعریف و استفاده از نامهای مستعار تا حدودی گیجکننده هستند. Bash پیش از اجرای هر یک از دستورات موجود در یک خط یا یک دستور مرکب، همواره حداقل یک خط کامل از ورودی، و تمام خطوطی که یک دستور مرکب را تشکیل میدهند را میخواند. نامهای مستعار زمانی بسط مییابند که یک دستور خوانده میشود، نه هنگامی که اجرا میشود. بنابراین، تعریف نام مستعاری که در همان خط یک دستور دیگر ظاهر میشود تا زمانی که پوسته خط بعدی ورودی را نخواند اعمال نمیشود، و تعریف نام مستعار در یک دستور مرکب نیز تا زمانی که پوسته کل دستور مرکب را تجزیه و اجرا نکند اعمال نخواهد شد. دستوراتی که پس از تعریف نام مستعار در آن خط، یا در بقیه دستور مرکب قرار دارند، تحت تأثیر نام مستعار جدید قرار نمیگیرند. این رفتار در هنگام اجرای توابع نیز مسالهساز است. نامهای مستعار هنگام خوانده شدن تعریف تابع بسط مییابند، نه هنگامی که تابع اجرا میشود، زیرا تعریف تابع خود یک دستور است. در نتیجه، نامهای مستعار تعریفشده در یک تابع تا پس از اجرای آن تابع در دسترس نخواهند بود. برای اطمینان، همواره تعریفهای نام مستعار را در یک خط جداگانه قرار دهید، و از alias در دستورات مرکب استفاده نکنید.
تقریباً برای هر هدفی، توابع پوسته نسبت به نامهای مستعار ارجحیت دارند.
توابع (FUNCTIONS)
یک تابع پوسته، که همانطور که در بالا تحت عنوان گرامر پوسته (SHELL GRAMMAR) شرح داده شد تعریف میشود، مجموعهای از دستورات را برای اجرای بعدی ذخیره میکند. هنگامی که نام یک تابع پوسته به عنوان نام یک دستور ساده استفاده میشود، پوسته فهرست دستورات مرتبط با نام آن تابع را اجرا میکند. توابع در بافتار پوسته فراخواننده اجرا میشوند؛ هیچ فرایند جدیدی برای تفسیر آنها ایجاد نمیشود (این را با اجرای یک اسکریپت پوسته مقایسه کنید).
هنگامی که یک تابع اجرا میشود، آرگومانهای ارسالی به تابع در طول اجرای آن به پارامترهای مکانی تبدیل میشوند. پارامتر ویژه # بهروزرسانی میشود تا پارامترهای مکانی جدید را منعکس کند. پارامتر ویژه 0 بدون تغییر میماند. اولین عنصر متغیر FUNCNAME در زمان اجرای تابع روی نام تابع تنظیم میشود.
تمام جنبههای دیگر محیط اجرای پوسته بین یک تابع و فراخوانندهاش یکسان است، به استثنای این موارد: تلههای DEBUG و RETURN (توضیحات مربوط به دستور توکار trap در زیر بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) را در ادامه ببینید) به ارث برده نمیشوند، مگر اینکه به تابع صفت trace داده شده باشد (توضیحات مربوط به دستور توکار declare در ادامه را ببینید) یا گزینه پوسته -o functrace با دستور توکار set فعال شده باشد (که در این صورت تمام توابع تلههای DEBUG و RETURN را به ارث میبرند)، و تله ERR به ارث برده نمیشود مگر اینکه گزینه پوسته -o errtrace فعال شده باشد.
متغیرهای محلی برای تابع با دستور توکار local تعریف میشوند (local variables). به طور معمول، متغیرها و مقادیر آنها بین تابع و فراخوانندهاش به اشتراک گذاشته میشوند. اگر متغیری به صورت local تعریف شود، حوزه دید متغیر به آن تابع و فرزندانش (شامل توابعی که فراخوانی میکند) محدود میشود.
در توضیحات زیر، current scope (حوزه فعلی) تابعی است که در حال حاضر در حال اجراست. حوزههای قبلی شامل فراخواننده آن تابع و به همین ترتیب، به سمت عقب تا “global” scope (حوزه سراسری)، جایی که پوسته هیچ تابع پوستهای را اجرا نمیکند، تشکیل میشوند. یک متغیر محلی در حوزه فعلی، متغیری است که با استفاده از دستورات توکار local یا declare در تابعی که در حال حاضر در حال اجراست اعلان شده باشد.
متغیرهای محلی، متغیرهای با نام یکسان را که در حوزههای قبلی اعلان شدهاند “سایهاندازی”(shadow) میکنند. به عنوان مثال، یک متغیر محلی اعلانشده در یک تابع، متغیرهای با همان نام را که در حوزههای قبلی اعلان شدهاند، از جمله متغیرهای سراسری، پنهان میکند: ارجاعات و انتسابها به متغیر محلی اشاره دارند و متغیرهای موجود در حوزههای قبلی را بدون تغییر باقی میگذارند. هنگامی که تابع بازمیگردد، متغیر سراسری بار دیگر نمایان میشود.
پوسته از dynamic scoping (حوزهبندی پویا) برای کنترل میدان دید یک متغیر درون توابع استفاده میکند. با حوزهبندی پویا، متغیرهای قابل مشاهده و مقادیر آنها نتیجه توالی فراخوانیهای تابعی هستند که باعث رسیدن اجرا به تابع فعلی شدهاند. مقدار متغیری که یک تابع میبیند، به مقدار آن در فراخوانندهاش (در صورت وجود) بستگی دارد، چه آن فراخواننده حوزه سراسری باشد یا یک تابع پوسته دیگر. این همچنین مقداری است که اعلان یک متغیر محلی روی آن سایه میاندازد، و مقداری است که هنگام بازگشت تابع بازیابی میشود.
بهعنوان مثال، اگر متغیر var در تابع func1 بهصورت محلی اعلان شود، و func1 تابع دیگری به نام func2 را فراخوانی کند، ارجاعات به var که از درون func2 انجام میشوند به متغیر محلی var از func1 منتهی میگردند، و روی هر متغیر سراسری با نام var سایه میافکنند.
دستور توکار unset نیز با استفاده از همین حوزه پویای متغیرها عمل میکند: اگر متغیری متعلق به حوزه محلی فعلی باشد، unset آن را حذف (unset) میکند؛ در غیر این صورت، حذف به متغیر یافتشده در هر یک از حوزههای فراخواننده همانطور که در بالا توضیح داده شد، ارجاع خواهد داد. اگر متغیری در حوزه محلی فعلی حذف شود، تا زمانی که مجدداً در آن حوزه مقداردهی نشود یا تا زمان بازگشت تابع، به همین وضعیت (بهعنوان حذفشده) باقی میماند. بهمحض بازگشت تابع، هر نمونه از متغیر در حوزه قبلی مجدداً قابل مشاهده خواهد بود. اگر عملیات حذف روی متغیری در حوزه قبلی اعمال شود، هر نمونه از متغیری با آن نام که سایهافکنی شده بود، قابل مشاهده میشود (در زیر ببینید که چگونه گزینه پوسته localvar_unset این رفتار را تغییر میدهد).
متغیر FUNCNEST در صورتی که روی یک مقدار عددی بزرگتر از 0 تنظیم شود، حداکثر سطح تو در تویی تابع را تعریف میکند. فراخوانیهای تابعی که از این حد فراتر بروند باعث لغو و متوقف شدن کل دستور میشوند.
اگر دستور توکار return در یک تابع اجرا شود، اجرای تابع پایان یافته و اجرا با دستور بعدیِ پس از فراخوانی تابع از سر گرفته میشود. اگر به return یک آرگومان عددی داده شود، آن مقدار وضعیت بازگشتیِ تابع خواهد بود؛ در غیر این صورت، وضعیت بازگشتی تابع برابر با وضعیت خروجِ آخرین دستور اجراشده قبل از return خواهد بود. هر دستوری که با تله (trap) RETURN مرتبط باشد، قبل از ازسرگیری اجرا، انجام میگیرد. هنگامی که یک تابع به پایان میرسد، مقادیر پارامترهای مکانی و پارامتر ویژه # به مقادیری که قبل از اجرای تابع داشتند، بازگردانده میشوند.
گزینه -f برای دستورات توکار declare یا typeset نامها و تعاریف توابع را فهرست میکند. گزینه -F برای declare یا typeset فقط نام توابع را فهرست میکند (و در صورت فعال بودن گزینه پوسته extdebug، بهصورت اختیاری فایل منبع و شماره خط را نیز نمایش میدهد). توابع را میتوان صادر (export) کرد تا فرآیندهای فرزند پوسته (آنهایی که هنگام اجرای یک فراخوانی جداگانه پوسته ایجاد میشوند) با استفاده از گزینه -f در دستور توکار export بهطور خودکار آنها را بهصورت تعریفشده داشته باشند. گزینه -f برای دستور توکار unset تعریف یک تابع را حذف میکند.
توابع میتوانند بازگشتی باشند. متغیر FUNCNEST ممکن است برای محدود کردن عمق پشته فراخوانی تابع و محدود کردن تعداد فراخوانیهای تابع استفاده شود. بهطور پیشفرض، bash هیچ محدودیتی برای تعداد فراخوانیهای بازگشتی اعمال نمیکند.
ارزیابی حسابی (ARITHMETIC EVALUATION)
پوسته اجازه میدهد که در شرایط معینی، عبارات حسابی ارزیابی شوند (دستورات توکار let و declare، دستور ترکیبی ((، دستور حسابی for، دستور شرطی [[، و بسط حسابی (Arithmetic Expansion) را ببینید).
ارزیابی در بزرگترین اعداد صحیح با عرض ثابتِ در دسترس، بدون بررسی سرریز انجام میشود، هرچند تقسیم بر 0 به عنوان یک تله گرفته شده و بهعنوان یک خطا علامتگذاری میشود. عملگرها و اولویت، شرکتپذیری و مقادیر آنها مشابه زبان C هستند. فهرست عملگرهای زیر به سطوحی از عملگرها با اولویت برابر گروهبندی شده است. این سطوح به ترتیب اولویت کاهشی فهرست شدهاند.
- id++ id--
- پسافزایش و پسکاهش متغیر
- ++id --id
- پیشافزایش و پیشکاهش متغیر
- - +
- منفی و مثبت یکانی
- ! ~
- نقیض منطقی و بیتی
- **
- توان
- * / %
- ضرب، تقسیم، باقیمانده
- + -
- جمع، تفریق
- << >>
- شیفت بیتی به چپ و راست
- <= >= < >
- مقایسه
- == !=
- برابری و نابرابری
- &
- AND بیتی
- ^
- OR انحصاری بیتی (XOR)
- |
- OR بیتی
- &&
- AND منطقی
- ||
- OR منطقی
- expr?expr:expr
- عملگر شرطی
- = *= /= %= += -= <<= >>= &= ^= |=
- انتساب
- expr1 , expr2
- کاما
متغیرهای پوسته به عنوان عملوند مجاز هستند؛ بسط پارامتر پیش از ارزیابی عبارت انجام میشود. درون یک عبارت، متغیرهای پوسته همچنین میتوانند با نام و بدون استفاده از نحو بسط پارامتر ارجاع داده شوند. این بدان معناست که میتوانید از "x"، که در آن x نام یک متغیر پوسته است، در یک عبارت حسابی استفاده کنید، و پوسته مقدار آن را به عنوان یک عبارت ارزیابی کرده و از نتیجه استفاده خواهد کرد. متغیر پوستهای که تهی (null) باشد یا مقداردهی نشده باشد، هنگامی که در یک عبارت با نام ارجاع داده شود، به 0 ارزیابی میشود.
مقدار یک متغیر هنگامی که به آن ارجاع داده میشود، یا هنگامی که به متغیری که با استفاده از declare -i صفت integer (عدد صحیح) داده شده مقداری اختصاص داده میشود، به عنوان یک عبارت حسابی ارزیابی میگردد. یک مقدار تهی (null) به 0 ارزیابی میشود. نیازی نیست که صفت integer یک متغیر پوسته فعال باشد تا بتوان از آن در یک عبارت استفاده کرد.
ثابتهای عدد صحیح از تعریف زبان C پیروی میکنند، بدون پسوندها یا ثابتهای نویسهای. ثابتهایی با 0 آغازین به عنوان اعداد در مبنای هشت (اکتال) تفسیر میشوند. یک 0x یا 0X آغازین نشاندهنده مبنای شانزده (هگزادسیمال) است. در غیر این صورت، اعداد به شکل [base#]n خواهند بود، که در آن base اختیاری، عددی در مبنای ده بین 2 و 64 است که مبنای حسابی را نشان میدهد، و n عددی در آن مبنا است. اگر base# حذف شود، مبنای 10 استفاده میشود. هنگام مشخص کردن n، در صورتی که یک غیررقم مورد نیاز باشد، ارقام بزرگتر از 9 به ترتیب با حروف کوچک، حروف بزرگ، @، و _ نشان داده میشوند. اگر base کمتر یا مساوی 36 باشد، حروف کوچک و بزرگ میتوانند به جای یکدیگر برای نمایش اعداد بین 10 و 35 به کار روند.
عملگرها بر اساس اولویت ارزیابی میشوند. زیرعبارتهای داخل پرانتز ابتدا ارزیابی میشوند و ممکن است قوانین اولویت فوق را لغو کنند.
عبارات شرطی (CONDITIONAL EXPRESSIONS)
عبارات شرطی توسط دستور ترکیبی [[ و دستورات توکار test و [ برای آزمایش ویژگیهای فایل و انجام مقایسههای رشتهای و حسابی استفاده میشوند. دستورات test و [ رفتار خود را بر اساس تعداد آرگومانها تعیین میکنند؛ برای هرگونه اقدام خاص دیگر به توضیحات آن دستورات مراجعه کنید.
عبارات از مؤلفههای اولیه یکانی یا دوتایی فهرستشده در زیر تشکیل میشوند. عبارات یکانی اغلب برای بررسی وضعیت یک فایل یا متغیر پوسته استفاده میشوند. عملگرهای دوتایی برای مقایسههای رشتهای، عددی و ویژگیهای فایل به کار میروند.
پوسته Bash هنگام استفاده از چندین نام فایل در عبارات، به صورت ویژهای با آنها رفتار میکند. اگر سیستمعاملی که bash روی آن اجرا میشود این فایلهای ویژه را فراهم کند، bash از آنها استفاده خواهد کرد؛ در غیر این صورت آنها را به صورت داخلی با این رفتار شبیهسازی میکند: اگر هر آرگومان file برای یکی از مؤلفههای اولیه به شکل /dev/fd/n باشد، آنگاه bash توصیفگر فایل n را بررسی میکند. اگر آرگومان file برای یکی از مؤلفههای اولیه یکی از موارد /dev/stdin، /dev/stdout، یا /dev/stderr باشد، bash به ترتیب توصیفگر فایل 0، 1 یا 2 را بررسی میکند.
مگر اینکه خلاف آن مشخص شده باشد، مؤلفههای اولیهای که روی فایلها عمل میکنند از پیوندهای نمادین پیروی کرده و به جای خود پیوند، روی مقصد پیوند عمل میکنند.
هنگام استفاده همراه با [[، یا زمانی که پوسته در حالت posix است، عملگرهای < و > بر اساس ترتیب لغتنگاری با استفاده از محلیسازی (locale) فعلی مرتبسازی میکنند. هنگامی که پوسته در حالت posix نیست، دستور test مرتبسازی را با استفاده از ترتیب ASCII انجام میدهد.
- -a file
- درست است اگر file وجود داشته باشد.
- -b file
- درست است اگر file وجود داشته باشد و یک فایل ویژه بلوکی باشد.
- -c file
- درست است اگر file وجود داشته باشد و یک فایل ویژه کاراکتری باشد.
- -d file
- درست است اگر file وجود داشته باشد و یک دایرکتوری باشد.
- -e file
- درست است اگر file وجود داشته باشد.
- -f file
- درست است اگر file وجود داشته باشد و یک فایل معمولی (regular file) باشد.
- -g file
- درست است اگر file وجود داشته باشد و بیت set-group-id آن تنظیم شده باشد.
- -h file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین باشد.
- -k file
- درست است اگر file وجود داشته باشد و بیت چسبنده “sticky” آن تنظیم شده باشد.
- -p file
- درست است اگر file وجود داشته باشد و یک لوله نامگذاریشده (FIFO) باشد.
- -r file
- درست است اگر file وجود داشته باشد و قابل خواندن باشد.
- -s file
- درست است اگر file وجود داشته باشد و اندازه آن بزرگتر از صفر باشد.
- -t fd
- درست است اگر توصیفگر فایل fd باز باشد و به یک ترمینال اشاره کند.
- -u file
- درست است اگر file وجود داشته باشد و بیت set-user-id آن تنظیم شده باشد.
- -w file
- درست است اگر file وجود داشته باشد و قابل نوشتن باشد.
- -x file
- درست است اگر file وجود داشته باشد و قابل اجرا باشد.
- -G file
- درست است اگر file وجود داشته باشد و متعلق به شناسه گروهی مؤثر (effective group id) باشد.
- -L file
- درست است اگر file وجود داشته باشد و یک پیوند نمادین (symbolic link) باشد.
- -N file
- درست است اگر file وجود داشته باشد و از زمان آخرین دسترسی تغییر کرده باشد.
- -O file
- درست است اگر file وجود داشته باشد و متعلق به شناسه کاربری مؤثر (effective user id) باشد.
- -S file
- درست است اگر file وجود داشته باشد و یک سوکت باشد.
- -o optname
- درست است اگر گزینه پوسته optname فعال باشد. فهرست گزینهها را در زیر توضیحات گزینه -o برای دستور توکار set در ادامه ببینید.
- -v varname
- درست است اگر متغیر پوسته varname تنظیم شده باشد (مقداری به آن اختصاص یافته باشد). اگر varname نام یک متغیر آرایه ایندکسشده (نمایهدار) باشد که با @ یا * زیرنویس شده است، در صورتی که آرایه دارای هرگونه عنصر مقداردهیشده باشد درست بازمیگرداند. اگر varname نام یک متغیر آرایه انجمنی (متناظر) باشد که با @ یا * زیرنویس شده است، در صورتی که عنصری با آن کلید مقداردهی شده باشد درست بازمیگرداند.
- -R varname
- درست است اگر متغیر پوسته varname تنظیم شده باشد و یک ارجاع نام (name reference) باشد.
- -z string
- درست است اگر طول string صفر باشد.
- string
- -n string
- درست است اگر طول string غیر صفر باشد.
- string1 == string2
- string1 = string2
- درست است اگر رشتهها برابر باشند. = باید با دستور test برای انطباق با POSIX استفاده شود. هنگامی که با دستور [[ استفاده میشود، این تطابق الگو را همانطور که در بالا توضیح داده شد (دستورات ترکیبی (Compound Commands)) انجام میدهد.
- string1 != string2
- درست است اگر رشتهها برابر نباشند.
- string1 < string2
- درست است اگر string1 از نظر لغتنامهای قبل از string2 مرتب شود.
- string1 > string2
- درست است اگر string1 از نظر لغتنامهای بعد از string2 مرتب شود.
- file1 -ef file2
- درست است اگر file1 و file2 به همان دستگاه و شمارههای inode یکسان اشاره کنند.
- file1 -nt file2
- درست است اگر file1 جدیدتر (بر اساس تاریخ اصلاح) از file2 باشد، یا اگر file1 وجود داشته باشد و file2 وجود نداشته باشد.
- file1 -ot file2
- درست است اگر file1 قدیمیتر از file2 باشد، یا اگر file2 وجود داشته باشد و file1 وجود نداشته باشد.
- arg1 OP arg2
- OP یکی از -eq، -ne، -lt، -le، -gt یا -ge است. این عملگرهای دودویی حسابی در صورتی مقدار درست (true) را برمیگردانند که arg1 به ترتیب برابر، نابرابر، کوچکتر، کوچکتر یا مساوی، بزرگتر، یا بزرگتر یا مساوی با arg2 باشد. arg1 و arg2 میتوانند اعداد صحیح مثبت یا منفی باشند. هنگامی که همراه با دستور [[ استفاده شوند، arg1 و arg2 به عنوان عبارتهای حسابی ارزیابی میشوند (بخش ارزیابی حسابی (ARITHMETIC EVALUATION) در بالا را ببینید). از آنجا که بسطهایی که دستور [[ بر روی arg1 و arg2 انجام میدهد ممکن است به رشتههای خالی منجر شود، ارزیابی عبارت حسابی با آنها به عنوان عباراتی که حاصلشان 0 است رفتار میکند.
بسط دستورات ساده (SIMPLE COMMAND EXPANSION)
هنگامی که پوسته یک دستور ساده را اجرا میکند، بسطها، مقداردهیها و تغییر مسیرهای زیر را از چپ به راست و به ترتیب زیر انجام میدهد.
- 1.
- کلماتی که تجزیهکننده (parser) آنها را به عنوان مقداردهی متغیر (کلمات قبل از نام دستور) و تغییر مسیر علامتگذاری کرده است، برای پردازشهای بعدی ذخیره میشوند.
- 2.
- کلماتی که مقداردهی متغیر یا تغییر مسیر نیستند بسط داده میشوند. اگر بعد از بسط کلمهای باقی بماند، اولین کلمه به عنوان نام دستور در نظر گرفته شده و کلمات باقیمانده آرگومانها خواهند بود.
- 3.
- تغییر مسیرها همانطور که در بالا در بخش تغییر مسیر (REDIRECTION) شرح داده شد، انجام میشوند.
- 4.
- متن پس از = در هر مقداردهی متغیر، قبل از اینکه به متغیر انتساب یابد، تحت بسط تیلدا، بسط پارامتر، جایگزینی دستور، بسط حسابی و حذف نقلقول قرار میگیرد.
اگر هیچ نام دستوری حاصل نشود، مقداردهی متغیرها بر روی محیط فعلی پوسته تأثیر میگذارد. در مورد چنین دستوری (دستوری که فقط شامل عبارتهای مقداردهی و تغییر مسیر است)، عبارتهای مقداردهی قبل از تغییر مسیرها انجام میشوند. در غیر این صورت، متغیرها به محیط دستورِ اجراشده اضافه میشوند و بر محیط فعلی پوسته تأثیری ندارند. اگر هر یک از مقداردهیها تلاش کند مقداری را به یک متغیر فقطخواندنی اختصاص دهد، خطایی رخ میدهد و دستور با وضعیتی غیرصفر خارج میشود.
اگر هیچ نام دستوری حاصل نشود، تغییر مسیرها انجام میشوند، اما بر محیط فعلی پوسته تأثیری نمیگذارند. خطای تغییر مسیر باعث میشود که دستور با وضعیت غیرصفر خارج شود.
اگر بعد از بسط، نام دستوری باقی مانده باشد، روند اجرا همانگونه که در زیر شرح داده شده ادامه مییابد. در غیر این صورت، دستور پایان مییابد. اگر یکی از بسطها شامل یک جایگزینی دستور باشد، وضعیت خروج دستور همان وضعیت خروج آخرین جایگزینی دستورِ انجامشده خواهد بود. اگر هیچ جایگزینی دستوری وجود نداشته باشد، دستور با وضعیت صفر خارج میشود.
اجرای دستور (COMMAND EXECUTION)
پس از اینکه یک دستور به کلمات تفکیک شد، در صورتی که نتیجه یک دستور ساده و یک فهرست اختیاری از آرگومانها باشد، پوسته اقدامات زیر را انجام میدهد.
اگر نام دستور حاوی هیچ اسلشی نباشد، پوسته تلاش میکند مکان آن را پیدا کند. اگر تابع پوستهای با آن نام وجود داشته باشد، آن تابع همانطور که در بالا در توابع (FUNCTIONS) شرح داده شد، فراخوانی میشود. اگر نام با هیچ تابعی مطابقت نداشته باشد، پوسته آن را در فهرست دستورات توکار پوسته جستجو میکند. اگر تطابقی یافت شود، آن دستور توکار فراخوانی میشود.
اگر نام نه یک تابع پوسته باشد و نه یک دستور توکار، و فاقد هرگونه ممیز (اسلش) باشد، bash هر یک از مؤلفههای PATH را برای یافتن دایرکتوری حاوی یک فایل اجرایی با آن نام جستجو میکند. Bash از یک جدول درهمسازی (hash table) برای به خاطر سپردن مسیرهای کامل فایلهای اجرایی استفاده میکند (نگاه کنید به hash در بخش SHELL BUILTIN COMMANDS در زیر). Bash تنها در صورتی جستجوی کاملی در دایرکتوریهای موجود در PATH انجام میدهد که دستور در جدول درهمسازی پیدا نشود. اگر جستجو ناموفق باشد، پوسته به دنبال یک تابع تعریفشده پوسته به نام command_not_found_handle میگردد. اگر چنین تابعی وجود داشته باشد، در یک محیط اجرای مجزا با دستور اصلی و آرگومانهای دستور اصلی به عنوان آرگومانهایش فراخوانی میشود و وضعیت خروج این تابع، وضعیت خروج آن زیرپوسته (subshell) خواهد بود. اگر چنین تابعی تعریف نشده باشد، پوسته یک پیام خطا چاپ کرده و وضعیت خروج ۱۲۷ را برمیگرداند.
اگر جستجو موفقیتآمیز باشد، یا اگر نام دستور شامل یک یا چند ممیز (اسلش) باشد، پوسته برنامهٔ نامبرده را در یک محیط اجرای مجزا اجرا میکند. آرگومان ۰ برابر با نام دادهشده تنظیم میشود، و باقی آرگومانهای دستور، در صورت وجود، روی آرگومانهای ارائهشده تنظیم میگردند.
اگر این اجرا به دلیل اینکه فایل در قالب اجرایی معتبر نیست شکست بخورد و فایل دایرکتوری نباشد، فرض میشود که فایل یک shell script (اسکریپت پوسته) است؛ فایلی حاوی دستورات پوسته، و پوسته نمونهٔ جدیدی از خود را برای اجرای آن ایجاد میکند. Bash تلاش میکند مشخص کند که آیا فایل یک فایل متنی است یا باینری، و فایلهایی را که تشخیص دهد باینری هستند اجرا نخواهد کرد. این زیرپوسته خود را دوباره مقداردهی اولیه میکند، به طوری که اثر آن مشابه زمانی است که یک پوستهٔ جدید برای رسیدگی به اسکریپت فراخوانی شده باشد، با این استثنا که مکان دستورات به خاطر سپرده شده توسط والد (نگاه کنید به hash در زیر، ذیل بخش SHELL BUILTIN COMMANDS توسط فرزند حفظ میشوند.
اگر برنامه فایلی باشد که با #! آغاز میشود، بقیهٔ خط اول یک مفسر را برای برنامه مشخص میکند. پوسته، مفسر مشخصشده را در سیستمهای عاملی که خودشان این قالب اجرایی را مدیریت نمیکنند، اجرا مینماید. آرگومانهای مفسر شامل یک آرگومان اختیاری منفرد به دنبال نام مفسر در خط اول برنامه، به همراه نام برنامه، و در ادامه آرگومانهای دستور (در صورت وجود) خواهند بود.
محیط اجرای دستور (COMMAND EXECUTION ENVIRONMENT)
پوسته دارای یک execution environment (محیط اجرا) است که از موارد زیر تشکیل شده است:
- فایلهای بازی که هنگام فراخوانی به پوسته به ارث رسیدهاند، با اعمال تغییرات ناشی از تغییر مسیرهای ارائهشده به دستور توکار exec.
- دایرکتوری کاری فعلی که توسط cd، pushd، یا popd تنظیم شده، یا هنگام فراخوانی به پوسته به ارث رسیده است.
- ماسک حالت ایجاد فایل (file creation mode mask) که توسط umask تنظیم شده یا از والد پوسته به ارث رسیده است.
- تلههای فعلی (traps) که توسط trap تنظیم شدهاند.
- پارامترهای پوستهای که از طریق انتساب متغیر یا با set تعیین شدهاند یا از والد پوسته در محیط به ارث رسیدهاند.
- توابع پوستهای که در حین اجرا تعریف شدهاند یا از والد پوسته در محیط به ارث رسیدهاند.
- گزینههایی که هنگام فراخوانی فعال شدهاند (خواه به صورت پیشفرض یا با آرگومانهای خط فرمان) یا توسط set فعال گشتهاند.
- گزینههایی که توسط shopt فعال شدهاند.
- نامهای مستعار پوسته که با alias تعریف شدهاند.
- شناسههای گوناگون فرآیند (process IDs)، از جمله شناسههای کارهای پسزمینه، مقدار $$، و مقدار PPID.
هنگامی که یک دستور ساده غیر از یک دستور توکار یا تابع پوسته قرار است اجرا شود، در یک محیط اجرای جداگانه فراخوانی میشود که شامل موارد زیر است. مگر در مواردی که ذکر شده باشد، مقادیر از پوسته به ارث برده میشوند.
- فایلهای باز پوسته، به همراه هرگونه تغییرات و اضافاتی که توسط تغییر مسیرها به دستور مشخص شدهاند.
- دایرکتوری کاری فعلی.
- ماسک حالت ایجاد فایل (umask).
- متغیرها و توابع پوسته که برای export علامتگذاری شدهاند، به همراه متغیرهای صادر شده برای دستور، که در محیط ارسال میشوند.
- تلههای (traps) به دام افتاده توسط پوسته به مقادیر به ارث رسیده از والد پوسته بازنشانی میشوند، و تلههای نادیده گرفته شده توسط پوسته نادیده گرفته میشوند.
دستوری که در این محیط جداگانه فراخوانی میشود نمیتواند بر محیط اجرای پوسته تأثیر بگذارد.
یک subshell (زیرپوسته) کپیای از فرآیند پوسته است.
جایگزینی دستور، دستورات گروهبندی شده با پرانتز، و دستورات ناهمگام (asynchronous) در یک محیط زیرپوسته فراخوانی میشوند که رونوشتی از محیط پوسته است، به جز اینکه تلههای به دام افتاده توسط پوسته به مقادیری بازنشانی میشوند که پوسته هنگام فراخوانی از والد خود به ارث برده است. دستورات توکاری که به عنوان بخشی از یک خط لوله (pipeline) فراخوانی میشوند، به جز احتمالاً در آخرین عنصر بسته به مقدار گزینه پوسته lastpipe، آنها نیز در یک محیط زیرپوسته اجرا میشوند. تغییرات ایجاد شده در محیط زیرپوسته نمیتواند بر محیط اجرای پوسته تأثیر بگذارد.
هنگامی که پوسته در حالت posix است، زیرپوستههای ایجاد شده برای اجرای جایگزینی دستور، مقدار گزینه -e را از پوسته والد خود به ارث میبرند. هنگامی که در حالت posix نیست، bash گزینه -e را در چنین زیرپوستههایی پاک میکند. برای نحوه کنترل این رفتار در زمانی که در حالت posix نیستید، توضیحات مربوط به گزینه پوسته inherit_errexit را در ادامه ببینید.
اگر دستوری با یک & دنبال شود و مدیریت کارها فعال نباشد، ورودی استاندارد پیشفرض برای دستور، فایل خالی /dev/null خواهد بود. در غیر این صورت، دستور فراخوانیشده توصیفکنندههای فایل پوسته فراخوان را به همان صورتی که توسط تغییر مسیرها اصلاح شدهاند به ارث میبرد.
محیط (ENVIRONMENT)
هنگامی که برنامهای فراخوانی میشود، آرایهای از رشتهها به آن داده میشود که environment (محیط) نامیده میشود. این لیستی از جفتهای name-value (نام-مقدار) به فرم name=value است.
پوسته چندین راه برای دستکاری محیط ارائه میدهد. هنگام فراخوانی، پوسته محیط خود را بررسی کرده و برای هر نامِ یافتشده یک پارامتر ایجاد میکند، و به طور خودکار آن را برای export به فرآیندهای فرزند علامتگذاری میکند. دستورات اجرا شده محیط را به ارث میبرند. دستورات export، declare -x، و unset محیط را با افزودن و حذف پارامترها و توابع تغییر میدهند. اگر مقدار یک پارامتر در محیط تغییر یابد، مقدار جدید به طور خودکار جایگزین مقدار قدیمی شده و بخشی از محیط میشود. محیط به ارث رسیده توسط هر دستور اجرا شده شامل محیط اولیه پوسته است که مقادیر آن ممکن است در پوسته اصلاح شده باشد، منهای جفتهای حذف شده توسط دستورات unset یا export -n، به علاوه هرگونه موارد اضافه شده از طریق دستورات export و declare -x.
اگر هرگونه انتساب پارامتر، همانطور که در بالا در PARAMETERS توضیح داده شده است، قبل از یک simple command ظاهر شود، این انتسابهای متغیر تا زمانی که دستور اجرا میشود، بخشی از محیط آن دستور هستند. این عبارتهای انتساب فقط بر محیطی که توسط آن دستور دیده میشود تأثیر میگذارند. اگر این انتسابها مقدم بر فراخوانی یک تابع پوسته باشند، متغیرها برای آن تابع محلی بوده و به فرزندان آن تابع صادر (export) میشوند.
اگر گزینه -k تنظیم شده باشد (دستور توکار set در زیر را ببینید)، آنگاه همه انتسابهای پارامتر در محیط برای یک دستور قرار میگیرند، نه فقط مواردی که قبل از نام دستور میآیند.
هنگامی که bash یک دستور خارجی را فراخوانی میکند، متغیر _ روی مسیر کامل دستور تنظیم شده و در محیط آن به آن دستور ارسال میشود.
وضعیت خروج (EXIT STATUS)
وضعیت خروج یک دستور اجرا شده، مقداری است که توسط فراخوانی سیستمی waitpid یا تابع معادل آن بازگردانده میشود. وضعیتهای خروج بین 0 تا 255 قرار میگیرند، گرچه همانطور که در زیر توضیح داده شده است، پوسته ممکن است از مقادیر بالاتر از 125 به صورت ویژهای استفاده کند. وضعیتهای خروج از دستورات توکار پوسته و دستورات مرکب نیز به این محدوده محدود میشوند. تحت شرایط خاص، پوسته از مقادیر ویژهای برای نشان دادن حالتهای شکست مشخص استفاده میکند.
برای اهداف پوسته، دستوری که با وضعیت خروج صفر خارج میشود موفق شده است. بنابراین در حالی که وضعیت خروج صفر نشاندهنده موفقیت است، یک وضعیت خروج غیرصفر نشاندهنده شکست است.
هنگامی که یک دستور با یک سیگنال مرگبار N خاتمه مییابد، bash از مقدار N+128 به عنوان وضعیت خروج استفاده میکند.
اگر دستوری پیدا نشود، فرآیند فرزندی که برای اجرای آن ایجاد شده است وضعیت 127 را بازمیگرداند. اگر دستوری پیدا شود اما قابل اجرا نباشد، وضعیت بازگشتی 126 است.
اگر دستوری به دلیل خطایی در حین بسط یا تغییر مسیر شکست بخورد، وضعیت خروج بزرگتر از صفر است.
دستورات توکار پوسته در صورت موفقیت وضعیت 0 (true) و در صورت بروز خطا در حین اجرا وضعیت غیرصفر (false) را بازمیگردانند. همه دستورات توکار برای نشان دادن استفاده نادرست، عموماً گزینههای نامعتبر یا آرگومانهای مفقود، وضعیت خروج 2 را بازمیگردانند.
وضعیت خروج آخرین دستور در پارامتر ویژه $? در دسترس است.
خود Bash وضعیت خروج آخرین دستور اجرا شده را بازمیگرداند، مگر اینکه یک خطای نحوی رخ دهد، که در این صورت با یک مقدار غیرصفر خارج میشود. همچنین دستور توکار exit را در زیر ببینید.
سیگنالها (SIGNALS)
هنگامی که bash تعاملی است، در غیاب هرگونه تله (trap)، سیگنال SIGTERM را نادیده میگیرد (تا kill 0 یک پوسته تعاملی را از بین نبرد)، و سیگنال SIGINT را گرفته و مدیریت میکند (تا دستور توکار wait قابل وقفه باشد). هنگامی که bash سیگنال SIGINT را دریافت میکند، از هر حلقه در حال اجرایی خارج میشود. در همه موارد، bash سیگنال SIGQUIT را نادیده میگیرد. اگر مدیریت کارها فعال باشد، bash سیگنالهای SIGTTIN، SIGTTOU و SIGTSTP را نادیده میگیرد.
دستور توکار trap مدیریت سیگنال پوسته را همانطور که در زیر توضیح داده شده است، تغییر میدهد.
دستورات غیرتوکاری که bash اجرا میکند، گردانندههای سیگنالی تنظیمشده با مقادیر به ارث رسیده توسط پوسته از والد خود دارند، مگر اینکه trap آنها را طوری تنظیم کند که نادیده گرفته شوند، که در این صورت فرآیند فرزند نیز آنها را نادیده خواهد گرفت. هنگامی که مدیریت کارها فعال نیست، دستورات ناهمگام علاوه بر این گردانندههای به ارث رسیده، سیگنالهای SIGINT و SIGQUIT را نادیده میگیرند. دستوراتی که در نتیجه جایگزینی دستور اجرا میشوند، سیگنالهای مدیریت کار تولید شده از صفحهکلید یعنی SIGTTIN، SIGTTOU و SIGTSTP را نادیده میگیرند.
پوسته به طور پیشفرض پس از دریافت یک SIGHUP خارج میشود. پیش از خروج، یک پوسته تعاملی SIGHUP را دوباره به تمام کارها، در حال اجرا یا متوقفشده، ارسال میکند. پوسته SIGCONT را به کارهای متوقفشده ارسال میکند تا اطمینان حاصل کند که آنها SIGHUP را دریافت میکنند (برای اطلاعات بیشتر درباره کارهای در حال اجرا و متوقفشده، بخش مدیریت کارها (JOB CONTROL) در زیر را ببینید). برای جلوگیری از ارسال سیگنال توسط پوسته به یک کار خاص، آن را با دستور توکار disown از جدول کارها حذف کنید (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید) یا با استفاده از disown -h آن را علامتگذاری کنید تا SIGHUP را دریافت نکند.
اگر گزینه پوسته huponexit با استفاده از shopt تنظیم شده باشد، bash هنگامی که یک پوسته ورودی تعاملی خارج میشود، یک SIGHUP به تمام کارها ارسال میکند.
اگر bash منتظر اتمام یک دستور باشد و سیگنالی دریافت کند که برای آن یک تله (trap) تنظیم شده است، تا زمان اتمام دستور، آن تله را اجرا نخواهد کرد. اگر bash از طریق دستور توکار wait منتظر یک دستور ناهمگام باشد، و سیگنالی دریافت کند که برای آن تلهای تنظیم شده است، دستور توکار wait بلافاصله با وضعیت خروج بزرگتر از ۱۲۸ بازمیگردد، و بلافاصله پس از آن پوسته تله را اجرا میکند.
هنگامی که مدیریت کارها فعال نیست، و bash منتظر اتمام یک دستور پیشزمینه است، پوسته سیگنالهای تولیدشده توسط صفحهکلید را مانند SIGINT (معمولاً تولیدشده با ^C) که کاربران معمولاً قصد ارسال آن به آن دستور را دارند، دریافت میکند. این اتفاق به این دلیل میافتد که پوسته و دستور در گروه فرایندی یکسانی با ترمینال قرار دارند، و ^C سیگنال SIGINT را به تمام فرایندهای موجود در آن گروه فرایندی ارسال میکند. از آنجا که bash وقتی پوسته غیرتعاملی است مدیریت کارها را به طور پیشفرض فعال نمیکند، این سناریو در پوستههای غیرتعاملی بسیار متداول است.
هنگامی که مدیریت کارها فعال است، و bash منتظر اتمام یک دستور پیشزمینه است، پوسته سیگنالهای تولیدشده توسط صفحهکلید را دریافت نمیکند، زیرا در همان گروه فرایندیِ ترمینال قرار ندارد. این سناریو در پوستههای تعاملی، که در آنها bash تلاش میکند به طور پیشفرض مدیریت کارها را فعال کند، از همه متداولتر است. برای اطلاعات بیشتر در مورد گروههای فرایندی، بخش مدیریت کارها (JOB CONTROL) در زیر را ببینید.
هنگامی که مدیریت کارها فعال نیست، و bash در حین انتظار برای یک دستور پیشزمینه SIGINT دریافت میکند، تا زمان خاتمه یافتن آن دستور پیشزمینه صبر کرده و سپس درباره نحوه برخورد با SIGINT تصمیم میگیرد:
- 1.
- اگر دستور به دلیل SIGINT خاتمه یابد، bash نتیجه میگیرد که کاربر قصد داشته SIGINT را به پوسته نیز ارسال کند، و بر اساس SIGINT عمل میکند (برای مثال، با اجرای یک تله SIGINT، خروج از یک پوسته غیرتعاملی، یا بازگشت به بالاترین سطح برای خواندن یک دستور جدید).
- 2.
- اگر دستور به دلیل SIGINT خاتمه نیابد، برنامه خودش SIGINT را مدیریت کرده و با آن به عنوان یک سیگنال مرگبار رفتار نکرده است. در این حالت، bash نیز با SIGINT به عنوان یک سیگنال مرگبار رفتار نمیکند، بلکه در عوض فرض میکند که SIGINT به عنوان بخشی از عملکرد عادی برنامه استفاده شده است (به عنوان مثال، emacs از آن برای لغو دستورات ویرایشی استفاده میکند) یا عمداً نادیده گرفته شده است. با این حال، به منظور سازگاری، bash هر تله تنظیمشده روی SIGINT را اجرا خواهد کرد، همانطور که با هر سیگنال دارای تله دیگری که در حین انتظار برای اتمام دستور پیشزمینه دریافت میکند، چنین میکند.
هنگامی که مدیریت کارها فعال است، bash سیگنالهای تولیدشده توسط صفحهکلید مانند SIGINT را در حین انتظار برای یک دستور پیشزمینه دریافت نمیکند. یک پوسته تعاملی به SIGINT توجهی نمیکند، حتی اگر دستور پیشزمینه در نتیجه آن خاتمه یابد، مگر برای ثبت وضعیت خروج آن. اگر پوسته تعاملی نباشد، و دستور پیشزمینه به دلیل SIGINT خاتمه یابد، bash وانمود میکند که خود SIGINT را دریافت کرده است (سناریوی ۱ در بالا)، تا سازگاری حفظ شود.
مدیریت کارها (JOB CONTROL)
مدیریت کارها به توانایی متوقف کردن انتخابی (suspend) اجرای فرایندها و ادامه دادن (resume) اجرای آنها در زمانی دیگر اشاره دارد. یک کاربر معمولاً از این امکان از طریق یک رابط تعاملی که به طور مشترک توسط درایور ترمینال هسته سیستمعامل و bash فراهم میشود، استفاده میکند.
پوسته یک کار (job) را به هر خطلوله مرتبط میکند. پوسته جدولی از کارهای در حال اجرای فعلی نگهداری میکند که با دستور jobs نمایش داده میشود. هر کار یک شماره کار دارد که jobs آن را داخل کروشه نمایش میدهد. شماره کارها از ۱ شروع میشوند. هنگامی که bash کاری را به صورت ناهمگام (در پسزمینه) شروع میکند، خطی به این شکل چاپ میکند:
[1] 25647
که نشان میدهد این کار شماره ۱ است و شناسه فرایند (PID) آخرین فرایند در خطلوله مرتبط با این کار ۲۵۶۴۷ است. تمام فرایندهای یک خطلوله یکسان، عضو یک کار مشابه هستند. Bash از انتزاع کار به عنوان مبنایی برای مدیریت کارها استفاده میکند.
برای تسهیل پیادهسازی رابط کاربری مدیریت کارها، هر فرایند دارای یک شناسه گروه فرایند است، و سیستمعامل مفهومی به نام شناسه گروه فرایند ترمینال فعلی را حفظ میکند. این شناسه گروه فرایند ترمینال با ترمینال کنترلکننده مرتبط است.
فرایندهایی که شناسه گروه فرایند یکسانی دارند، عضو یک گروه فرایند در نظر گرفته میشوند. اعضای گروه فرایند پیشزمینه (فرایندهایی که شناسه گروه فرایند آنها برابر با شناسه گروه فرایند ترمینال فعلی است) سیگنالهای تولیدشده توسط صفحهکلید مانند SIGINT را دریافت میکنند. فرایندهای موجود در گروه فرایند پیشزمینه، فرایندهای پیشزمینه نامیده میشوند. فرایندهای پسزمینه فرایندهایی هستند که شناسه گروه فرایند آنها با ترمینال کنترلکننده متفاوت است؛ چنین فرایندهایی در برابر سیگنالهای تولیدشده توسط صفحهکلید مصون هستند. تنها به فرایندهای پیشزمینه اجازه خواندن داده میشود یا، اگر کاربر با “stty tostop” چنین مشخص کند، نوشتن در ترمینال کنترلکننده مجاز خواهد بود. سیستم یک سیگنال SIGTTIN (SIGTTOU) به فرایندهای پسزمینهای که تلاش برای خواندن از ترمینال (یا نوشتن در آن، هنگامی که “tostop” فعال است) دارند ارسال میکند، که مگر در صورت به دام انداختن، فرایند را معلق میکند.
اگر سیستمعاملی که bash روی آن در حال اجراست از مدیریت کارها پشتیبانی کند، bash امکاناتی برای استفاده از آن در بر دارد. وارد کردن نویسهٔ تعلیق (suspend) (معمولاً ^Z، Control-Z) در زمان اجرای یک فرایند، آن فرایند را متوقف کرده و کنترل را به bash بازمیگرداند. وارد کردن نویسهٔ تعلیق با تأخیر (delayed suspend) (معمولاً ^Y، Control-Y) باعث میشود فرایند هنگامی که تلاش میکند ورودی را از ترمینال بخواند متوقف شود، و کنترل را به bash بازمیگرداند. سپس کاربر میتواند با استفاده از دستور bg برای ادامهٔ آن در پسزمینه، دستور fg برای ادامهٔ آن در پیشزمینه، یا دستور kill برای خاتمه دادن به آن، وضعیت این کار را مدیریت کند. نویسهٔ تعلیق بلافاصله اثر میکند، و اثر جانبی دیگری نیز دارد که عبارت است از دور ریختن هرگونه خروجی در انتظار و نویسههای پیشتایپشده (typeahead). برای وادار کردن یک فرایند پسزمینه به توقف، یا توقف فرایندی که به نشست ترمینال فعلی مرتبط نیست، سیگنال SIGSTOP را با استفاده از kill برای آن ارسال کنید.
راههای متعددی برای ارجاع به یک کار در پوسته وجود دارد. نویسهٔ % یک مشخصهٔ کار (jobspec) را معرفی میکند.
کار شمارهٔ n ممکن است بهصورت %n ارجاع داده شود. همچنین ممکن است به یک کار با استفاده از پیشوند نامی که برای شروع آن استفاده شده، یا با استفاده از زیررشتهای که در خط فرمان آن ظاهر میشود، ارجاع داد. برای نمونه، %ce به کاری ارجاع دارد که نام دستور آن با ce آغاز میشود. از سوی دیگر، استفاده از %?ce، به هر کاری که شامل رشتهٔ ce در خط فرمان خود باشد ارجاع دارد. اگر پیشوند یا زیررشته با بیش از یک کار مطابقت داشته باشد، bash یک خطا گزارش میکند.
نمادهای %% و %+ به برداشت پوسته از کار فعلی (current job) اشاره دارند. یک % تکی (بدون هیچ مشخصهٔ کار همراه آن) نیز به کار فعلی ارجاع دارد. %- به کار پیشین (previous job) اشاره دارد. هنگامی که کاری در پسزمینه شروع میشود، کاری در حین اجرا در پیشزمینه متوقف میشود، یا کاری در پسزمینه از سر گرفته میشود، آن کار به کار فعلی تبدیل میشود. کاری که کار فعلی بود، به کار پیشین تبدیل میشود. هنگامی که کار فعلی خاتمه مییابد، کار پیشین به کار فعلی تبدیل میشود. اگر تنها یک کار وجود داشته باشد، از هر دوی %+ و %- میتوان برای ارجاع به آن کار استفاده کرد. در خروجیهای مربوط به کارها (مانند خروجی دستور jobs)، کار فعلی همیشه با یک +، و کار پیشین با یک - علامتگذاری میشود.
صرفاً نام بردن از یک کار میتواند برای آوردن آن به پیشزمینه استفاده شود: %1 مترادفی برای “fg %1” است، که کار ۱ را از پسزمینه به پیشزمینه میآورد. به همین ترتیب، “%1 &” کار ۱ را در پسزمینه از سر میگیرد، که معادل است با
پوسته هر زمان که وضعیّت کاری تغییر کند، بلافاصله از آن آگاه میشود. بهطور معمول، bash پیش از آگاه کردن کاربر از تغییرات وضعیّت یک کار، صبر میکند تا درست در آستانهٔ چاپ یک خط اعلان قرار گیرد تا مانع از اختلال در هرگونه خروجی دیگر شود، هرچند که تغییرات وضعیّت یک کار را پس از تکمیل شدن یک دستور پیشزمینه در یک فهرست، پیش از اجرای دستور بعدی در فهرست، اعلام خواهد کرد. اگر گزینهٔ -b در دستور توکار set فعال باشد، bash تغییرات وضعیّت را بلافاصله گزارش میکند. Bash هر تلهٔ (trap) تعیینشده روی SIGCHLD را به ازای هر فرآیند فرزندی که خاتمه مییابد اجرا میکند.
هنگامی که یک کار خاتمه مییابد و bash کاربر را از آن مطلع میسازد، bash آن کار را از جدول کارها حذف میکند. آن کار دیگر در خروجی jobs ظاهر نخواهد شد، اما wait تا زمانی که شناسهٔ فرآیند (PID) مرتبط با کار بهعنوان شناسه به آن داده شود، وضعیّت خروج آن را گزارش خواهد داد. هنگامی که جدول خالی شود، شمارهگذاری کارها مجدداً از ۱ آغاز میشود.
اگر کاربری تلاش کند از bash خارج شود در حالی که کارهایی متوقف شدهاند (یا اگر گزینهٔ پوستهٔ checkjobs با استفاده از دستور توکار shopt فعال شده باشد، در حال اجرا باشند)، پوسته یک پیام هشدار چاپ میکند، و در صورتی که گزینهٔ checkjobs فعال باشد، فهرست کارها و وضعیّتهایشان را نمایش میدهد. سپس میتوان از دستور jobs برای بررسی وضعیّت آنها استفاده کرد. اگر کاربر بلافاصله و بدون وارد کردن دستوری در این میان دوباره تلاش کند خارج شود، bash هشدار دیگری چاپ نمیکند، و هر کار متوقفشدهای را خاتمه میدهد.
هنگامی که پوسته با استفاده از دستور توکار wait منتظر یک کار یا فرآیند است و مدیریت کارها فعال باشد، wait با تغییر وضعیّت کار بازمیگردد. گزینهٔ -f باعث میشود که wait پیش از بازگشت، تا زمان خاتمه یافتن کار یا فرآیند منتظر بماند.
خط اعلان (PROMPTING)
هنگام اجرای تعاملی، bash هنگامی که آمادهٔ خواندن یک دستور است، خط اعلان اصلی PS1 و هنگامی که برای تکمیل یک دستور به ورودی بیشتری نیاز دارد، خط اعلان ثانویهٔ PS2 را نمایش میدهد.
Bash درست پیش از چاپ هر خط اعلان اصلی، مقدار متغیر آرایهای PROMPT_COMMAND را بررسی میکند. اگر هر عنصری در PROMPT_COMMAND تنظیم شده و غیرتهی باشد، Bash هر مقدار را به ترتیب عددی اجرا میکند، دقیقاً مانند اینکه در خط فرمان تایپ شده باشد. Bash متغیر PS0 را پس از خواندن یک دستور اما پیش از اجرای آن نمایش میدهد.
Bash متغیر PS4 را همانطور که در بالا شرح داده شد، پیش از ردگیری هر دستور در زمانی که گزینهٔ -x فعال است، نمایش میدهد.
Bash اجازه میدهد تا رشتههای خط اعلان PS0، PS1, PS2، و PS4، با درج تعدادی از نویسههای ویژه که با بکاسلش گریز داده شدهاند، سفارشیسازی شوند؛ این نویسهها به شرح زیر رمزگشایی میشوند:
- \a
- یک نویسهٔ زنگ اسکی (ASCII bell character) (07).
- \d
- تاریخ در قالب “Weekday Month Date” (به عنوان مثال، “Tue May 26”).
- \D{format}
- مقدار format به strftime(3) پاس داده میشود و نتیجه در رشته خط اعلان درج میگردد؛ یک format خالی منجر به نمایش زمان بر اساس محلیسازی جاری (locale) میشود. کروشهها الزامی هستند.
- \e
- یک نویسه گریز ASCII (کد 033).
- \h
- نام میزبان تا اولین “.”.
- \H
- نام میزبان.
- \j
- تعداد کارهایی که در حال حاضر توسط پوسته مدیریت میشوند.
- \l
- نام پایه (basename) نام دستگاه ترمینال پوسته (به عنوان مثال، “ttys0”).
- \n
- یک خط جدید (newline).
- \r
- یک بازگشت به ابتدای سطر (carriage return).
- \s
- نام پوسته: نام پایه (basename) $0 (بخشی که پس از آخرین ممیز قرار دارد).
- \t
- زمان فعلی در قالب ۲۴ ساعته HH:MM:SS.
- \T
- زمان فعلی در قالب ۱۲ ساعته HH:MM:SS.
- \@
- زمان فعلی در قالب ۱۲ ساعته am/pm.
- \A
- زمان فعلی در قالب ۲۴ ساعته HH:MM.
- \u
- نام کاربری کاربر فعلی.
- \v
- نسخه bash (به عنوان مثال، 2.00).
- \V
- انتشار bash، نسخه + سطح وصله (patch level) (به عنوان مثال، 2.00.0).
- \w
- مقدار متغیر پوسته PWD ($PWD)، که در آن $HOME با یک مدک (tilde) خلاصه شده است (از مقدار متغیر PROMPT_DIRTRIM استفاده میکند).
- \W
- نام پایه (basename) مربوط به $PWD، که در آن $HOME با یک مدک خلاصه شده است.
- \!
- شماره تاریخچه این دستور.
- \#
- شماره دستور این دستور.
- \$
- اگر شناسه کاربری مؤثر (UID) برابر 0 باشد، یک #، در غیر این صورت یک $.
- \nnn
- نویسه متناظر با عدد در مبنای هشت nnn.
- \\
- یک بکاسلش (ممیز وارونه).
- \[
- آغاز یک دنباله از نویسههای غیرقابلچاپ، که میتواند برای گنجاندن یک دنباله کنترلی ترمینال در خط اعلان استفاده شود.
- \]
- پایان یک دنباله از نویسههای غیرقابلچاپ.
شماره دستور و شماره تاریخچه معمولاً متفاوت هستند: شماره تاریخچه یک دستور، موقعیت آن در فهرست تاریخچه است که ممکن است شامل دستورهای بازیابیشده از فایل تاریخچه باشد (به بخش تاریخچه (HISTORY) در زیر مراجعه کنید)، در حالی که شماره دستور، موقعیت در دنباله دستورهای اجراشده در طول نشست جاری پوسته است. پس از رمزگشایی رشته، مشروط به مقدار گزینه پوستهای promptvars این رشته از طریق بسط پارامتر، جایگزینی دستور، بسط حسابی و حذف نقلقول بسط داده میشود (توضیحات دستور shopt را ذیل دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر ببینید). اگر بخشهای گریز دادهشده رشته در جایگزینی دستور ظاهر شوند یا شامل نویسههای خاص برای بسط کلمه باشند، این امر میتواند عوارض جانبی ناخواستهای داشته باشد.
خط خوان (READLINE)
این کتابخانهای است که خواندن ورودی را هنگام استفاده از یک پوسته تعاملی مدیریت میکند، مگر اینکه گزینه --noediting در هنگام فراخوانی پوسته مشخص شده باشد. ویرایش خط همچنین هنگام استفاده از گزینه -e در دستور توکار read به کار میرود. بهطور پیشفرض، دستورات ویرایش خط شبیه به دستورات emacs هستند؛ یک رابط ویرایش خط به سبک vi نیز در دسترس است. ویرایش خط را میتوان در هر زمان با استفاده از گزینههای -o emacs یا -o vi در دستور توکار set فعال کرد (به بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر مراجعه کنید). برای خاموش کردن ویرایش خط پس از اجرای پوسته، از گزینههای +o emacs یا +o vi در دستور توکار set استفاده کنید.
علامتگذاری خطخوان (Readline Notation)
این بخش از مفاهیم ویرایشی به سبک Emacs و علائم نگارشی آن برای کلیدها استفاده میکند. کلیدهای Control با C-key مشخص میشوند، برای نمونه C-n به معنی Control-N است. به همین ترتیب، کلیدهای meta با M-key مشخص میشوند، بنابراین M-x به معنی Meta-X است. کلید Meta اغلب با عنوان “Alt” یا “Option” برچسبگذاری شده است.
روی صفحهکلیدهای بدون کلید Meta، عبارت M-x به معنای ESC x است، یعنی کلید Escape را فشرده و رها کنید، سپس کلید x را به صورت متوالی فشرده و رها نمایید. این کار کلید ESC را به meta prefix (پیشوند متا) تبدیل میکند. ترکیب M-C-x به معنای ESC Control-x است: کلید Escape را فشرده و رها کنید، سپس کلید Control را نگه داشته و کلید x را فشار دهید، و آنگاه هر دو را رها کنید.
در برخی صفحهکلیدها، کلید تبدیلکننده Meta نویسههایی تولید میکند که بیت هشتم (0200) آنها تنظیم شده است. در صورتی که صفحهکلید این اجازه را بدهد، میتوانید از متغیر enable-meta-key برای کنترل اینکه این عمل انجام شود یا خیر استفاده کنید. در بسیاری موارد دیگر، ترمینال یا شبیهساز ترمینال، کلید متا را همانطور که در پاراگراف قبلی توضیح داده شد، به یک دنباله کلیدی تبدیل میکند که با ESC شروع میشود.
اگر کلید Meta شما دنبالهای از کلیدها را به همراه پیشوند متای ESC تولید میکند، میتوانید با تنظیم متغیر force-meta-prefix کاری کنید که مقیدسازیهای کلیدی M-key که مشخص میکنید (بخش مقیدسازیهای کلید خط خوان (Readline Key Bindings) در زیر را ببینید) همین رفتار را انجام دهند.
به دستورات Readline میتوان آرگومانهای عددی داد که معمولاً به عنوان تعداد تکرار عمل میکنند. با این حال، گاهی اوقات علامت آرگومان است که اهمیت دارد. دادن یک آرگومان منفی به دستوری که در جهت جلو عمل میکند (مانند kill-line) باعث میشود آن دستور در جهت عقب عمل کند. دستوراتی که رفتارشان با آرگومانها از این قاعده انحراف دارد، در زیر ذکر شدهاند.
مفهوم point به موقعیت فعلی مکاننما اشاره دارد و mark به یک موقعیت ذخیرهشده از مکاننما اشاره میکند. به متن بین point و mark اصطلاحاً region (ناحیه) گفته میشود. Readline دارای مفهوم active region (ناحیه فعال) است: هنگامی که ناحیه فعال باشد، بازنمایش readline این ناحیه را با استفاده از مقدار متغیر active-region-start-color برجسته میکند. متغیر enable-active-region این قابلیت را روشن و خاموش میکند. چندین دستور ناحیه را به حالت فعال تنظیم میکنند؛ این دستورات در زیر مشخص شدهاند.
هنگامی که دستوری به عنوان killing (حذف/کشتن) متن توصیف میشود، متن حذفشده برای بازیابی احتمالی در آینده ذخیره میشود (yanking یا چسباندن مجدد). متن حذفشده در یک kill ring (حلقه حذف) ذخیره میشود. حذفهای متوالی، متنهای حذفشده را در یک واحد انباشته میکنند که میتوان همه آنها را یکجا بازگرداند (yank کرد). دستوراتی که متن را حذف نمیکنند، تکههای متن را در حلقه حذف از یکدیگر جدا میسازند.
راهاندازی اولیه خط خوان (Readline Initialization)
Readline با قرار دادن دستورات در یک فایل پیکربندی و راهاندازی اولیه (فایل inputrc) سفارشیسازی میشود. نام این فایل از مقدار متغیر پوسته INPUTRC گرفته میشود. اگر این متغیر تنظیم نشده باشد، مقدار پیشفرض ~/.inputrc است. اگر آن فایل وجود نداشته باشد یا خوانده نشود، readline به دنبال /etc/inputrc میگردد. هنگامی که برنامهای که از کتابخانه readline استفاده میکند شروع به کار نماید، readline فایل راهاندازی را میخواند و پیش از خواندن هرگونه ورودی کاربر، مقیدسازیهای کلید و متغیرهای یافتشده در آن را تنظیم میکند.
تنها چند ساختار پایهای در فایل inputrc مجاز است. خطوط خالی نادیده گرفته میشوند. خطوطی که با # آغاز میشوند، توضیح (comment) هستند. خطوطی که با $ آغاز میشوند نشاندهنده ساختارهای شرطی هستند. سایر خطوط نشاندهنده مقیدسازیهای کلید و تنظیمات متغیرها هستند.
مقیدسازیهای پیشفرض کلیدها در این بخش را میتوان با استفاده از دستورات مقیدسازی کلید در فایل inputrc تغییر داد. برنامههایی که از کتابخانه readline استفاده میکنند، از جمله bash، میتوانند دستورات و مقیدسازیهای ویژه خود را اضافه نمایند.
به عنوان مثال، قرار دادن
M-Control-u: universal-argument
در فایل inputrc باعث میشود کلید M-C-u دستور readline به نام universal-argument را اجرا کند.
مقیدسازیهای کلید ممکن است شامل نام نمادین نویسههای زیر باشند: DEL، ESC، ESCAPE، LFD، NEWLINE، RET، RETURN، RUBOUT (یک پسبر مخرب یا destructive backspace)، SPACE، SPC و TAB.
علاوه بر نامهای دستور، readline اجازه میدهد کلیدها به یک رشته متصل شوند که هنگام فشرده شدن کلید درج میشود (یک macro). تفاوت بین یک ماکرو و یک دستور در این است که ماکرو در کوتیشن تکی یا دوتایی قرار میگیرد.
اتصالات کلید ریدلاین (Readline Key Bindings)
نحو کنترل اتصالات کلید در فایل inputrc ساده است. تنها چیزی که لازم است، نام دستور یا متن یک ماکرو و یک توالی کلید است که باید به آن متصل شود. توالی کلید ممکن است به یکی از دو روش مشخص شود: به عنوان یک نام کلید نمادین، احتمالاً با پیشوندهای Meta- یا Control-، یا به عنوان یک توالی کلید متشکل از یک یا چند نویسه درون کوتیشن دوتایی. توالی کلید و نام با یک دونقطه از هم جدا میشوند. هیچ فاصله خالی نمیتواند بین نام و دونقطه وجود داشته باشد.
هنگام استفاده از قالب keyname:function-name یا macro، keyname نام یک کلید است که به انگلیسی نوشته شده است. برای مثال:
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"
در مثال بالا، C-u به تابع universal-argument، M-DEL به تابع backward-kill-word، و C-o برای اجرای ماکروی بیانشده در سمت راست متصل شده است (یعنی برای درج متن “> output” در خط).
در قالب دوم، "keyseq":function-name یا macro، keyseq با keyname بالا تفاوت دارد، زیرا رشتههایی که کل یک توالی کلید را نشان میدهند میتوانند با قرار دادن توالی درون کوتیشن دوتایی مشخص شوند. برخی از کاراکترهای گریز کلید به سبک GNU Emacs را میتوان استفاده کرد، مانند مثال زیر، اما هیچیک از نامهای نمادین نویسهها شناخته نمیشوند.
"\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1"
در این مثال، C-u دوباره به تابع universal-argument متصل شده است. C-x C-r به تابع re-read-init-file، و ESC [ 1 1 ~ برای درج متن “Function Key 1” متصل شده است.
مجموعه کامل توالیهای گریز به سبک GNU Emacs که هنگام مشخص کردن توالیهای کلید در دسترس هستند عبارتند از:
علاوه بر توالیهای گریز به سبک GNU Emacs، مجموعه دومی از توالیهای گریز بکاسلش نیز در دسترس است:
- \a
- هشدار (زنگ یا bell)
- \b
- پسبر (backspace)
- \d
- حذف (delete)
- \f
- برگه جدید (form feed)
- \n
- خط جدید (newline)
- \r
- بازگشت به ابتدای سطر (carriage return)
- \t
- تب افقی (horizontal tab)
- \v
- تب عمودی (vertical tab)
- \nnn
- نویسه هشت بیتی که مقدار آن مقدار اکتال (پایه هشت) nnn است (یک تا سه رقم).
- \xHH
- نویسه هشت بیتی که مقدار آن مقدار هگزادسیمال (پایه شانزده) HH است (یک یا دو رقم هگز).
هنگام وارد کردن متن ماکرو، باید از نقلقول تکی یا دوگانه برای مشخص کردن تعریف ماکرو استفاده شود. متن فاقد نقلقول به عنوان نام تابع در نظر گرفته میشود. توالیهای گریز بکاسلش توضیحدادهشده در بالا در بدنه ماکرو بسط داده میشوند. بکاسلش هر نویسه دیگری را در متن ماکرو نقلقول (کو نقلقول/محافظت) میکند، از جمله " و '.
Bash کلیدهای مقیدشده فعلی readline را با دستور توکار bind نمایش میدهد یا اصلاح میکند. گزینههای -o emacs یا -o vi برای دستور توکار set (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید) حالت ویرایش را در طول استفاده تعاملی تغییر میدهند.
متغیرهای Readline
Readline دارای متغیرهایی است که میتوانند برای سفارشیسازی بیشتر رفتار آن استفاده شوند. یک متغیر ممکن است در فایل inputrc با عبارتی به شکل زیر تنظیم شود:
set variable-name value
بهجز مواردی که ذکر شده است، متغیرهای readline میتوانند مقادیر On یا Off را (بدون حساسیت به کوچک و بزرگی حروف) بپذیرند. نامهای متغیر ناشناخته نادیده گرفته میشوند. هنگامی که readline مقدار یک متغیر را میخواند، مقادیر خالی یا تهی (null)، “on” (بدون حساسیت به کوچک و بزرگی حروف) و “1” معادل On هستند. تمام مقادیر دیگر معادل Off میباشند.
دستور bind -V نامها و مقادیر فعلی متغیرهای readline را فهرست میکند (به بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر مراجعه کنید).
متغیرها و مقادیر پیشفرض آنها عبارتند از:
- active-region-start-color
- یک متغیر رشتهای که رنگ متن و پسزمینه را هنگام نمایش متن در ناحیه فعال (active region) کنترل میکند (به توضیحات enable-active-region در زیر مراجعه کنید). این رشته نباید هیچ موقعیت کاراکتر فیزیکی روی صفحه نمایش اشغال کند، بنابراین تنها باید از توالیهای گریز (escape sequences) ترمینال تشکیل شده باشد. این رشته پیش از نمایش متن در ناحیه فعال به ترمینال فرستاده میشود. این متغیر هر زمان که نوع ترمینال تغییر کند به مقدار پیشفرض بازنشانی میشود. مقدار پیشفرض، رشتهای است که ترمینال را در حالت برجسته (standout) قرار میدهد، همانطور که از توصیف terminfo ترمینال دریافت میشود. یک مقدار نمونه میتواند “\e[01;33m” باشد.
- active-region-end-color
- یک متغیر رشتهای که اثرات active-region-start-color را “خنثی”کرده و ظاهر نمایش “عادی” ترمینال را پس از نمایش متن در ناحیه فعال بازیابی میکند. این رشته نباید هیچ موقعیت کاراکتر فیزیکی روی صفحه نمایش اشغال کند، بنابراین باید تنها از توالیهای گریز ترمینال تشکیل شده باشد. این رشته پس از نمایش متن در ناحیه فعال به ترمینال فرستاده میشود. این متغیر هر زمان که نوع ترمینال تغییر کند به مقدار پیشفرض بازنشانی میشود. مقدار پیشفرض، رشتهای است که ترمینال را از حالت برجسته خارج میکند، همانطور که از توصیف terminfo ترمینال دریافت میشود. یک مقدار نمونه میتواند “\e[0m” باشد.
- bell-style (audible)
- کنترل میکند هنگامی که readline میخواهد زنگ ترمینال را به صدا درآورد چه اتفاقی بیفتد. اگر روی none تنظیم شود، readline هرگز زنگ را به صدا درنمیآورد. اگر روی visible تنظیم شود، readline در صورت وجود، از یک زنگ بصری استفاده میکند. اگر روی audible تنظیم شود، readline تلاش میکند زنگ ترمینال را به صدا درآورد.
- bind-tty-special-chars (On)
- اگر روی On تنظیم شود، readline تلاش میکند کاراکترهای کنترلی را که توسط راهانداز (درایور) ترمینال هسته به طور ویژهای مدیریت میشوند، به معادلهای آنها در readline متصل (bind) کند. اینها جایگزین اتصالهای پیشفرض readline میشوند که در اینجا توضیح داده شدهاند. دستور “stty -a” را در اعلان bash تایپ کنید تا تنظیمات فعلی ترمینال خود را، شامل کاراکترهای کنترلی ویژه (معمولاً cchars)، مشاهده نمایید.
- blink-matching-paren (Off)
- اگر روی On تنظیم شود، readline هنگام وارد شدن پرانتز بسته، تلاش میکند تا مکاننما را برای لحظهای کوتاه به پرانتز باز متناظر منتقل کند.
- colored-completion-prefix (Off)
- اگر روی On تنظیم شود، هنگام فهرست کردن کاملسازیها، readline پیشوند مشترک مجموعه کاملسازیهای ممکن را با استفاده از یک رنگ متفاوت نمایش میدهد. تعاریف رنگ از مقدار متغیر محیطی LS_COLORS گرفته میشود. اگر تعریفی از رنگ در $LS_COLORS برای پسوند سفارشی “.readline-colored-completion-prefix” وجود داشته باشد، readline به جای مقدار پیشفرض خود، از این رنگ برای پیشوند مشترک استفاده میکند.
- colored-stats (Off)
- اگر روی On تنظیم شود، readline کاملسازیهای ممکن را با استفاده از رنگهای متفاوت برای مشخص کردن نوع فایل آنها نمایش میدهد. تعاریف رنگ از مقدار متغیر محیطی LS_COLORS گرفته میشود.
- comment-begin (“#”)
- رشتهای که دستور insert-comment در readline درج میکند. این دستور در حالت emacs به M-# و در حالت دستور vi به # متصل شده است.
- completion-display-width (-1)
- تعداد ستونهای صفحه نمایش که برای نمایش تطابقهای احتمالی هنگام انجام تکمیل (completion) استفاده میشود. اگر این مقدار کمتر از 0 یا بزرگتر از عرض صفحه ترمینال باشد، نادیده گرفته میشود. مقدار 0 باعث میشود که تطابقها بهصورت یک مورد در هر سطر نمایش داده شوند. مقدار پیشفرض -1 است.
- completion-ignore-case (Off)
- اگر روی On تنظیم شود، readline تطبیق نام فایل و تکمیل را بدون در نظر گرفتن بزرگی و کوچکی حروف (case-insensitive) انجام میدهد.
- completion-map-case (Off)
- اگر روی On تنظیم شود، و completion-ignore-case فعال باشد، readline هنگام انجام تطبیق نام فایل و تکمیل بدون حساسیت به حروف، خط پیوند (-) و زیرخط (_) را معادل یکدیگر در نظر میگیرد.
- completion-prefix-display-length (0)
- حداکثر طول (به نویسه/کاراکتر) از پیشوند مشترک یک فهرست از تکمیلهای احتمالی که بدون تغییر نمایش داده میشود. هنگامی که روی مقداری بزرگتر از صفر تنظیم شود، readline پیشوندهای مشترک طولانیتر از این مقدار را هنگام نمایش تکمیلهای احتمالی، با یک علامت تعلیق (...) جایگزین میکند. اگر یک تکمیل با نقطه آغاز شود، و readline در حال تکمیل نامهای فایل باشد، به جای علامت تعلیق از سه زیرخط (___) استفاده میکند.
- completion-query-items (100)
- این متغیر تعیین میکند چه زمانی در مورد مشاهده تعداد تکمیلهای احتمالی تولید شده توسط دستور possible-completions از کاربر سؤال پرسیده شود. میتوان آن را روی هر مقدار عدد صحیح بزرگتر یا مساوی با صفر تنظیم کرد. اگر تعداد تکمیلهای احتمالی بزرگتر یا مساوی با مقدار این متغیر باشد، readline میپرسد که آیا کاربر مایل به مشاهده آنها هست یا خیر؛ در غیر این صورت، readline بهسادگی آنها را در ترمینال فهرست میکند. مقدار صفر به این معنی است که readline هرگز نباید سؤال بپرسد؛ مقادیر منفی به عنوان صفر در نظر گرفته میشوند.
- convert-meta (On)
- اگر روی On تنظیم شود، readline نویسههای خواندهشدهای را که بیت هشتم آنها تنظیم شده است، با پاک کردن بیت هشتم و پیشوند کردن آن با یک نویسه escape، به یک توالی کلید ASCII تبدیل میکند (نویسه را به داشتن پیشوند meta تبدیل میکند). مقدار پیشفرض On است، اما اگر locale حاوی نویسههایی باشد که رمزگذاری آنها ممکن است شامل بایتهایی با بیت هشتم تنظیمشده باشد، readline آن را روی Off قرار میدهد. این متغیر وابسته به دستهبندی محلی LC_CTYPE است، و ممکن است با تغییر locale تغییر کند. این متغیر همچنین بر پیوندهای کلیدها تأثیر میگذارد؛ توضیحات force-meta-prefix را در زیر ببینید.
- disable-completion (Off)
- اگر روی On تنظیم شود، readline از تکمیل کلمات جلوگیری میکند. نویسههای تکمیل در خط درج میشوند، گویی به self-insert نگاشت شدهاند.
- echo-control-characters (On)
- هنگامی که روی On تنظیم شود، در سیستمعاملهایی که پشتیبانی از آن را اعلام میکنند، readline نویسه متناظر با سیگنال تولید شده از صفحهکلید را بازتاب (echo) میدهد.
- editing-mode (emacs)
- کنترل میکند که آیا readline از مجموعهای از پیوندهای کلید شبیه به Emacs استفاده میکند یا vi. editing-mode میتواند روی emacs یا vi تنظیم شود.
- emacs-mode-string (@)
- اگر متغیر show-mode-in-prompt فعال باشد، این رشته بلافاصله پیش از آخرین خط از اعلان اصلی (primary prompt) در هنگام فعال بودن حالت ویرایش emacs نمایش داده میشود. این مقدار مانند یک پیوند کلید بسط داده میشود، بنابراین مجموعه استاندارد پیشوندهای meta- و control- و توالیهای گریز backslash در دسترس است. توالیهای گریز \1 و \2 توالیهای نویسههای غیرقابل چاپ را آغاز و پایان میدهند، که میتوان از آنها برای تعبیه یک توالی کنترل ترمینال در رشته حالت استفاده کرد.
- enable-active-region (On)
- هنگامی که این متغیر روی On تنظیم شود، readline به برخی دستورات اجازه میدهد ناحیه را به عنوان فعال (active) مشخص کنند. وقتی ناحیه فعال است، readline متن موجود در آن ناحیه را با استفاده از مقدار متغیر active-region-start-color برجسته (highlight) میکند، که پیشفرض آن رشتهای است که حالت standout ترمینال را فعال میسازد. ناحیه فعال، متن درجشده توسط bracketed-paste و هر متن مطابق یافتشده توسط جستجوهای افزایشی و غیرافزایشی تاریخچه را نشان میدهد.
- enable-bracketed-paste (On)
- هنگامی که روی On تنظیم شود، readline ترمینال را طوری پیکربندی میکند که هر متن جایگذاریشده (paste) را به عنوان یک رشته واحد از نویسهها در بافر ویرایش درج کند، به جای اینکه با هر نویسه طوری رفتار کند که گویی از صفحهکلید خوانده شده است. به این حالت، bracketed-paste mode گفته میشود؛ این قابلیت از اجرای هرگونه دستور ویرایشی مقید شده به توالیهای کلیدی که در متن جایگذاریشده ظاهر میشوند توسط readline جلوگیری میکند.
- enable-keypad (Off)
- هنگامی که روی On تنظیم شود، readline هنگام فراخوانی تلاش میکند صفحهکلید عددی برنامهای (application keypad) را فعال کند. برخی سیستمها برای فعالسازی کلیدهای جهتنما به این گزینه نیاز دارند.
- enable-meta-key (On)
- هنگامی که روی On تنظیم شود، readline تلاش میکند هر کلید تغییردهنده متا (meta) را که ترمینال مدعی پشتیبانی از آن است فعال کند. در بسیاری از ترمینالها، کلید Meta برای ارسال نویسههای هشتبیتی استفاده میشود؛ این متغیر قابلیت ترمینال را بررسی میکند که آیا ترمینال میتواند حالتی را فعال و غیرفعال کند که در صورت نگهداشتن کلید Meta هنگام تایپ نویسه، بیت هشتم آن نویسه را روی یک تنظیم کند (0200) یا خیر (یک نویسه متا).
- expand-tilde (Off)
- اگر روی On تنظیم شود، readline هنگام تلاش برای کاملکردن کلمات، بسط تیلدا (tilde expansion) را انجام میدهد.
- force-meta-prefix (Off)
- اگر روی On تنظیم شود، readline هنگام مقیدسازی توالیهای کلیدی حاوی \M- یا Meta- (به بخش پیوندهای کلیدی (Key Bindings) در بالا مراجعه کنید)، با تبدیل یک توالی کلیدی به فرم \M-C یا Meta-C به توالی دونویسهای ESC C (افزودن پیشوند متا)، رفتار خود را تغییر میدهد. اگر force-meta-prefix روی Off (پیشفرض) تنظیم شده باشد، readline از مقدار متغیر convert-meta برای تعیین اینکه آیا این تبدیل انجام شود یا خیر استفاده میکند: اگر convert-meta روی On باشد، readline تبدیل توصیفشده در بالا را انجام میدهد؛ اگر روی Off باشد، readline نویسه C را با تنظیم کردن بیت هشتم (0200) به یک نویسه متا تبدیل میکند.
- history-preserve-point (Off)
- اگر روی On تنظیم شود، کد تاریخچه تلاش میکند در هر خط از تاریخچه که با previous-history یا next-history بازیابی میشود، نقطه مکاننما (point) را در همان مکان قبلی قرار دهد.
- history-size (unset)
- حداکثر تعداد مدخلهای تاریخچه ذخیرهشده در فهرست تاریخچه را تنظیم میکند. اگر روی صفر تنظیم شود، تمام مدخلهای تاریخچه موجود حذف میشوند و هیچ مدخل جدیدی ذخیره نخواهد شد. اگر روی مقداری کمتر از صفر تنظیم شود، تعداد مدخلهای تاریخچه محدود نخواهد بود. بهطور پیشفرض، bash حداکثر تعداد مدخلهای تاریخچه را روی مقدار متغیر پوسته HISTSIZE تنظیم میکند. تنظیم history-size روی یک مقدار غیرعددی، حداکثر تعداد مدخلهای تاریخچه را روی 500 قرار میدهد.
- horizontal-scroll-mode (Off)
- تنظیم این متغیر روی On باعث میشود readline از یک خط واحد برای نمایش استفاده کند، و هنگامی که طول ورودی از عرض صفحه بیشتر میشود به جای شکستن خط به یک خط جدید، ورودی را به صورت افقی در یک خط صفحه پیمایش (اسکرول) کند. این تنظیم بهطور خودکار برای ترمینالهایی با ارتفاع ۱ فعال میشود.
- input-meta (Off)
- اگر روی On تنظیم شود، readline ورودی هشتبیتی را فعال میکند (یعنی بیت هشتم را در نویسههایی که میخواند پاک نمیکند)، بدون توجه به اینکه ترمینال ادعای پشتیبانی از چه چیزی را دارد. مقدار پیشفرض Off است، اما اگر لوکال (locale) شامل نویسههایی باشد که کدگذاری آنها ممکن است شامل بایتهایی با بیت هشتم فعال باشد، readline آن را روی On تنظیم میکند. این متغیر به دستهبندی محلی LC_CTYPE وابسته است و با تغییر لوکال، مقدار آن ممکن است تغییر کند. نام meta-flag مترادفی برای input-meta است.
- isearch-terminators (“C-[C-j”)
- رشتهای از نویسهها که باید بدون اجرای بعدی آن نویسه به عنوان یک دستور، به جستجوی افزایشی پایان دهند. اگر مقداری به این متغیر اختصاص داده نشده باشد، نویسههای ESC و C-j به یک جستجوی افزایشی پایان میدهند.
- keymap (emacs)
- نقشه کلید (keymap) جاری readline را تنظیم میکند. مجموعه نامهای معتبر نقشه کلید عبارت است از emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command، و vi-insert. vi معادل vi-command است؛ emacs معادل emacs-standard است. مقدار پیشفرض emacs است؛ مقدار editing-mode نیز بر نقشه کلید پیشفرض تأثیر میگذارد.
- keyseq-timeout (500)
- مدتزمانی را مشخص میکند که readline هنگام خواندن یک توالی کلید مبهم، برای یک نویسه منتظر میماند (توالی کلیدی که میتواند با استفاده از ورودی خواندهشده تا کنون یک توالی کامل تشکیل دهد، یا میتواند ورودی بیشتری برای تکمیل یک توالی طولانیتر دریافت کند). اگر readline در طول مدت زمان انقضا هیچ ورودی دریافت نکند، از توالی کلید کوتاهتر اما کامل استفاده میکند. این مقدار بر حسب میلیثانیه مشخص میشود، بنابراین مقدار ۱۰۰۰ به این معنی است که readline یک ثانیه برای ورودی اضافی منتظر خواهد ماند. اگر این متغیر روی مقداری کمتر یا مساوی صفر، یا یک مقدار غیرعددی تنظیم شود، readline تا فشرده شدن کلید دیگری منتظر میماند تا تصمیم بگیرد کدام توالی کلید را تکمیل کند.
- mark-directories (On)
- اگر روی On تنظیم شود، به انتهای نام دایرکتوریهای تکمیلشده یک اسلش افزوده میشود.
- mark-modified-lines (Off)
- اگر روی On تنظیم شود، readline خطوط تاریخچه را که تغییر یافتهاند با یک ستاره در ابتدا (*) نمایش میدهد.
- mark-symlinked-directories (Off)
- اگر روی On تنظیم شود، به انتهای نامهای تکمیلشدهای که پیوندهای نمادین به دایرکتوریها هستند یک اسلش افزوده میشود که تابع مقدار mark-directories است.
- match-hidden-files (On)
- این متغیر، هنگامی که روی On تنظیم شود، readline را وادار میکند تا هنگام تکمیل نام فایل، فایلهایی را که نامشان با یک “.” شروع میشود (فایلهای پنهان) تطبیق دهد. اگر روی Off تنظیم شود، کاربر باید “.” ابتدایی را در نام فایل وارد کند تا تکمیل شود.
- اگر روی On تنظیم شود، تکمیل منویی پیشوند مشترک لیست تکمیلهای ممکن را (که ممکن است خالی باشد) پیش از چرخش در میان لیست نمایش میدهد.
- output-meta (Off)
- اگر روی On تنظیم شود، readline نویسههای با بیت هشتم فعال را بهجای یک توالی فرار با پیشوند متا، بهطور مستقیم نمایش میدهد. پیشفرض Off است، اما اگر لوکال حاوی نویسههایی باشد که ممکن است کدگذاری آنها شامل بایتهایی با بیت هشتم فعال باشد، readline آن را روی On تنظیم میکند. این متغیر به دستهبندی محلی LC_CTYPE وابسته است و در صورت تغییر لوکال ممکن است مقدار آن تغییر کند.
- page-completions (On)
- اگر روی On تنظیم شود، readline از یک صفحهبند داخلی شبیه به more(1) استفاده میکند تا در هر بار یک صفحه کامل از تکمیلهای ممکن را نمایش دهد.
- prefer-visible-bell
- ببینید bell-style.
- print-completions-horizontally (Off)
- اگر روی On تنظیم شود، readline موارد تکمیلشده را بهجای ستونی رو به پایین صفحه، بهصورت افقی و به ترتیب الفبایی نمایش میدهد.
- revert-all-at-newline (Off)
- اگر روی On تنظیم شود، readline هنگام اجرای accept-line پیش از بازگشت، تمام تغییرات اعمالشده روی خطوط تاریخچه را خنثی (undo) میکند. بهطور پیشفرض، خطوط تاریخچه ممکن است تغییر کنند و لیستهای لغو (undo) اختصاصی خود را در بین فراخوانیهای readline حفظ نمایند.
- search-ignore-case (Off)
- اگر روی On تنظیم شود، readline جستجوهای افزایشی و غیرافزایشی در لیست تاریخچه را بهصورت غیرحساس به حروف کوچک و بزرگ انجام میدهد.
- show-all-if-ambiguous (Off)
- این متغیر رفتار پیشفرض توابع تکمیل را تغییر میدهد. اگر روی On تنظیم شود، کلماتی که بیش از یک تکمیل ممکن دارند باعث میشوند تا موارد منطبق بلافاصله بهجای به صدا درآوردن زنگ هشدار لیست شوند.
- show-all-if-unmodified (Off)
- این گزینه رفتار پیشفرض توابع تکمیل را به شیوهای مشابه با show-all-if-ambiguous تغییر میدهد. اگر روی On تنظیم شود، کلماتی که بیش از یک تکمیل ممکن بدون هیچگونه تکمیل جزئی ممکن دارند (تکمیلهای ممکن پیشوند مشترکی ندارند) باعث میشوند بهجای به صدا درآمدن زنگ، موارد منطبق بلافاصله فهرست شوند.
- show-mode-in-prompt (Off)
- اگر روی On تنظیم شود، رشتهای به ابتدای خط اعلان اضافه میکند که حالت ویرایش را نشان میدهد: emacs، دستور vi، یا درج vi. رشتههای حالت توسط کاربر قابل تنظیم هستند (مانند emacs-mode-string).
- skip-completed-text (Off)
- اگر روی On تنظیم شود، هنگام درج یک تطابق منفرد در خط، رفتار پیشفرض تکمیل را تغییر میدهد. این گزینه فقط هنگام انجام تکمیل در میانه یک کلمه فعال است. در صورت فعال بودن، readline نویسههایی از تکمیل را که با نویسههای بعد از مکاننما (point) در کلمه در حال تکمیل مطابقت دارند درج نمیکند، بنابراین بخشهایی از کلمه که پس از مکاننما قرار دارند تکرار نمیشوند.
- vi-cmd-mode-string ((cmd))
- اگر متغیر show-mode-in-prompt فعال باشد، هنگامی که حالت ویرایش vi فعال بوده و در حالت دستوری باشد، این رشته بلافاصله پیش از آخرین خط اعلان اصلی نمایش داده میشود. مقدار آن مانند یک کلید مقیدشده (key binding) بسط مییابد، بنابراین مجموعه استاندارد پیشوندهای meta- و control- و توالیهای گریز ممیز وارونه (backslash escape) در دسترس است. دنبالههای گریز \1 و \2 توالیهای نویسههای غیرقابلچاپ را آغاز کرده و پایان میدهند که میتوان از آنها برای گنجاندن یک توالی کنترل ترمینال در رشته حالت استفاده کرد.
- vi-ins-mode-string ((ins))
- اگر متغیر show-mode-in-prompt فعال باشد، هنگامی که حالت ویرایش vi فعال بوده و در حالت درج باشد، این رشته بلافاصله پیش از آخرین خط اعلان اصلی نمایش داده میشود. مقدار آن مانند یک کلید مقیدشده (key binding) بسط مییابد، بنابراین مجموعه استاندارد پیشوندهای meta- و control- و توالیهای گریز ممیز وارونه (backslash escape) در دسترس است. دنبالههای گریز \1 و \2 توالیهای نویسههای غیرقابلچاپ را آغاز کرده و پایان میدهند که میتوان از آنها برای گنجاندن یک توالی کنترل ترمینال در رشته حالت استفاده کرد.
- visible-stats (Off)
- اگر روی On تنظیم شود، هنگام فهرست کردن تکمیلهای ممکن، نویسهای که نوع فایل را طبق گزارش stat(2) مشخص میکند، به نام فایل ضمیمه میشود.
ساختارهای شرطی خط خوان (Readline Conditional Constructs)
Readline امکانی مشابه با ویژگیهای کامپایل شرطی پیشپردازنده C را پیادهسازی میکند که به مقیدسازیهای کلید و تنظیمات متغیر اجازه میدهد بر اساس نتیجه آزمایشها انجام شوند. چهار دستورالعمل تجزیهکننده (parser directive) در دسترس است.
- $if
- ساختار $if اجازه میدهد مقیدسازیها بر اساس حالت ویرایش، ترمینال در حال استفاده، یا برنامهای که از readline استفاده میکند انجام شوند. متن آزمایش، بعد از هر عملگر مقایسه، تا انتهای خط ادامه مییابد؛ مگر در مواردی که ذکر شده باشد، هیچ نویسهای برای جداسازی آن لازم نیست.
- mode
- شکل mode= از دستورالعمل $if برای آزمایش اینکه آیا readline در حالت emacs است یا vi به کار میرود. این ممکن است همراه با دستور set keymap استفاده شود، به عنوان مثال، برای تنظیم مقیدسازیها در نگاشتهای کلید emacs-standard و emacs-ctlx تنها در صورتی که readline در حالت emacs شروع به کار کند.
- term
- شکل term= ممکن است برای گنجاندن مقیدسازیهای کلید مخصوص ترمینال استفاده شود، شاید برای مقید کردن توالیهای کلیدی خروجی دادهشده توسط کلیدهای تابع ترمینال. کلمه سمت راست = هم در برابر نام کامل ترمینال و هم در برابر بخشی از نام ترمینال پیش از اولین - آزمایش میشود. این به عنوان مثال اجازه میدهد xterm هم با xterm و هم با xterm-256color تطابق یابد.
- version
- آزمون version میتواند برای انجام مقایسه با نسخههای خاص readline استفاده شود. version به نسخه فعلی readline بسط مییابد. مجموعه عملگرهای مقایسه شامل =، (و ==)، !=، <=، >=، <، و > است. شماره نسخه ارائه شده در سمت راست عملگر شامل یک شماره نسخه اصلی (major)، یک نقطه اعشار اختیاری، و یک نسخه فرعی (minor) اختیاری است (مثلاً 7.1). اگر نسخه فرعی حذف شود، مقدار پیشفرض آن 0 خواهد بود. عملگر میتواند با نویسه فاصله (whitespace) از رشته version و از آرگومان شماره نسخه جدا شود.
- application
- ساختار application برای گنجاندن تنظیمات مختص به برنامه استفاده میشود. هر برنامهای که از کتابخانه readline استفاده میکند یک application name (نام برنامه) تنظیم مینماید، و یک فایل پیکربندی اولیه میتواند مقدار خاصی را بیازماید. این قابلیت میتواند برای نگاشت توالی کلیدها به توابع مفید برای یک برنامه خاص استفاده شود. به عنوان مثال، دستور زیر یک توالی کلید اضافه میکند که کلمه فعلی یا قبلی را در bash داخل نقلقول قرار میدهد:
$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
- variable
- ساختار variable آزمونهای برابری سادهای را برای متغیرها و مقادیر readline فراهم میکند. عملگرهای مقایسهای مجاز عبارتند از =، ==، و !=. نام متغیر باید با نویسه فاصله از عملگر مقایسه جدا شود؛ عملگر نیز میتواند با نویسه فاصله از مقدار سمت راست جدا شود. متغیرهای رشتهای و بولی را میتوان مورد آزمایش قرار داد. متغیرهای بولی باید با مقادیر on و off سنجیده شوند.
- $else
- دستورات این شاخه از دستورالعمل $if در صورتی که آزمون شکست بخورد اجرا میشوند.
- $endif
- این دستور، همانطور که در مثال قبل دیده شد، به یک دستور $if خاتمه میدهد.
- $include
- این دستورالعمل یک نام فایل واحد را به عنوان آرگومان میگیرد و دستورات و نگاشتهای کلید را از آن فایل میخواند. به عنوان مثال، دستورالعمل زیر فایل /etc/inputrc را میخواند:
$include /etc/inputrc
جستجو (Searching)
Readline دستوراتی را برای جستجو در تاریخچه دستورات (بخش HISTORY در زیر را ببینید) برای یافتن خطوط حاوی یک رشته مشخص فراهم میکند. دو حالت جستجو وجود دارد: افزایشی (incremental) و غیرافزایشی(non-incremental).
جستجوهای افزایشی قبل از پایان تایپ رشته جستجو توسط کاربر آغاز میشوند. با تایپ هر نویسه از رشته جستجو، readline ورودی بعدی از تاریخچه را که با رشته تایپشده تا آن لحظه مطابقت دارد نمایش میدهد. یک جستجوی افزایشی تنها به همان تعداد نویسه نیاز دارد که برای یافتن ورودی مورد نظر در تاریخچه لازم است. هنگام استفاده از حالت ویرایش emacs، کلید C-r را برای جستجوی رو به عقب در تاریخچه به دنبال یک رشته خاص فشار دهید. فشردن C-s جستجو را رو به جلو در طول تاریخچه انجام میدهد. نویسههای موجود در مقدار متغیر isearch-terminators برای پایان دادن به یک جستجوی افزایشی استفاده میشوند. اگر مقداری به این متغیر اختصاص داده نشده باشد، ESC و C-j به جستجوی افزایشی پایان میدهند. C-g یک جستجوی افزایشی را لغو کرده و خط اصلی را بازمیگرداند. هنگامی که جستجو پایان مییابد، ورودی تاریخچهای که حاوی رشته جستجو است تبدیل به خط فعلی میشود.
برای یافتن دیگر ورودیهای منطبق در فهرست تاریخچه، بسته به جهت جستجو C-r یا C-s را وارد کنید. این کار در تاریخچه به سمت عقب یا جلو به دنبال ورودی بعدی منطبق با رشته جستجوی تایپشده تا این لحظه میگردد. هر توالی کلید دیگری که به یک دستور readline مقید شده باشد، جستجو را پایان میدهد و آن دستور را اجرا میکند. برای نمونه، یک نویسه خط جدید (newline) جستجو را پایان داده و خط را میپذیرد، و در نتیجه دستور مربوطه را از فهرست تاریخچه اجرا میکند. یک دستور جابهجایی نیز جستجو را خاتمه میدهد، آخرین خط یافتشده را به خط فعلی تبدیل میکند و ویرایش را آغاز مینماید.
ابزار Readline آخرین رشته جستجوی افزایشی را به خاطر میسپارد. اگر دو کلید C-r بدون هیچ نویسه مداخلهگری برای تعریف یک رشته جستجوی جدید تایپ شوند، readline از همان رشته جستجوی ذخیرهشده استفاده میکند.
جستجوهای غیرافزایشی، پیش از آغاز جستجو برای ورودیهای منطبق در تاریخچه، کل رشته جستجو را میخوانند. رشته جستجو میتواند توسط کاربر تایپ شود یا بخشی از محتوای خط فعلی باشد.
نامهای دستورات Readline
در ادامه فهرستی از نامهای دستورات و توالیهای کلید پیشفرضی که این دستورات به آنها مقید شدهاند آورده شده است. نامهای دستوری که بدون توالی کلید هستند، بهطور پیشفرض به هیچ کلیدی مقید نشدهاند.
در توضیحات زیر، point به موقعیت فعلی مکاننما اشاره دارد، و mark به موقعیت مکاننمایی اشاره میکند که با دستور set-mark ذخیره شده است. به متن بین point و mark اصطلاحاً region (ناحیه) گفته میشود. Readline دارای مفهوم active region (ناحیه فعال) است: هنگامی که ناحیه فعال باشد، بازنمایش readline این ناحیه را با استفاده از مقدار متغیر active-region-start-color برجسته (highlight) میکند. متغیر enable-active-region در readline این قابلیت را فعال و غیرفعال میکند. چندین دستور ناحیه را در حالت فعال قرار میدهند؛ این موارد در ادامه ذکر شدهاند.
دستورات جابهجایی
- beginning-of-line (C-a)
- رفتن به ابتدای خط فعلی. این دستور ممکن است در برخی صفحهکلیدها به کلید Home نیز مقید شده باشد.
- end-of-line (C-e)
- رفتن به انتهای خط. این دستور ممکن است در برخی صفحهکلیدها به کلید End نیز مقید شده باشد.
- forward-char (C-f)
- حرکت به اندازه یک نویسه به جلو. این دستور ممکن است در برخی صفحهکلیدها به کلید جهتنمای راست نیز مقید شده باشد.
- backward-char (C-b)
- حرکت به اندازه یک نویسه به عقب. این دستور ممکن است در برخی صفحهکلیدها به کلید جهتنمای چپ نیز مقید شده باشد.
- forward-word (M-f)
- حرکت به جلو تا انتهای کلمه بعدی. کلمات از نویسههای الفبایی-عددی (حروف و ارقام) تشکیل شدهاند.
- backward-word (M-b)
- حرکت به عقب تا ابتدای کلمه فعلی یا قبلی. کلمات از نویسههای الفبایی-عددی (حروف و ارقام) تشکیل شدهاند.
- shell-forward-word (M-C-f)
- حرکت به جلو تا انتهای کلمه بعدی. کلمات با فرا-نویسههای (metacharacters) نقلقولنشده پوسته از یکدیگر جدا میشوند.
- shell-backward-word (M-C-b)
- حرکت به عقب تا ابتدای کلمه فعلی یا قبلی. کلمات با فرا-نویسههای (metacharacters) نقلقولنشده پوسته از یکدیگر جدا میشوند.
- previous-screen-line
- تلاش برای جابهجایی point به همان ستون فیزیکی صفحه در سطر فیزیکی قبلی نمایشگر. اگر خط فعلی readline بیش از یک سطر فیزیکی را اشغال نکرده باشد یا اگر مقدار point بزرگتر از مجموع طول خط اعلان (prompt) و عرض صفحه نباشد، این دستور اثر مورد نظر را نخواهد داشت.
- next-screen-line
- تلاش برای جابهجایی point به همان ستون فیزیکی صفحه در سطر فیزیکی بعدی نمایشگر. اگر خط فعلی readline بیش از یک سطر فیزیکی را اشغال نکرده باشد یا اگر طول خط فعلی readline بزرگتر از مجموع طول خط اعلان و عرض صفحه نباشد، این دستور اثر مورد نظر را نخواهد داشت.
- clear-display (M-C-l)
- پاک کردن صفحه و، در صورت امکان، بافر پیمایش به عقب (scrollback buffer) ترمینال، سپس رسم دوباره خط فعلی، بهگونهای که خط فعلی در بالای صفحه باقی بماند.
- clear-screen (C-l)
- پاک کردن صفحه، سپس ترسیم مجدد سطر جاری، بهطوری که سطر جاری در بالای صفحه قرار گیرد. با یک آرگومان عددی، سطر جاری بدون پاک کردن صفحه نوسازی میشود.
- redraw-current-line
- نوسازی سطر جاری.
دستورات مربوط به دستکاری تاریخچه
- accept-line (Newline, Return)
- پذیرش سطر صرفنظر از اینکه مکاننما کجاست. اگر این سطر غیرخالی باشد، با توجه به وضعیت متغیرهای HISTCONTROL و HISTIGNORE به فهرست تاریخچه افزوده میشود. اگر سطر یک سطر تغییریافته از تاریخچه باشد، سطر تاریخچه به حالت اولیهاش بازگردانده میشود.
- previous-history (C-p)
- واکشی دستور قبلی از فهرست تاریخچه با حرکت به سمت عقب در فهرست. این دستور ممکن است در برخی صفحهکلیدها به کلید پیکان رو به بالا نیز مقید شده باشد.
- next-history (C-n)
- واکشی دستور بعدی از فهرست تاریخچه با حرکت به سمت جلو در فهرست. این دستور ممکن است در برخی صفحهکلیدها به کلید پیکان رو به پایین نیز مقید شده باشد.
- beginning-of-history (M-<)
- حرکت به نخستین سطر در تاریخچه.
- end-of-history (M->)
- حرکت به انتهای تاریخچه ورودی، یعنی سطری که هماکنون در حال وارد شدن است.
- operate-and-get-next (C-o)
- پذیرش سطر جاری برای اجرا درست مانند اینکه یک خط جدید (newline) وارد شده باشد، و واکشی سطر بعدی نسبت به سطر جاری از تاریخچه جهت ویرایش. یک آرگومان عددی، در صورت ارائه، مدخل تاریخچه مورد استفاده را بهجای سطر جاری مشخص میکند.
- fetch-history
- با یک آرگومان عددی، واکشی آن مدخل از فهرست تاریخچه و قرار دادن آن بهعنوان سطر جاری. بدون آرگومان، حرکت به عقب تا نخستین مدخل در فهرست تاریخچه.
- reverse-search-history (C-r)
- جستوجو به سمت عقب با شروع از سطر جاری و حرکت “به”سمت در طول تاریخچه در صورت نیاز. این یک جستوجوی افزایشی است. این دستور ناحیه انتخاب را روی متن منطبقشده قرار داده و آن ناحیه را فعال میکند.
- forward-search-history (C-s)
- جستوجو به سمت جلو با شروع از سطر جاری و حرکت “به”سمت در طول تاریخچه در صورت نیاز. این یک جستوجوی افزایشی است. این دستور ناحیه انتخاب را روی متن منطبقشده قرار داده و آن ناحیه را فعال میکند.
- non-incremental-reverse-search-history (M-p)
- جستوجو به سمت عقب در تاریخچه با شروع از سطر جاری با استفاده از یک جستوجوی غیرافزایشی برای رشتهای که کاربر ارائه میدهد. رشته جستوجو میتواند در هر کجای یک سطر تاریخچه تطابق یابد.
- non-incremental-forward-search-history (M-n)
- جستوجو به سمت جلو در تاریخچه با استفاده از یک جستوجوی غیرافزایشی برای رشتهای که کاربر ارائه میدهد. رشته جستوجو میتواند در هر کجای یک سطر تاریخچه تطابق یابد.
- history-search-backward
- جستوجو به سمت عقب در تاریخچه برای رشته نویسههای بین ابتدای سطر جاری و مکان جاری نشانگر (point). رشته جستوجو باید در ابتدای یک سطر تاریخچه تطابق یابد. این یک جستوجوی غیرافزایشی است. این دستور ممکن است در برخی صفحهکلیدها به کلید Page Up مقید شده باشد.
- history-search-forward
- جستوجو به سمت جلو در تاریخچه برای رشته نویسههای بین ابتدای سطر جاری و مکان جاری نشانگر (point). رشته جستوجو باید در ابتدای یک سطر تاریخچه تطابق یابد. این یک جستوجوی غیرافزایشی است. این دستور ممکن است در برخی صفحهکلیدها به کلید Page Down مقید شده باشد.
- history-substring-search-backward
- جستجوی رو به عقب در تاریخچه برای رشته نویسههای موجود بین ابتدای خط فعلی و مکاننما (point). رشته مورد جستجو ممکن است در هر کجای یک خط از تاریخچه مطابقت یابد. این یک جستجوی غیر افزایشی (non-incremental) است.
- history-substring-search-forward
- جستجوی رو به جلو در تاریخچه برای رشته نویسههای موجود بین ابتدای خط فعلی و مکاننما (point). رشته مورد جستجو ممکن است در هر کجای یک خط از تاریخچه مطابقت یابد. این یک جستجوی غیر افزایشی (non-incremental) است.
- yank-nth-arg (M-C-y)
- درج نخستین آرگومان دستور قبلی (معمولاً کلمه دوم در خط قبلی) در محل مکاننما. با ارائه یک آرگومان n، کلمه nام از دستور قبلی درج میشود (کلمات در دستور قبلی با کلمه ۰ آغاز میشوند). یک آرگومان منفی، کلمه nام از انتهای دستور قبلی را درج میکند. پس از محاسبه آرگومان n، این دستور از امکانات بسط تاریخچه برای استخراج کلمه nام استفاده میکند، گویی که بسط تاریخچه “!n” مشخص شده است.
- yank-last-arg (M-., M-_)
- درج آخرین آرگومان دستور قبلی (آخرین کلمه از مدخل قبلی در تاریخچه). با یک آرگومان عددی، دقیقاً مانند yank-nth-arg رفتار میکند. فراخوانیهای پیاپی yank-last-arg در فهرست تاریخچه به عقب حرکت کرده و آخرین کلمه (یا کلمه مشخصشده توسط آرگومان نخستین فراخوانی) هر خط را به نوبت درج میکند. هر آرگومان عددی ارائه شده به این فراخوانیهای پیاپی، جهت حرکت در تاریخچه را تعیین میکند. یک آرگومان منفی جهت حرکت در تاریخچه را تغییر میدهد (رو به عقب یا جلو). این دستور از امکانات بسط تاریخچه برای استخراج آخرین کلمه استفاده میکند، گویی که بسط تاریخچه “!$” مشخص شده است.
- shell-expand-line (M-C-e)
- بسط خط با اجرای بسطهای کلمات پوسته. این عملیات بسط نامهای مستعار و تاریخچه، نقلقولهای $'string' و $"string"، بسط مدک (tilde expansion)، بسط پارامتر و متغیر، بسط حسابی، جایگزینی دستور و فرایند، تفکیک کلمات و حذف نقلقول را اجرا میکند. یک آرگومان صریح مانع از جایگزینی دستور و فرایند میشود. بخش بسط تاریخچه (HISTORY EXPANSION) را در ادامه برای شرح بسط تاریخچه ببینید.
- history-expand-line (M-^)
- اجرای بسط تاریخچه بر روی خط فعلی. بخش بسط تاریخچه (HISTORY EXPANSION) را در ادامه برای شرح بسط تاریخچه ببینید.
- magic-space
- اجرای بسط تاریخچه بر روی خط فعلی و درج یک فاصله (space). بخش بسط تاریخچه (HISTORY EXPANSION) را در ادامه برای شرح بسط تاریخچه ببینید.
- alias-expand-line
- اجرای بسط نام مستعار بر روی خط فعلی. بخش نامهای مستعار (ALIASES) را در بالا برای شرح بسط نام مستعار ببینید.
- history-and-alias-expand-line
- اجرای بسط تاریخچه و نام مستعار بر روی خط فعلی.
- insert-last-argument (M-., M-_)
- مترادفی برای yank-last-arg.
- edit-and-execute-command (C-x C-e)
- فراخوانی یک ویرایشگر بر روی خط فرمان فعلی و اجرای نتیجه به عنوان دستورات پوسته. Bash تلاش میکند تا به ترتیب $VISUAL، $EDITOR و emacs را به عنوان ویرایشگر فراخوانی کند.
دستورات مربوط به تغییر متن
- end-of-file (معمولاً C-d)
- نویسه نشاندهنده پایان فایل (end-of-file) همانطور که مثلاً توسط stty(1) تنظیم شده است. اگر این نویسه هنگامی خوانده شود که هیچ نویسهای روی سطر وجود ندارد و مکاننما (point) در ابتدای سطر باشد، readline آن را به عنوان پایان ورودی تفسیر کرده و EOF را برمیگرداند.
- delete-char (C-d)
- حذف نویسه در موقعیت مکاننما. اگر این تابع به همان نویسهای مقید (bound) شده باشد که نویسه EOF در tty است، همانطور که معمولاً C-d چنین است، برای مشاهده اثرات آن به بالا مراجعه کنید. این دستور ممکن است در برخی صفحهکلیدها به کلید Delete نیز مقید شده باشد.
- backward-delete-char (Rubout)
- حذف نویسه پشت مکاننما. هنگامی که یک آرگومان عددی داده شود، متن حذفشده را در حلقه حذف (kill ring) ذخیره میکند.
- forward-backward-delete-char
- حذف نویسه زیر مکاننما، مگر اینکه مکاننما در انتهای سطر باشد که در این صورت نویسه پشت مکاننما حذف میشود.
- quoted-insert (C-q, C-v)
- افزودن نویسه بعدی تایپشده به سطر به صورت تحتاللفظی و عیناً. به عنوان مثال، برای درج نویسههایی مانند C-q از این روش استفاده میشود.
- tab-insert (C-v TAB)
- درج یک نویسه تب (tab).
- self-insert (a, b, A, 1, !, ...)
- درج نویسه تایپشده.
- bracketed-paste-begin
- این تابع برای پیوند به توالی فرار (escape sequence) موسوم به “bracketed paste” که توسط برخی پایانهها ارسال میشود در نظر گرفته شده است، و چنین قیدی بهطور پیشفرض اختصاص داده شده است. این قابلیت به readline اجازه میدهد تا متن جایگذاریشده (pasted) را به عنوان یک واحد منفرد درج کند بدون اینکه با هر نویسه طوری رفتار شود که گویی از صفحهکلید خوانده شده است. نویسههای جایگذاریشده بهگونهای درج میشوند که گویی هر یک به جای اجرای دستورات ویرایشی، به self-insert مقید شدهاند.
- قابلیت bracketed paste محدوده (region) را روی متن درجشده قرار داده و محدوده را فعال میکند.
- transpose-chars (C-t)
- کشیدن نویسه قبل از مکاننما به جلو و روی نویسه در موقعیت مکاننما، و همچنین حرکت مکاننما به سمت جلو. اگر مکاننما در انتهای سطر باشد، دو نویسه قبل از مکاننما را با هم جابهجا میکند. آرگومانهای منفی هیچ اثری ندارند.
- transpose-words (M-t)
- کشیدن کلمه قبل از مکاننما به بعد از کلمه بعد از مکاننما، و همچنین حرکت مکاننما به بعد از آن کلمه. اگر مکاننما در انتهای سطر باشد، دو کلمه آخر روی سطر را جابهجا میکند.
- shell-transpose-words (M-C-t)
- کشیدن کلمه قبل از مکاننما به بعد از کلمه بعد از مکاننما، و همچنین حرکت مکاننما به بعد از آن کلمه. اگر نقطه درج در انتهای سطر باشد، دو کلمه آخر روی سطر را جابهجا میکند. مرزهای کلمات همانند shell-forward-word و shell-backward-word هستند.
- upcase-word (M-u)
- بزرگ کردن حروف کلمه فعلی (یا کلمه بعدی). با یک آرگومان منفی، حروف کلمه قبلی را بزرگ میکند، اما مکاننما را جابهجا نمیکند.
- downcase-word (M-l)
- کوچک کردن حروف کلمه فعلی (یا کلمه بعدی). با یک آرگومان منفی، حروف کلمه قبلی را کوچک میکند، اما مکاننما را جابهجا نمیکند.
- capitalize-word (M-c)
- بزرگ کردن حرف اول کلمه فعلی (یا کلمه بعدی). با یک آرگومان منفی، حرف اول کلمه قبلی را بزرگ میکند، اما مکاننما را جابهجا نمیکند.
- overwrite-mode
- تغییر وضعیت حالت بازنویسی (overwrite mode). با یک آرگومان عددی صریح مثبت، به حالت بازنویسی سوئیچ میکند. با یک آرگومان عددی صریح غیرمثبت، به حالت درج (insert mode) سوئیچ میکند. این دستور تنها روی حالت emacs تأثیر میگذارد؛ حالت vi بازنویسی را به شیوه متفاوتی انجام میدهد. هر فراخوانی به readline() در حالت درج آغاز میشود.
- در حالت بازنویسی، نویسههای مقید به self-insert به جای هل دادن متن به سمت راست، متن در موقعیت مکاننما را جایگزین میکنند. نویسههای مقید به backward-delete-char نویسه قبل از مکاننما را با یک فاصله (space) جایگزین میکنند. بهطور پیشفرض، این دستور نامقید (unbound) است، اما در برخی صفحهکلیدها ممکن است به کلید Insert مقید شده باشد.
برش و چسباندن (Killing and Yanking)
- kill-line (C-k)
- برش متن از مکاننما (point) تا انتهای خط جاری. با یک آرگومان عددی منفی، برش رو به عقب از مکاننما تا ابتدای خط انجام میشود.
- backward-kill-line (C-x Rubout)
- برش رو به عقب تا ابتدای خط جاری. با یک آرگومان عددی منفی، برش رو به جلو از مکاننما تا انتهای خط انجام میشود.
- unix-line-discard (C-u)
- برش رو به عقب از مکاننما تا ابتدای خط، و ذخیره کردن متن بریدهشده در حلقه برش (kill-ring).
- kill-whole-line
- برش تمام نویسههای خط جاری، صرفنظر از اینکه مکاننما کجاست.
- kill-word (M-d)
- برش از مکاننما تا انتهای کلمه جاری، یا در صورتی که بین کلمات باشد، تا انتهای کلمه بعدی. مرزهای کلمه همان مرزهای استفادهشده توسط forward-word هستند.
- backward-kill-word (M-Rubout)
- برش کلمه ماقبل مکاننما. مرزهای کلمه همان مرزهای استفادهشده توسط backward-word هستند.
- shell-kill-word (M-C-d)
- برش از مکاننما تا انتهای کلمه جاری، یا در صورتی که بین کلمات باشد، تا انتهای کلمه بعدی. مرزهای کلمه همان مرزهای استفادهشده توسط shell-forward-word هستند.
- shell-backward-kill-word
- برش کلمه ماقبل مکاننما. مرزهای کلمه همان مرزهای استفادهشده توسط shell-backward-word هستند.
- unix-word-rubout (C-w)
- برش کلمه ماقبل مکاننما با استفاده از فاصله خالی (white space) به عنوان مرز کلمه، و ذخیره کردن متن بریدهشده در حلقه برش (kill-ring).
- unix-filename-rubout
- برش کلمه ماقبل مکاننما با استفاده از فاصله خالی و نویسه ممیز (slash) به عنوان مرزهای کلمه، و ذخیره کردن متن بریدهشده در حلقه برش (kill-ring).
- delete-horizontal-space (M-\)
- حذف تمام فاصلهها و تبهای اطراف مکاننما.
- kill-region
- برش متن موجود در ناحیه (region) جاری.
- copy-region-as-kill
- کپی کردن متن موجود در ناحیه به میانگیر برش (kill buffer)، بهطوریکه بتوان بلافاصله آن را چسباند (yank کرد).
- copy-backward-word
- کپی کردن کلمه ماقبل مکاننما به میانگیر برش. مرزهای کلمه همانند backward-word هستند.
- copy-forward-word
- کپی کردن کلمه مابعد مکاننما به میانگیر برش. مرزهای کلمه همانند forward-word هستند.
- yank (C-y)
- چسباندن متن بالای حلقه برش به میانگیر در محل مکاننما.
- yank-pop (M-y)
- چرخش حلقه برش، و چسباندن متن جدید بالای آن. فقط پس از yank یا yank-pop عمل میکند.
آرگومانهای عددی (Numeric Arguments)
- digit-argument (M-0, M-1, ..., M--)
- افزودن این رقم به آرگومانی که از قبل در حال انباشت است، یا شروع یک آرگومان جدید. M-- یک آرگومان منفی را آغاز میکند.
- universal-argument
- این روش دیگری برای مشخص کردن یک آرگومان است. اگر پس از این دستور یک یا چند رقم بیاید، که میتواند اختیاری همراه با علامت منفی در ابتدا باشد، آن ارقام آرگومان را تعیین میکنند. اگر پس از دستور ارقامی بیاید، اجرای مجدد universal-argument به آرگومان عددی پایان میدهد، اما در غیر این صورت نادیده گرفته میشود. به عنوان یک حالت خاص، اگر بلافاصله پس از این دستور نویسهای بیاید که نه رقم باشد و نه علامت منفی، شمارش آرگومان برای دستور بعدی در چهار ضرب میشود. شمارش آرگومان در ابتدا یک است، بنابراین اجرای این تابع برای بار نخست شمارش آرگومان را چهار میکند، بار دوم شمارش آرگومان را شانزده میکند، و به همین ترتیب ادامه مییابد.
تکمیل کردن (Completing)
- complete (TAB)
- تلاش برای انجام تکمیل روی متن قبل از مکاننما (point). Bash تکمیل را ابتدا با بررسی هرگونه تکمیل برنامهپذیر برای کلمه دستور آغاز میکند (به Programmable Completion در زیر مراجعه کنید)، در غیر این صورت به نوبت با متن به عنوان یک متغیر (اگر متن با $ شروع شود)، نام کاربری (اگر متن با ~ شروع شود)، نام میزبان (اگر متن با @ شروع شود)، یا دستور (شامل نامهای مستعار، توابع و دستورات توکار) رفتار میکند. اگر هیچکدام از اینها تطابقی ایجاد نکند، به تکمیل نام فایل برمیگردد.
- possible-completions (M-?)
- تکمیلهای ممکن برای متن قبل از مکاننما را فهرست میکند. هنگام نمایش تکمیلها، readline تعداد ستونهای مورد استفاده برای نمایش را به ترتیب اولویت با مقدار completion-display-width، مقدار متغیر پوسته COLUMNS، یا عرض صفحه نمایش تنظیم میکند.
- insert-completions (M-*)
- تمام تکمیلهای متن قبل از مکاننما را که توسط possible-completions تولید میشدند، با فاصله (space) از یکدیگر درج میکند.
- مشابه complete است، اما کلمهای را که باید تکمیل شود با یک تطابق واحد از فهرست تکمیلهای ممکن جایگزین میکند. اجرای مکرر menu-complete در فهرست تکمیلهای ممکن گام برمیدارد و هر تطابق را به نوبت درج میکند. در انتهای فهرست تکمیلها، menu-complete زنگ را به صدا درمیآورد (بسته به تنظیمات bell-style) و متن اصلی را بازیابی میکند. یک آرگومان n به اندازه n موقعیت در فهرست تطابقها به جلو میرود؛ یک آرگومان منفی در فهرست به عقب حرکت میکند. این دستور برای انتساب به کلید TAB در نظر گرفته شده است، اما به طور پیشفرض منتسب نشده است.
- مشابه menu-complete است، اما در فهرست تکمیلهای ممکن به عقب حرکت میکند، گویی به menu-complete یک آرگومان منفی داده شده است. این دستور به طور پیشفرض منتسب نشده است.
- export-completions
- تکمیل را روی کلمه قبل از مکاننما همانطور که در بالا توضیح داده شد انجام میدهد و فهرست تکمیلهای ممکن را در جریان خروجی readline با قالب زیر و نوشتن اطلاعات در خطوط جداگانه مینویسد:
- تعداد تطابقها N؛
- کلمهای که در حال تکمیل است؛
- S:E، که در آن S و E آفستهای شروع و پایان کلمه در بافر خط readline هستند؛ سپس
- هر تطابق، یک مورد در هر خط
- اگر تطابقی وجود نداشته باشد، اولین خط “0” خواهد بود و این دستور هیچ خروجی دیگری بعد از S:E چاپ نمیکند. اگر فقط یک تطابق وجود داشته باشد، یک خط شامل آن چاپ میکند. اگر بیش از یک تطابق وجود داشته باشد، پیشوند مشترک تطابقها را که ممکن است خالی باشد، در اولین خط بعد از S:E چاپ میکند، سپس تطابقها را در خطوط بعدی قرار میدهد. در این حالت، N شامل خط اول با پیشوند مشترک خواهد بود.
- کاربر یا برنامه کاربردی باید بتواند احتمال وجود یک خط خالی را مدیریت کند. هدف این است که کاربر یا برنامه کاربردی N خط را پس از خط حاوی S:E برای دریافت فهرست تطابق بخواند. این دستور به طور پیشفرض منتسب نشده است.
- delete-char-or-list
- اگر در ابتدا یا انتهای خط نباشد، کاراکتر زیر مکاننما را حذف میکند (مانند delete-char). در انتهای خط، دقیقاً مانند possible-completions رفتار میکند. این دستور به طور پیشفرض منتسب نشده است.
- complete-filename (M-/)
- برای تکمیل نام فایل روی متن قبل از مکاننما تلاش میکند.
- possible-filename-completions (C-x /)
- فهرستی از تکمیلهای ممکن را برای متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام فایل، نمایش میدهد.
- complete-username (M-~)
- برای تکمیل متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام کاربری، تلاش میکند.
- possible-username-completions (C-x ~)
- فهرستی از تکمیلهای ممکن را برای متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام کاربری، نمایش میدهد.
- complete-variable (M-$)
- برای تکمیل متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان یک متغیر پوسته، تلاش میکند.
- possible-variable-completions (C-x $)
- فهرستی از تکمیلهای ممکن را برای متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان یک متغیر پوسته، نمایش میدهد.
- complete-hostname (M-@)
- برای تکمیل متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام میزبان (hostname)، تلاش میکند.
- possible-hostname-completions (C-x @)
- فهرستی از تکمیلهای ممکن را برای متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام میزبان، نمایش میدهد.
- complete-command (M-!)
- برای تکمیل متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام دستور، تلاش میکند. تکمیل دستور تلاش میکند تا متن را بهترتیب با نامهای مستعار، کلمات رزرو شده، توابع پوسته، دستورات توکار پوسته و در نهایت نام فایلهای اجرایی تطبیق دهد.
- possible-command-completions (C-x !)
- فهرستی از تکمیلهای ممکن را برای متن قبل از مکاننما، با در نظر گرفتن آن بهعنوان نام دستور، نمایش میدهد.
- dynamic-complete-history (M-TAB)
- برای تکمیل متن قبل از مکاننما با مقایسه متن با مدخلهای فهرست تاریخچه جهت یافتن تطابقهای احتمالی تکمیل، تلاش میکند.
- dabbrev-expand
- برای تکمیل منویی (menu completion) روی متن قبل از مکاننما با مقایسه متن با خطوطی از فهرست تاریخچه جهت یافتن تطابقهای احتمالی تکمیل، تلاش میکند.
- complete-into-braces (M-{)
- تکمیل نام فایل را انجام داده و فهرست تکمیلهای ممکن را درون آکولادها قرار میدهد تا این فهرست در دسترس پوسته قرار گیرد (بخش بسط آکولاد (Brace Expansion) در بالا را ببینید).
ماکروهای صفحهکلید (Keyboard Macros)
- start-kbd-macro (C-x ()
- شروع به ذخیره نویسههای تایپشده در ماکروی صفحهکلید فعلی میکند.
- end-kbd-macro (C-x ))
- ذخیره نویسههای تایپشده در ماکروی صفحهکلید فعلی را متوقف کرده و تعریف آن را ذخیره میکند.
- call-last-kbd-macro (C-x e)
- آخرین ماکروی صفحهکلید تعریفشده را مجدداً اجرا میکند، بهگونهای که نویسههای موجود در ماکرو مانند نویسههای تایپشده از صفحهکلید عمل میکنند.
- print-last-kbd-macro ()
- آخرین ماکروی صفحهکلید تعریفشده را در قالبی مناسب برای فایل inputrc چاپ میکند.
متفرقه (Miscellaneous)
- re-read-init-file (C-x C-r)
- محتویات فایل inputrc را میخواند و هرگونه کلید مقیدشده (bindings) یا انتساب متغیر موجود در آن را اعمال میکند.
- abort (C-g)
- دستور ویرایشی فعلی را لغو کرده و زنگ ترمینال را به صدا درمیآورد (بسته به تنظیمات bell-style).
- do-lowercase-version (M-A, M-B, M-x, ...)
- اگر نویسه متا شده x بزرگ باشد، دستوری را اجرا میکند که به نویسه کوچک متای متناظر مقید شده است. اگر x از قبل کوچک باشد، رفتار تعریفنشده است.
- prefix-meta (ESC)
- کاراکتر تایپشده بعدی را مِتا (Metafy) میکند. ESC f معادل است با Meta-f.
- undo (C-_, C-x C-u)
- واگردانی (undo) گامبهگام، که بهطور جداگانه برای هر خط بهخاطر سپرده میشود.
- revert-line (M-r)
- واگردانی تمام تغییرات ایجادشده در این خط. این عمل مانند اجرای دستور undo به تعداد دفعات کافی است تا خط به حالت اولیه خود بازگردد.
- tilde-expand (M-&)
- انجام بسط تیلدا روی کلمه جاری.
- set-mark (C-@, M-<space>)
- تنظیم علامت (mark) در موقعیت مکاننما (point). اگر یک آرگومان عددی ارائه شود، علامت روی آن موقعیت تنظیم میشود.
- exchange-point-and-mark (C-x C-x)
- جابجایی مکاننما با علامت. موقعیت فعلی مکاننما روی موقعیت ذخیرهشده تنظیم میشود، سپس علامت روی موقعیت قبلی مکاننما قرار میگیرد.
- character-search (C-])
- یک کاراکتر را میخواند و مکاننما را به وقوع بعدی آن کاراکتر منتقل میکند. یک آرگومان منفی، وقوعهای قبلی را جستجو میکند.
- character-search-backward (M-C-])
- یک کاراکتر را میخواند و مکاننما را به وقوع قبلی آن کاراکتر منتقل میکند. یک آرگومان منفی، وقوعهای بعدی را جستجو میکند.
- skip-csi-sequence
- به تعداد کافی کاراکتر میخواند تا یک توالی چندکلیدی مانند توالیهای تعریفشده برای کلیدهایی نظیر Home و End را مصرف کند. توالیهای CSI با یک نشانگر توالی کنترلی (CSI) آغاز میشوند، معمولاً ESC [. اگر این توالی به “\e[” مقید (bound) شده باشد، کلیدهایی که توالیهای CSI تولید میکنند هیچ تأثیری نخواهند داشت مگر اینکه صراحتاً به یک دستور readline مقید شده باشند، بهجای اینکه کاراکترهای سرگردان را وارد بافر ویرایش کنند. این دستور بهطور پیشفرض مقید نشده است، اما معمولاً به ESC [ مقید میشود.
- insert-comment (M-#)
- بدون یک آرگومان عددی، مقدار متغیر comment-begin در readline را در ابتدای خط جاری درج میکند. اگر یک آرگومان عددی ارائه شود، این دستور بهصورت یک کلید دومنظوره (toggle) عمل میکند: اگر کاراکترهای ابتدای خط با مقدار comment-begin مطابقت نداشته باشند، مقدار را درج میکند؛ در غیر این صورت کاراکترهای موجود در comment-begin را از ابتدای خط حذف میکند. در هر دو حالت، خط بهگونهای پذیرفته میشود که گویی یک نویسه خطجدید (newline) تایپ شده است. مقدار پیشفرض comment-begin باعث میشود این دستور خط جاری را به یک توضیح (کامنت) پوسته تبدیل کند. اگر یک آرگومان عددی باعث حذف کاراکتر توضیح شود، خط توسط پوسته اجرا خواهد شد.
- spell-correct-word (C-x s)
- تصحیح املایی را روی کلمه جاری انجام میدهد، و با آن بهعنوان یک دایرکتوری یا نام فایل رفتار میکند، دقیقاً به همان روش گزینه پوستهای cdspell. مرزهای کلمات همانهایی هستند که توسط shell-forward-word استفاده میشوند.
- glob-complete-word (M-g)
- با کلمه قبل از مکاننما بهعنوان یک الگو برای بسط نام مسیر رفتار میکند، در حالی که یک علامت ستاره بهطور ضمنی به آن اضافه شده است، سپس از این الگو برای ایجاد فهرستی از نامهای فایل منطبق جهت تکمیلهای ممکن استفاده میکند.
- glob-expand-word (C-x *)
- با کلمه قبل از مکاننما بهعنوان یک الگو برای بسط نام مسیر رفتار میکند، و فهرست نامهای فایل منطبق را درج کرده، و آن را جایگزین کلمه میکند. اگر یک آرگومان عددی ارائه شود، قبل از بسط نام مسیر، یک * به آن اضافه میکند.
- glob-list-expansions (C-x g)
- فهرست بسطهایی که توسط glob-expand-word تولید میشدند را نمایش میدهد و خط را مجدداً بازنمایی میکند. اگر یک آرگومان عددی ارائه شود، قبل از بسط نام مسیر، یک * به آن اضافه میکند.
- dump-functions
- چاپ تمام توابع و کلیدهای مقید به آنها در جریان خروجی readline. اگر یک آرگومان عددی ارائه شود، خروجی به گونهای قالببندی میشود که بتوان آن را بخشی از یک فایل inputrc قرار داد.
- dump-variables
- تمام متغیرهای قابل تنظیم readline و مقادیر آنها را در جریان خروجی readline چاپ میکند. اگر یک آرگومان عددی ارائه شود، خروجی به گونهای قالببندی میشود که بتواند بخشی از یک فایل inputrc قرار گیرد.
- dump-macros
- تمام توالیهای کلیدی readline مقید شده به ماکروها و رشتههایی که خروجی میدهند را در جریان خروجی readline چاپ میکند. اگر یک آرگومان عددی ارائه شود، خروجی به گونهای قالببندی میشود که بتواند بخشی از یک فایل inputrc قرار گیرد.
- execute-named-command (M-x)
- یک نام دستور قابل پیوند readline را از ورودی خوانده و تابعی را که به آن پیوند خورده است اجرا میکند، گویی که توالی کلیدی مقید شده به آن در ورودی ظاهر شده است. اگر به این تابع یک آرگومان عددی داده شود، آن آرگومان را به تابعی که اجرا میکند پاس میدهد.
- display-shell-version (C-x C-v)
- اطلاعات نسخه نمونه فعلی bash را نمایش میدهد.
تکمیل برنامهپذیر (Programmable Completion)
هنگامی که یک کاربر اقدام به تکمیل کلمه برای یک دستور یا یک آرگومان برای دستوری میکند که یک مشخصه تکمیل (یک compspec) برای آن با استفاده از دستور توکار complete تعریف شده است (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) در زیر را ببینید)، readline امکانات تکمیل برنامهپذیر را فراخوانی میکند.
نخست، bash نام دستور را شناسایی میکند. اگر یک compspec برای آن دستور تعریف شده باشد، آن compspec برای تولید فهرست تکمیلهای ممکن برای کلمه استفاده میشود. اگر کلمه دستور یک رشته خالی باشد (تلاش برای تکمیل در ابتدای یک خط خالی انجام شود)، bash از هر compspec تعریف شده با گزینه -E برای complete استفاده میکند. گزینه -I برای complete نشان میدهد که کلمه دستور، نخستین کلمه غیر از انتساب در خط، یا پس از یک جداکننده دستور مانند ; یا | است. این مورد معمولاً نشاندهنده تکمیل نام دستور است.
اگر کلمه دستور یک نام مسیر کامل باشد، bash ابتدا به دنبال یک compspec برای نام مسیر کامل میگردد. اگر هیچ compspecای برای نام مسیر کامل وجود نداشته باشد، bash تلاش میکند یک compspec برای بخشِ پس از اسلش نهایی بیابد. اگر این جستجوها به یک compspec منجر نشوند، یا اگر هیچ compspecای برای کلمه دستور وجود نداشته باشد، bash از هر compspec تعریف شده با گزینه -D برای complete به عنوان پیشفرض استفاده میکند. اگر هیچ compspec پیشفرضی وجود نداشته باشد، bash به عنوان آخرین راهکار بسط نام مستعار (alias) را روی کلمه دستور انجام میدهد، و تلاش میکند یک compspec برای کلمه دستورِ حاصل از هرگونه بسط موفقیتآمیز پیدا کند.
اگر یک compspec پیدا نشود، bash تکمیل پیشفرض خود را مطابق آنچه در بالا ذیل تکمیل (Completing) شرح داده شد انجام میدهد. در غیر این صورت، پس از پیدا شدن یک compspec، bash از آن برای تولید فهرست کلمات منطبق استفاده میکند.
نخست، bash کنشها (actions) مشخصشده توسط compspec را اجرا میکند. این کار فقط مواردی را برمیگرداند که پیشوند کلمه در حال تکمیل باشند. هنگامی که گزینه -f یا -d برای تکمیل نام فایل یا نام دایرکتوری استفاده میشود، bash از متغیر پوسته FIGNORE برای فیلتر کردن تطابقها استفاده میکند.
سپس، تکمیل برنامهپذیر تطابقهای مشخصشده توسط یک الگوی بسط مسیر ارائهشده به عنوان یک آرگومان به گزینه -G را تولید میکند. کلمات تولید شده توسط الگو لزومی ندارد با کلمه در حال تکمیل مطابقت داشته باشند. Bash از متغیر FIGNORE برای فیلتر کردن تطابقها استفاده میکند، اما از متغیر پوسته GLOBIGNORE استفاده نمیکند.
سپس، تکمیل خودکار رشتهٔ مشخصشده بهعنوان آرگومان گزینهٔ -W را بررسی میکند. این رشته ابتدا با استفاده از نویسههای موجود در متغیر ویژهٔ IFS بهعنوان جداکننده، تفکیک میشود. این کار از نقلقولهای پوسته درون رشته پیروی میکند تا سازوکاری فراهم کند که کلمات بتوانند شامل فرانویسههای پوسته یا نویسههای موجود در مقدار IFS باشند. سپس هر کلمه با استفاده از بسط قلاب، بسط مدک (تیلدا)، بسط پارامتر و متغیر، جایگزینی دستور و بسط حسابی، همانطور که در بالا تحت عنوان بسط (EXPANSION) توضیح داده شد، بسط مییابد. نتایج با استفاده از قواعد شرح داده شده در بالا ذیل تفکیک کلمات (Word Splitting) تفکیک میشوند. نتایج بسط با کلمهٔ در حال تکمیل بهصورت پیشوندی تطبیق داده میشوند، و کلمات منطبق به تکمیلهای ممکن تبدیل میگردند.
پس از ایجاد این تطابقها، bash هر تابع یا دستور پوستهای را که با گزینههای -F و -C مشخص شده باشد اجرا میکند. هنگامی که دستور یا تابع فراخوانی میشود، bash مقدارهایی را به متغیرهای COMP_LINE، COMP_POINT، COMP_KEY، و COMP_TYPE همانطور که در بالا ذیل متغیرهای پوسته (Shell Variables) توضیح داده شد، تخصیص میدهد. اگر یک تابع پوسته در حال فراخوانی باشد، bash همچنین متغیرهای COMP_WORDS و COMP_CWORD را تنظیم میکند. هنگام فراخوانی تابع یا دستور، اولین آرگومان ($1) نام دستوری است که آرگومانهای آن در حال تکمیل است، دومین آرگومان ($2) کلمهٔ در حال تکمیل است، و سومین آرگومان ($3) کلمهٔ پیش از کلمهٔ در حال تکمیل در خط فرمان فعلی است. هیچ فیلتر کردنی روی تکمیلهای تولیدشده در برابر کلمهٔ در حال تکمیل انجام نمیشود؛ تابع یا دستور آزادی کامل در تولید تطابقها دارد و نیازی نیست که آنها با پیشوندی از کلمه مطابقت داشته باشند.
هر تابعی که با -F مشخص شده باشد ابتدا فراخوانی میشود. تابع ممکن است از هر یک از امکانات پوسته، از جمله دستورات توکار compgen و compopt که در ادامه شرح داده شدهاند، برای تولید تطابقها استفاده کند. این تابع باید تکمیلهای ممکن را در متغیر آرایهای COMPREPLY قرار دهد، هر تکمیل در یک عنصر از آرایه.
سپس، هر دستوری که با گزینهٔ -C مشخص شده باشد، در محیطی معادل جایگزینی دستور فراخوانی میشود. این دستور باید فهرستی از تکمیلها را، هر کدام در یک خط، در خروجی استاندارد چاپ کند. یک بکاسلش در صورت لزوم خط جدید را اسکیپ (بیاثر) خواهد کرد. این موارد به مجموعهٔ تکمیلهای ممکن اضافه میشوند.
پس از تولید تمام تکمیلهای ممکن، bash هر فیلتری را که با گزینهٔ -X مشخص شده باشد روی تکمیلهای موجود در فهرست اعمال میکند. این فیلتر الگویی است همانطور که برای بسط نام مسیر استفاده میشود؛ یک & در الگو با متن کلمهٔ در حال تکمیل جایگزین میشود. یک & واقعی را میتوان با یک بکاسلش اسکیپ کرد؛ بکاسلش پیش از اقدام به تطبیق حذف میشود. هر تکمیلی که با الگو مطابقت داشته باشد از فهرست حذف میشود. یک ! در ابتدای الگو آن را نقیض میکند؛ در این حالت bash هر تکمیلی را که با الگو مطابقت نداشته باشد حذف میکند. اگر گزینهٔ پوستهٔ nocasematch فعال باشد، bash تطبیق را بدون در نظر گرفتن بزرگی و کوچکی حروف الفبا انجام میدهد.
در نهایت، تکمیل برنامهپذیر هر پیشوند و پسوند مشخصشده با گزینههای -P و -S را به ترتیب به هر مورد تکمیل اضافه میکند، و نتیجه را به عنوان فهرست تکمیلهای احتمالی به readline بازمیگرداند.
اگر اقداماتی که قبلاً اعمال شدهاند هیچ تطابقی ایجاد نکنند، و گزینه -o dirnames هنگام تعریف compspec به complete داده شده باشد، bash تکمیل نام دایرکتوری را امتحان میکند.
اگر گزینه -o plusdirs هنگام تعریف compspec به complete داده شده باشد، bash تکمیل نام دایرکتوری را امتحان میکند و هرگونه تطابق را به مجموعه تکمیلهای احتمالی اضافه میکند.
بهطور پیشفرض، اگر یک compspec پیدا شود، هر آنچه که تولید کند به عنوان مجموعه کامل تکمیلهای احتمالی به کد تکمیل بازگردانده میشود. تکمیلهای پیشفرض bash و پیشفرض readline برای تکمیل نام فایل غیرفعال میشوند. اگر گزینه -o bashdefault هنگام تعریف compspec به complete داده شده باشد، و compspec هیچ تطابقی ایجاد نکند، bash تکمیلهای پیشفرض خود را امتحان میکند. اگر compspec و (در صورت امتحان شدن) تکمیلهای پیشفرض bash هیچ تطابقی ایجاد نکنند، و گزینه -o default هنگام تعریف compspec به complete داده شده باشد، تکمیل برنامهپذیر، تکمیل پیشفرض readline را انجام میدهد.
گزینههای دادهشده به complete و compopt میتوانند نحوه رفتار readline با تکمیلها را کنترل کنند. به عنوان مثال، گزینه -o fullquote به readline میگوید که موارد تطابق را طوری نقلقول کند که گویی نام فایل هستند. برای جزئیات بیشتر به توضیحات مربوط به complete در زیر مراجعه کنید.
هنگامی که یک compspec مشخص میکند که خواستار تکمیل نام دایرکتوری است، توابع تکمیل برنامهپذیر، readline را وادار میکنند تا به نامهای تکمیلشدهای که پیوندهای نمادین به دایرکتوریها هستند یک اسلش الحاق کند، که این تابع مقدار متغیر readline به نام mark-directories است، صرفنظر از تنظیم متغیر readline به نام mark-symlinked-directories.
پشتیبانیهایی برای تغییر پویا در تکمیلها وجود دارد. این قابلیت بیشترین کاربرد را در ترکیب با یک تکمیل پیشفرض دارد که با complete -D مشخص شده است. این امکان برای توابع پوستهای که به عنوان توابع تکمیل اجرا میشوند وجود دارد که با بازگرداندن وضعیت خروج 124 نشان دهند که تکمیل باید دوباره امتحان شود. اگر یک تابع پوسته 124 را بازگرداند، و compspec مرتبط با دستوری را که تکمیل روی آن در حال امتحان است تغییر دهد (که به عنوان اولین آرگومان هنگام اجرای تابع ارسال میشود)، تکمیل برنامهپذیر از ابتدا مجدداً آغاز میشود و تلاش میکند تا یک compspec جدید برای آن دستور پیدا کند. از این ویژگی میتوان برای ساخت پویا یک مجموعه تکمیل هنگام تلاش برای تکمیل استفاده کرد، بهجای اینکه همه آنها یکباره بارگذاری شوند.
به عنوان مثال، با فرض وجود کتابخانهای از compspecها، که هر کدام در فایلی متناظر با نام دستور نگهداری میشوند، تابع تکمیل پیشفرض زیر تکمیلها را بهصورت پویا بارگذاری میکند:
_completion_loader()
{
. "/etc/bash_completion.d/$1.sh"
\
>/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader
\
-o bashdefault -o default
تاریخچه (HISTORY)
هنگامی که گزینه -o history برای دستور توکار set فعال باشد، پوسته دسترسی به تاریخچه دستورات، یعنی فهرست دستوراتی که پیشتر تایپ شدهاند را فراهم میکند. مقدار متغیر HISTSIZE به عنوان تعداد دستورات جهت ذخیره در فهرست تاریخچه استفاده میشود: پوسته متن آخرین دستورات به تعداد HISTSIZE را ذخیره میکند (پیشفرض 500). پوسته هر دستور را قبل از بسط پارامتر و متغیر (به EXPANSION در بالا مراجعه کنید) اما پس از انجام بسط تاریخچه، و با در نظر گرفتن مقادیر متغیرهای پوسته HISTIGNORE و HISTCONTROL، در فهرست تاریخچه ذخیره میکند.
هنگام راهاندازی، bash فهرست تاریخچه را با خواندن مدخلهای تاریخچه از فایلی که نام آن در متغیر HISTFILE مشخص شده است (پیشفرض ~/.bash_history) مقداردهی اولیه میکند. به این فایل فایل تاریخچه (history file) گفته میشود. فایل تاریخچه در صورت نیاز کوتاه (truncate) میشود تا تعداد مدخلهای تاریخچه موجود در آن از مقداری که توسط متغیر HISTFILESIZE مشخص شده است بیشتر نباشد. اگر HISTFILESIZE تنظیم نشده باشد، یا روی مقدار تهی (null)، یک مقدار غیرعددی، یا یک مقدار عددی کمتر از صفر تنظیم شده باشد، فایل تاریخچه کوتاه نمیشود.
هنگام خواندن فایل تاریخچه، خطوطی که با نویسه کامنت تاریخچه آغاز شده و بلافاصله پس از آن یک رقم آمده باشد، به عنوان برچسب زمانی برای خط تاریخچه بعدی تفسیر میشوند. این برچسبهای زمانی بسته به مقدار متغیر HISTTIMEFORMAT به صورت اختیاری نمایش داده میشوند. در صورت وجود، برچسبهای زمانی تاریخچه مدخلهای تاریخچه را از یکدیگر تفکیک میکنند و امکان مدخلهای چندخطی را فراهم میسازند.
هنگامی که یک پوسته با تاریخچه فعال خارج میشود، bash آخرین $HISTSIZE مدخل را از فهرست تاریخچه در $HISTFILE کپی میکند. اگر گزینه پوسته histappend فعال باشد (توضیحات مربوط به shopt را در بخش SHELL BUILTIN COMMANDS در ادامه ببینید)، bash مدخلها را به انتهای فایل تاریخچه میافزاید (append میکند)، در غیر این صورت فایل تاریخچه را رونویسی (overwrite) میکند. اگر HISTFILE تنظیم نشده یا تهی باشد، یا اگر فایل تاریخچه غیرقابل نوشتن باشد، تاریخچه ذخیره نمیشود. پس از ذخیره تاریخچه، bash فایل تاریخچه را طبق آنچه در بالا توضیح داده شد کوتاه میکند تا خطوط آن بیشتر از HISTFILESIZE نباشد.
اگر متغیر HISTTIMEFORMAT تنظیم شده باشد، پوسته اطلاعات برچسب زمانی مرتبط با هر مدخل تاریخچه را درون فایل تاریخچه مینویسد، که با نویسه کامنت تاریخچه نشانهگذاری میشود تا برچسبهای زمانی در میان نشستهای پوسته حفظ شوند. این کار از نویسه کامنت تاریخچه برای تشخیص برچسبهای زمانی از سایر خطوط تاریخچه استفاده میکند. همانطور که در بالا ذکر شد، هنگام استفاده از HISTTIMEFORMAT، برچسبهای زمانی مدخلهای تاریخچه چندخطی را محدود و تفکیک میکنند.
دستور توکار fc (بخش SHELL BUILTIN COMMANDS را در ادامه ببینید) بخشی از فهرست تاریخچه را لیست کرده یا ویرایش و دوباره اجرا میکند. دستور توکار history میتواند فهرست تاریخچه را نمایش دهد یا اصلاح کند و فایل تاریخچه را دستکاری نماید. هنگام استفاده از ویرایش خط فرمان، دستورات جستجو در هر حالت ویرایش در دسترس هستند که دسترسی به فهرست تاریخچه را فراهم میکنند.
پوسته امکان کنترل روی اینکه کدام دستورات در فهرست تاریخچه ذخیره شوند را فراهم میکند. متغیرهای HISTCONTROL و HISTIGNORE برای ذخیره تنها زیرمجموعهای از دستورات وارد شده به کار میروند. اگر گزینه پوسته cmdhist فعال باشد، پوسته تلاش میکند تا هر خط از یک دستور چندخطی را در همان مدخل تاریخچه ذخیره کند، و در صورت نیاز نقطهویرگولها (semicolons) را برای حفظ صحت ساختاری (نحوی) اضافه میکند. گزینه پوسته lithist عملکرد cmdhist را با ذخیره کردن دستور همراه با نویسههای خط جدید جاسازیشده بهجای نقطهویرگولها تغییر میدهد. برای اطلاعات بیشتر در مورد تنظیم و لغو تنظیم گزینههای پوسته، توضیحات دستور توکار shopt را در ادامه زیر عنوان SHELL BUILTIN COMMANDS ببینید.
بسط تاریخچه (HISTORY EXPANSION)
پوسته از قابلیت بسط تاریخچه پشتیبانی میکند که شبیه به بسط تاریخچه در csh است. این بخش ویژگیهای نحوی موجود را شرح میدهد.
بسط تاریخچه بهطور پیشفرض برای پوستههای تعاملی فعال است، و میتوان آن را با استفاده از گزینهٔ +H در دستور توکار set غیرفعال کرد (بخش دستورات داخلی پوسته (SHELL BUILTIN COMMANDS) را در زیر ببینید). پوستههای غیرتعاملی بهطور پیشفرض بسط تاریخچه را انجام نمیدهند، اما میتوان آن را با “set -H” فعال نمود.
بسطهای تاریخچه، کلماتی را از فهرست تاریخچه وارد جریان ورودی میکنند، که تکرار دستورات، درج آرگومانهای یک دستور قبلی در خط ورودی فعلی، یا تصحیح سریع خطاها در دستورات پیشین را آسان میسازد.
بسط تاریخچه بلافاصله پس از خوانده شدن یک خط کامل، پیش از آنکه پوسته آن را به کلمات تجزیه کند، و بهصورت جداگانه روی هر خط انجام میشود. پوسته تلاش میکند تا توابع بسط تاریخچه را از نقلقیلهایی که هنوز از خطوط قبلی برقرار هستند مطلع سازد.
این فرآیند در دو بخش صورت میگیرد. بخش اول تعیین این است که از کدام مدخل فهرست تاریخچه هنگام جایگزینی استفاده شود. بخش دوم انتخاب قسمتهایی از آن مدخل برای گنجاندن در مدخل فعلی است.
مدخل انتخابشده از تاریخچه، رویداد (event) است، و قسمتهایی از آن مدخل که تحت عملیات قرار میگیرند، کلمات (words) نامیده میشوند. اصلاحکنندهها (modifiers) گوناگونی برای دستکاری کلمات انتخابشده در دسترس هستند. مدخل به همان شیوهای که هنگام خواندن ورودی انجام میشود به کلمات تقسیم میگردد، بهطوریکه چندین کلمهٔ جداشده با نویسهٔ متا (metacharacter) که با نقلقولها احاطه شدهاند، یک کلمه بهحساب میآیند. تعیینکنندهٔ رویداد (event designator) رویداد را انتخاب میکند، تعیینکنندهٔ کلمه (word designator) اختیاری کلمات را از رویداد برمیگزیند، و اصلاحکنندههای (modifiers) اختیاری مختلفی برای دستکاری کلمات انتخابشده موجود هستند.
بسطهای تاریخچه با ظهور نویسهٔ بسط تاریخچه آغاز میشوند، که بهطور پیشفرض ! است. بسطهای تاریخچه ممکن است در هر جای ورودی ظاهر شوند، اما تودرتو نمیشوند.
تنها بکاسلش (\) و نقلقولهای تکی میتوانند نویسهٔ بسط تاریخچه را نقلقول (کوتیشنبندی) کنند، اما اگر نویسهٔ بسط تاریخچه بلافاصله پیش از نقلقول دوتایی پایانی در یک رشته با نقلقول دوتایی بیاید نیز بهعنوان نقلقولشده تلقی میشود.
چندین نویسه اگر بلافاصله پس از نویسهٔ بسط تاریخچه دیده شوند، حتی اگر بدون نقلقول باشد، مانع از بسط تاریخچه میشوند: فاصله (space)، تب (tab)، خط جدید (newline)، بازگشت به ابتدای خط (carriage return)، =، و دیگر نویسههای متای پوسته که در بالا تعریف شدهاند.
یک اختصار ویژه برای جایگزینی وجود دارد که زمانی فعال میشود که نویسهٔ جایگزینی سریع (quick substitution) (که در بالا ذیل histchars توضیح داده شده است) اولین نویسه در خط باشد. این اختصار مدخل قبلی فهرست تاریخچه را با استفاده از تعیینکنندهٔ رویداد معادل با !! انتخاب میکند، و یک رشته را جایگزین رشتهٔ دیگری در آن مدخل مینماید. این ویژگی در ادامه ذیل تعیینکنندههای رویداد (Event Designators) شرح داده شده است. این تنها بسط تاریخچهای است که با نویسهٔ بسط تاریخچه شروع نمیشود.
چندین گزینهٔ پوسته که با دستور توکار shopt قابل تنظیم هستند، رفتار بسط تاریخچه را تغییر میدهند (توضیحات مربوط به دستور توکار shopt را در زیر ببینید). اگر گزینهٔ پوستهٔ histverify فعال باشد و از readline استفاده شود، جایگزینیهای تاریخچه بلافاصله به تجزیهکنندهٔ پوسته تحویل داده نمیشوند. در عوض، خط بسطیافته برای تغییرات بیشتر مجدداً در بافر ویرایش readline بارگذاری میشود. اگر از readline استفاده شود و گزینهٔ پوستهٔ histreedit فعال باشد، یک جایگزینی تاریخچهٔ ناموفق برای اصلاح، دوباره در بافر ویرایش readline بارگذاری میگردد.
گزینهٔ -p در دستور توکار history نشان میدهد که بسط تاریخچه قبل از اعمال چه کاری انجام خواهد داد. گزینهٔ -s در دستور توکار history دستورات را بدون اجرای واقعی به انتهای فهرست تاریخچه اضافه میکند، بهطوری که برای فراخوانیهای بعدی در دسترس باشند.
پوسته امکان کنترل کاراکترهای مختلف مورد استفاده توسط سازوکار بسط تاریخچه را فراهم میکند (توضیحات histchars در بالا زیر بخش متغیرهای پوسته (Shell Variables) را ببینید). پوسته هنگام نوشتن فایل تاریخچه، از کاراکتر توضیح تاریخچه برای علامتگذاری مهر زمانی تاریخچه استفاده میکند.
تعیینکنندههای رخداد (Event Designators)
یک تعیینکنندهٔ رخداد ارجاعی به یک مدخل در فهرست تاریخچه است. تعیینکنندهٔ رخداد شامل بخشی از کلمه است که با کاراکتر بسط تاریخچه آغاز میشود و با تعیینکنندهٔ کلمه (در صورت وجود) یا انتهای کلمه پایان میپذیرد. مگر اینکه ارجاع مطلق باشد، رخدادها نسبت به موقعیت فعلی در فهرست تاریخچه سنجیده میشوند.
- !
- آغاز یک جایگزینی تاریخچه، مگر زمانی که به دنبال آن یک blank، خط جدید، carriage return، =، یا هنگامی که گزینهٔ پوسته extglob با استفاده از دستور توکار shopt فعال شده باشد، ( بیاید.
- !n
- ارجاع به مدخل شمارهٔ n در فهرست تاریخچه.
- !-n
- ارجاع به مدخل فعلی منهای n.
- !!
- ارجاع به مدخل قبلی. این مترادفی برای “!-1” است.
- !string
- ارجاع به تازهترین دستوری قبل از موقعیت فعلی در فهرست تاریخچه که با string آغاز میشود.
- !?string[?]
- ارجاع به تازهترین دستوری قبل از موقعیت فعلی در فهرست تاریخچه که حاوی string است. در صورتی که بلافاصله پس از string یک خط جدید بیاید، ? انتهایی ممکن است حذف شود. اگر string درج نشود، از رشتهٔ آخرین جستجو استفاده میشود؛ اگر جستجوی قبلی وجود نداشته باشد، خطا محسوب میشود.
- ^string1^string2^
- جایگزینی سریع. تکرار دستور قبلی با جایگزین کردن string1 با string2. معادل با “!!:s^string1^string2^” (بخش تغییردهندهها (Modifiers) در زیر را ببینید).
- !#
- کل خط فرمانی که تاکنون تایپ شده است.
تعیینکنندههای کلمه (Word Designators)
تعیینکنندههای کلمه برای انتخاب کلمات مورد نظر از رخداد استفاده میشوند. آنها اختیاری هستند؛ اگر تعیینکنندهٔ کلمه ارائه نشود، بسط تاریخچه از کل رخداد استفاده میکند. یک : مشخصهٔ رخداد را از تعیینکنندهٔ کلمه جدا میکند. اگر تعیینکنندهٔ کلمه با یک ^، $، *، -، یا % شروع شود، ممکن است حذف گردد. کلمات از ابتدای خط شمارهگذاری میشوند، بهطوری که کلمهٔ نخست با 0 (صفر) نشان داده میشود. کلمات در حالی که با یک فاصله از یکدیگر جدا شدهاند، در خط فعلی درج میشوند.
- 0 (zero)
- کلمه صفرم. برای پوسته، این کلمه همان کلمه دستور است.
- n
- کلمه nام.
- ^
- اولین آرگومان: کلمه ۱.
- $
- آخرین کلمه. این معمولاً آخرین آرگومان است، اما اگر تنها یک کلمه در خط وجود داشته باشد، به کلمه صفرم بسط مییابد.
- %
- اولین کلمه تطبیقیافته توسط جدیدترین جستجوی “?string?” ، به شرطی که رشته جستجو با نویسهای آغاز شود که بخشی از یک کلمه است. بهطور پیشفرض، جستجوها از انتهای هر خط آغاز شده و به سمت ابتدا پیش میروند، بنابراین اولین کلمه منطبقشده، نزدیکترین کلمه به انتهای خط است.
- x-y
- محدودهای از کلمات؛ “-y” حالت اختصاری “0-y” است.
- *
- همه کلمات به جز کلمه صفرم. این مترادفی برای “1-$” است. استفاده از * اگر فقط یک کلمه در رخداد وجود داشته باشد خطا نیست؛ در این حالت به یک رشته خالی بسط مییابد.
- x*
- حالت اختصاری x-$ است.
- x-
- مانند x* حالت اختصاری x-$ است، اما کلمه آخر را حذف میکند. اگر x وجود نداشته باشد، مقدار پیشفرض آن 0 است.
اگر یک تعیینکننده کلمه بدون مشخص کردن رخداد ارائه شود، دستور قبلی بهعنوان رخداد استفاده میشود که معادل !! است.
اصلاحکنندهها (Modifiers)
پس از تعیینکننده اختیاری کلمه، بسط میتواند شامل دنبالهای از یک یا چند اصلاحکننده زیر باشد که پیش از هر یک، یک “:” قرار میگیرد. اینها کلمه یا کلمات انتخابشده از رخداد تاریخچه را اصلاح یا ویرایش میکنند.
- h
- بخش انتهایی مسیر (trailing pathname component) را حذف کرده و فقط سر (head) را باقی میگذارد.
- t
- تمام بخشهای ابتدایی مسیر را حذف کرده و فقط دم (tail) را باقی میگذارد.
- r
- پسوند انتهایی به شکل .xxx را حذف کرده و نام پایه (basename) را باقی میگذارد.
- e
- همه چیز را به جز پسوند انتهایی حذف میکند.
- p
- دستور جدید را چاپ میکند ولی آن را اجرا نمیکند.
- q
- کلمات جایگزینشده را نقلقول میکند و مانع از جایگزینیهای بعدی میشود.
- x
- کلمات جایگزینشده را مانند q نقلقول میکند، اما آنها را در محل نویسههای خالی (blanks) و خطوط جدید به کلمات مجزا میشکند. اصلاحکنندههای q و x مانعةالجمع هستند؛ بسط از آخرین موردی که ارائه شده استفاده میکند.
- s/old/new/
- مقدار new را به جای اولین رخداد old در خط رخداد جایگزین میکند. هر نویسهای میتواند بهعنوان جداکننده به جای / استفاده شود. اگر جداکننده پایانی آخرین نویسه خط رخداد باشد، اختیاری است. یک تکبکاسلش جداکننده را در old و new نقلقول (اسکیپ) میکند. اگر & در new ظاهر شود، با old جایگزین میگردد. یک تکبکاسلش نویسه & را نقلقول میکند. اگر old تهی (null) باشد، برابر با آخرین old جایگزینشده قرار میگیرد، یا اگر پیش از این هیچ جایگزینی تاریخچهای صورت نگرفته باشد، برابر با آخرین string در یک جستجوی !?string[?] قرار میگیرد. اگر new تهی باشد، هر old منطبق حذف میشود.
- &
- جایگزینی قبلی را تکرار میکند.
- g
- باعث میشود تغییرات بر روی کل خط رخداد (event line) اعمال شوند. این اصلاحگر در ترکیب با “:s” (مانند “:gs/old/new/”) یا “:&” استفاده میشود. در صورت استفاده با “:s”، میتوان از هر جداکنندهای بهجای / استفاده کرد، و اگر جداکننده پایانی آخرین نویسه خط رخداد باشد، اختیاری خواهد بود. از a میتوان بهعنوان مترادفی برای g استفاده کرد.
- G
- اصلاحگر بعدی “s” یا “&” را یکبار برای هر کلمه در خط رخداد اعمال میکند.
دستورات داخلی پوسته (SHELL BUILTIN COMMANDS)
مگر در مواردی که خلاف آن ذکر شده باشد، هر دستور توکار مستندشده در این بخش که گزینههایی با پیشوند - میپذیرد، -- را نیز برای مشخص کردن پایان گزینهها میپذیرد. دستورات توکار :، true، false، و test/[ هیچ گزینهای را نمیپذیرند و با -- رفتار ویژهای ندارند. دستورات توکار exit، logout، return، break، continue، let، و shift آرگومانهایی را که با - شروع میشوند بدون نیاز به -- پذیرفته و پردازش میکنند. سایر دستورات توکار که آرگومان میپذیرند اما صراحتاً بهعنوان پذیرنده گزینه مشخص نشدهاند، آرگومانهایی را که با - شروع میشوند بهعنوان گزینههای نامعتبر تفسیر میکنند و برای جلوگیری از این تفسیر به -- نیاز دارند.
- : [arguments]
- بدون اثر؛ این دستور کاری جز بسط arguments و انجام هرگونه تغییر مسیر مشخصشده انجام نمیدهد. وضعیت بازگشتی صفر است.
- . [-p path] filename [arguments]
- source [-p path] filename [arguments]
- دستور . (source) دستورات را از filename در محیط پوسته فعلی خوانده و اجرا میکند و وضعیت خروج آخرین دستور اجراشده از filename را بازمیگرداند.
- اگر filename حاوی اسلش نباشد، . به جستجوی آن میپردازد. اگر گزینه -p داده شده باشد، . با path مانند فهرستی از دایرکتوریها که با دونقطه از هم جدا شدهاند رفتار میکند تا filename را بیابد؛ در غیر این صورت، . از ورودیهای PATH برای یافتن دایرکتوری حاوی filename استفاده میکند. نیازی نیست که filename قابل اجرا باشد. هنگامی که bash در حالت posix نیست، چنانچه filename در PATH یافت نشود، دایرکتوری فعلی را جستجو میکند، اما اگر -p داده شده باشد، دایرکتوری فعلی را جستجو نمیکند. اگر گزینه sourcepath برای دستور توکار shopt غیرفعال شده باشد، . متغیر PATH را جستجو نمیکند.
- اگر هرگونه arguments عرضه شود، هنگام اجرای filename به پارامترهای مکانی تبدیل میشوند. در غیر این صورت، پارامترهای مکانی بدون تغییر میمانند.
- اگر گزینه -T فعال باشد، . هرگونه تله (trap) روی DEBUG را به ارث میبرد؛ در غیر این صورت، هر رشته تله DEBUG پیرامون فراخوانی . ذخیره و سپس بازیابی میشود، و . هنگام اجرا، تله DEBUG را لغو میکند. اگر -T تنظیم نشده باشد و فایل فراخوانیشده (sourced) تله DEBUG را تغییر دهد، مقدار جدید پس از اتمام . باقی میماند. وضعیت بازگشتی، وضعیت آخرین دستور اجراشده از filename است (اگر دستوری اجرا نشود، 0)، و چنانچه filename یافت نشود یا خوانده نشود، مقداری غیرصفر خواهد بود.
- alias [-p] [name[=value] ...]
- بدون هیچ آرگومانی یا همراه با گزینهٔ -p دستور alias فهرست نامهای مستعار را در قالب alias name=value در خروجی استاندارد چاپ میکند. هنگامی که آرگومانهایی ارائه شوند، برای هر name که value آن مشخص شده باشد یک نام مستعار تعریف میشود. وجود یک فاصله در انتهای value باعث میشود کلمهٔ بعدی نیز در هنگام بسط نام مستعار طی تجزیهٔ دستور، جهت جایگزینی نام مستعار بررسی شود. به ازای هر name در فهرست آرگومانها که هیچ مقداری (value) برای آن ارائه نشده باشد، نام و مقدار نام مستعارِ name چاپ میشود. alias مقدار درست (true) برمیگرداند مگر اینکه نامی (name) بدون =value متناظر ارائه شده باشد که هیچ نام مستعاری برای آن تعریف نشده باشد.
- bg [jobspec ...]
- هر کار معلقشدهٔ jobspec را در پسزمینه از سر میگیرد، گویی با & آغاز شده باشد. اگر jobspec ارائه نشود، پوسته از مفهوم «کار فعلی» (current job) خود استفاده میکند. bg jobspec مقدار 0 برمیگرداند، مگر آنکه در وضعیتی اجرا شود که مدیریت کارها غیرفعال باشد، یا در صورتی که با مدیریت کارهای فعال اجرا شود، هر یک از jobspecهای مشخصشده یافت نشود یا بدون مدیریت کارها آغاز شده باشد.
- bind [-m keymap] [-lsvSVX]
- bind [-m keymap] [-q function] [-u function] [-r keyseq]
- bind [-m keymap] -f filename
- bind [-m keymap] -x keyseq[:] shell-command
- bind [-m keymap] keyseq:function-name
- bind [-m keymap] -p|-P [readline-command]
- bind [-m keymap] keyseq:readline-command
- bind readline-command-line
- پیوندهای کنونی کلید و توابع readline را نمایش میدهد، یک توالی کلید را به یک تابع یا ماکروی readline یا به یک دستور پوسته پیوند میدهد، یا یک متغیر readline را مقداردهی میکند. هر آرگومان غیرگزینهای یک پیوند کلید یا دستور است همانگونه که در فایل راهاندازی readline مانند .inputrc ظاهر میشود، اما هر پیوند یا دستور باید به صورت یک آرگومان جداگانه ارسال شود؛ مانند: '"\C-x\C-r": re-read-init-file'. در توضیحات زیر، خروجیهایی که قابلیت خواندهشدن مجدد دارند، در قالب دستوراتی قالببندی شدهاند که در فایل راهاندازی readline ظاهر میشوند یا به صورت آرگومانهای مجزا به یک دستور bind ارائه میگردند. گزینهها در صورت ارائه، معانی زیر را دارند:
- -m keymap
- استفاده از keymap به عنوان نگاشت کلیدی که باید تحت تأثیر پیوندهای بعدی قرار گیرد. نامهای قابل قبول برای keymap عبارتند از: emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command و vi-insert. vi معادل vi-command است (vi-move نیز یک مترادف است)؛ emacs معادل emacs-standard است.
- -l
- فهرست کردن نامهای تمام توابع readline.
- -p
- نمایش نام توابع و پیوندهای readline به شیوهای که بتوان آنها را به عنوان یک آرگومان برای دستور بعدی bind یا در فایل راهاندازی readline استفاده کرد. اگر پس از پردازش گزینهها آرگومانهایی باقی بماند، bind با آنها به عنوان نام دستورات readline رفتار کرده و خروجی را به آن نامها محدود میکند.
- -P
- فهرست نامهای توابع و انتسابهای کنونی readline را نمایش میدهد. اگر پس از پردازش گزینهها، آرگومانهایی باقی بماند، bind با آنها بهعنوان نام دستورات readline رفتار کرده و خروجی را به آن نامها محدود میکند.
- -s
- توالی کلیدهای readline که به ماکروها منتسب شدهاند و رشتههایی که تولید میکنند را به گونهای نمایش میدهد که بتوان از آنها بهعنوان آرگومان برای یک دستور بعدی bind یا در یک فایل راهاندازی readline استفاده کرد.
- -S
- توالی کلیدهای readline منتسبشده به ماکروها و رشتههایی که تولید میکنند را نمایش میدهد.
- -v
- نامها و مقادیر متغیرهای readline را به گونهای نمایش میدهد که بتوان از آنها بهعنوان آرگومان برای یک دستور بعدی bind یا در یک فایل راهاندازی readline استفاده کرد.
- -V
- فهرست نامها و مقادیر کنونی متغیرهای readline را نمایش میدهد.
- -f filename
- انتسابهای کلیدها را از filename میخواند.
- -q function
- توالی کلیدهایی که function نامبردهشدهٔ readline را فرامیخوانند، نمایش میدهد.
- -u function
- تمام توالی کلیدهای منتسبشده به function نامبردهشدهٔ readline را لغو انتساب میکند.
- -r keyseq
- هرگونه انتساب کنونی برای keyseq را حذف میکند.
- -x keyseq[: ]shell-command
- باعث میشود هر زمان که keyseq وارد شد، shell-command اجرا شود. جداکننده میان keyseq و shell-command یا فاصله خالی است یا دونقطه که اختیاری به دنبال آن فاصله خالی میآید. اگر جداکننده فاصله خالی باشد، shell-command باید در نقلقول دوگانه (double quotes) قرار گیرد و readline پیش از ذخیرهسازی، هرگونه فرار با بکاسلشِ ویژهٔ خود را در shell-command بسط میدهد. اگر جداکننده دونقطه باشد، قرار دادن در نقلقول دوگانه اختیاری است و readline رشته دستور را پیش از ذخیرهسازی بسط نمیدهد. از آنجا که کل عبارت انتساب کلید باید یک آرگومان واحد باشد، باید درون نقلقول تکی (single quotes) محصور شود. هنگامی که shell-command اجرا میشود، پوسته متغیر READLINE_LINE را برابر با محتویات بافر خط readline و متغیرهای READLINE_POINT و READLINE_MARK را به ترتیب برابر با مکان کنونی نقطه درج و نقطه درج ذخیرهشده (علامت یا mark) قرار میدهد. پوسته هر آرگومان عددی را که کاربر ارائه کرده باشد به متغیر READLINE_ARGUMENT اختصاص میدهد. اگر آرگومانی وجود نداشته باشد، آن متغیر مقداردهی نمیشود. اگر دستور اجراشده مقدار هر یک از READLINE_LINE، READLINE_POINT، یا READLINE_MARK را تغییر دهد، آن مقادیر جدید در وضعیت ویرایش اعمال خواهند شد.
- -X
- تمام توالی کلیدهای منتسبشده به دستورات پوسته و دستورات مرتبط را در قالبی فهرست میکند که بتواند مجدداً بهعنوان آرگومان برای یک دستور بعدی bind استفاده شود.
مقدار بازگشتی 0 است مگر اینکه یک گزینه ناشناخته ارائه شود یا خطایی رخ دهد.
- break [n]
- خروج از درون یک حلقه for، while، until، یا select. اگر n مشخص شده باشد، break از n حلقه دربرگیرنده خارج میشود. n باید ≥ 1 باشد. اگر n بزرگتر از تعداد حلقههای دربرگیرنده باشد، از تمام حلقههای دربرگیرنده خارج میشود. مقدار بازگشتی 0 است مگر اینکه n بزرگتر یا مساوی 1 نباشد.
- builtin shell-builtin [arguments]
- دستور توکار پوسته مشخصشده با shell-builtin را با ارسال arguments به آن اجرا کرده و وضعیت خروج آن را برمیگرداند. این قابلیت هنگام تعریف تابعی که نام آن همنام با یکی از دستورات توکار پوسته است، جهت حفظ کارایی دستور توکار در درون تابع بسیار کاربردی است. دستور توکار cd معمولاً به این شکل بازتعریف میشود. اگر shell-builtin یک دستور توکار پوسته نباشد، وضعیت بازگشتی نادرست (false) خواهد بود.
- caller [expr]
- بافتار (context) هر فراخوانی زیرروال فعال (یک تابع پوسته یا اسکریپت اجرا شده با دستورات توکار . یا source) را بازمیگرداند.
- بدون expr، دستور caller شماره خط و نام فایل مبدأ فراخوانی زیرروال جاری را نمایش میدهد. اگر یک عدد صحیح غیرمنفی به عنوان expr ارائه شود، caller شماره خط، نام زیرروال و فایل مبدأ متناظر با آن موقعیت را در پشته فراخوانی اجرای فعلی نمایش میدهد. از این اطلاعات اضافی میتوان به عنوان مثال برای چاپ ردیابی پشته (stack trace) استفاده کرد. فریم جاری، فریم 0 است.
- مقدار بازگشتی 0 است مگر اینکه پوسته در حال اجرای یک فراخوانی زیرروال نباشد یا expr متناظر با موقعیت معتبری در پشته فراخوانی نباشد.
- cd [-L] [-@] [dir]
- cd -P [-e] [-@] [dir]
- دایرکتوری جاری را به dir تغییر میدهد. اگر dir ارائه نشود، مقدار متغیر پوستهای HOME به عنوان dir استفاده میشود. اگر متغیر CDPATH وجود داشته باشد، و dir با یک اسلش (/) شروع نشود، cd از آن به عنوان یک مسیر جستجو استفاده میکند: پوسته برای یافتن dir، هر نام دایرکتوری درون CDPATH را جستجو میکند. نامهای دایرکتوری جایگزین در CDPATH با یک دونقطه (:) جدا میشوند. یک نام دایرکتوری تهی (null) در CDPATH همان دایرکتوری جاری است، یعنی “.”.
- گزینه -P باعث میشود cd با حل کردن پیوندهای نمادین در حین پیمایش dir و پیش از پردازش موارد .. در dir، از ساختار فیزیکی دایرکتوری استفاده کند (همچنین گزینه -P را در دستور توکار set ببینید).
- گزینه -L دستور cd را ملزم میکند که پیوندهای نمادین را با حل کردن پیوند پس از پردازش موارد .. در dir دنبال کند. اگر .. در dir ظاهر شود، cd آن را با حذف مؤلفه بلافاصله پیشین نام مسیر از dir تا یک اسلش یا ابتدای dir پردازش میکند، و بررسی میکند بخشی از dir که تا آن نقطه پردازش کرده است، پس از حذف مؤلفه نام مسیر همچنان یک نام دایرکتوری معتبر باشد. اگر نام دایرکتوری معتبری نباشد، cd وضعیتی غیرصفر بازمیگرداند. اگر هیچکدام از گزینههای -L یا -P ارائه نشوند، cd طوری رفتار میکند که گویی گزینه -L ارائه شده است.
- اگر گزینه -e به همراه -P ارائه شود، و cd نتواند پس از یک تغییر موفقیتآمیز دایرکتوری، دایرکتوری کاری جاری را با موفقیت تعیین کند، وضعیتی غیرصفر بازمیگرداند.
- در سیستمهایی که از آن پشتیبانی میکنند، گزینه -@ ویژگیهای گسترشیافته (extended attributes) مرتبط با یک فایل را به صورت یک دایرکتوری ارائه میدهد.
- یک شناسه به صورت - پیش از اقدام به تغییر دایرکتوری، به $OLDPWD تبدیل میشود.
- اگر cd از یک نام دایرکتوری غیرخالی از CDPATH استفاده کند، یا اگر - اولین شناسه باشد و تغییر دایرکتوری با موفقیت انجام شود، cd نام مسیر مطلق دایرکتوری کاری جدید را در خروجی استاندارد مینویسد.
- اگر تغییر دایرکتوری موفقیتآمیز باشد، cd مقدار متغیر محیطی PWD را برابر با نام دایرکتوری جدید قرار میدهد، و متغیر محیطی OLDPWD را برابر با مقدار دایرکتوری کاری جاری پیش از تغییر تنظیم میکند.
- اگر دایرکتوری با موفقیت تغییر یابد، مقدار بازگشتی درست (true) است؛ در غیر این صورت نادرست (false) خواهد بود.
- command [-pVv] command [arg ...]
- دستور توکار command، دستور command را به همراه argها با نادیده گرفتن و صرفنظر از جستجوی معمول توابع پوسته برای command اجرا میکند. تنها دستورات توکار یا دستوراتی با نام command که در PATH یافت شوند اجرا میگردند. اگر گزینهٔ -p داده شود، جستجو برای command با استفاده از مقدار پیشفرض PATH انجام میشود که یافتن تمام ابزارهای استاندارد را تضمین میکند.
- اگر هر یک از گزینههای -V یا -v مشخص شوند، command توصیفی از command چاپ میکند. گزینهٔ -v یک کلمهٔ منفرد را نمایش میدهد که دستور یا نام فایلِ استفادهشده برای فراخوانیِ command را نشان میدهد؛ گزینهٔ -V توصیف مفصلتری تولید میکند.
- اگر گزینهٔ -V یا -v مشخص شود، وضعیت خروج در صورتی که command یافت شده باشد صفر، و در غیر این صورت غیرصفر است. اگر هیچکدام از این گزینهها مشخص نشده باشند و خطایی رخ دهد یا command پیدا نشود، وضعیت خروج ۱۲۷ است. در غیر این صورت، وضعیت خروج دستور توکار command همان وضعیت خروج command خواهد بود.
- compgen [-V varname] [option] [word]
- تطابقهای ممکن برای تکمیلِ word را با توجه به optionها، که میتوانند هر گزینهای باشند که توسط دستور توکار complete پذیرفته میشود، به استثنای -p، -r، -D، -E و -I، تولید میکند و تطابقها را در خروجی استاندارد مینویسد.
- اگر گزینهٔ -V مشخص شود، compgen تکمیلهای تولیدشده را به جای نوشتن در خروجی استاندارد، در متغیر آرایهٔ اندیسدارِ varname ذخیره میکند.
- هنگام استفاده از گزینههای -F یا -C، متغیرهای گوناگون پوسته که توسط امکانات تکمیل برنامهپذیر تنظیم میشوند، اگرچه در دسترس خواهند بود، ولی دارای مقادیر مفیدی نیستند.
- تطابقها به همان شیوهای تولید میشوند که گویی کد تکمیل برنامهپذیر آنها را مستقیماً از یک مشخصات تکمیل با همان فلگها تولید کرده است. اگر word مشخص شده باشد، تنها آن دسته از تکمیلهایی که با word مطابقت دارند نمایش داده شده یا ذخیره میشوند.
- مقدار بازگشتی درست (true) است، مگر اینکه یک گزینهٔ نامعتبر داده شود، یا هیچ تطابقی تولید نشده باشد.
- complete [-abcdefgjksuv] [-o comp-option] [-DEI] [-A action]
-
[-G globpat] [-W wordlist] [-F function] [-C command]
[-X filterpat] [-P prefix] [-S suffix] name [name ...] - complete -pr [-DEI] [name ...]
- مشخص میکند که آرگومانهای هر name چگونه باید تکمیل شوند.
- اگر گزینهٔ -p داده شود، یا اگر هیچ گزینه یا nameای مشخص نشود، مشخصات تکمیل موجود را به گونهای چاپ میکند که بتوان مجدداً از آنها به عنوان ورودی استفاده کرد. گزینهٔ -r مشخصات تکمیل را برای هر name حذف میکند، یا در صورتی که هیچ nameای داده نشده باشد، تمام مشخصات تکمیل را حذف مینماید.
- گزینهٔ -D نشان میدهد که سایر گزینهها و اقدامات ارائهشده باید بر تکمیل دستور “پیشفرض” (default) اعمال شوند؛ یعنی تکمیلی که برای دستوری انجام میشود که پیش از این هیچ تکمیلی برای آن تعریف نشده است. گزینهٔ -E نشان میدهد که سایر گزینهها و اقدامات ارائهشده باید بر تکمیل دستور “خالی” (empty) اعمال شوند؛ یعنی تکمیلی که روی یک خط خالی انجام میگیرد. گزینهٔ -I نشان میدهد که سایر گزینهها و اقدامات ارائهشده باید بر تکمیل روی نخستین کلمهٔ غیرتخصیصی در خط، یا پس از یک جداکنندهٔ دستور مانند ; یا | اعمال شوند، که معمولاً تکمیل نام دستور است. اگر چند گزینه مشخص شوند، گزینهٔ -D نسبت به -E اولویت دارد، و هر دو بر -I تقدم دارند. اگر هر یک از گزینههای -D، -E یا -I مشخص شوند، هر آرگومانِ name دیگری نادیده گرفته میشود؛ این تکمیلها فقط بر حالت مشخصشده توسط گزینه اعمال میشوند.
- فرایند اعمال این مشخصات تکمیل هنگام تلاش برای تکمیل کلمه در بالا ذیل بخش تکمیل برنامهپذیر (Programmable Completion) شرح داده شده است.
- سایر گزینهها، در صورت تعیین، دارای معانی زیر هستند. آرگومانهای گزینههای -G، -W و -X (و در صورت نیاز، گزینههای -P و -S) باید نقلقول (quote) شوند تا قبل از فراخوانی دستور توکار complete از بسط داده شدن آنها محافظت شود.
- -o comp-option
- گزینه comp-option جنبههای متعددی از رفتار compspec را فراتر از تولید ساده کاملسازیها کنترل میکند. comp-option میتواند یکی از موارد زیر باشد:
- bashdefault
- اگر compspec هیچ تطابقی تولید نکند، بقیه کاملسازیهای پیشفرض bash را انجام میدهد.
- default
- اگر compspec هیچ تطابقی تولید نکند، از کاملسازی پیشفرض نام فایل در readline استفاده میکند.
- dirnames
- اگر compspec هیچ تطابقی تولید نکند، کاملسازی نام دایرکتوری را انجام میدهد.
- filenames
- به readline اعلام میکند که compspec نامهای فایل را تولید میکند، تا بتواند هرگونه پردازش مخصوص نام فایل را انجام دهد (مانند افزودن اسلش به نامهای دایرکتوری، نقلقول کردن نویسههای خاص، یا جلوگیری از فاصلههای انتهایی). این مورد برای استفاده به همراه توابع پوسته در نظر گرفته شده است.
- fullquote
- به readline اعلام میکند که تمام کلمات کاملشده را در نقلقول قرار دهد، حتی اگر نام فایل نباشند.
- noquote
- به readline اعلام میکند که در صورتی که کلمات کاملشده نام فایل باشند، آنها را در نقلقول قرار ندهد (قرار دادن نام فایلها در نقلقول حالت پیشفرض است).
- nosort
- به readline اعلام میکند که فهرست کاملسازیهای ممکن را بر حسب حروف الفبا مرتب نکند.
- nospace
- به readline اعلام میکند که به کلمات کاملشده در انتهای خط یک فاصله (حالت پیشفرض) اضافه نکند.
- plusdirs
- پس از تولید هرگونه تطابق تعریفشده توسط compspec، کاملسازی نام دایرکتوری را امتحان میکند و هرگونه تطابق را به نتایج سایر کنشها اضافه مینماید.
- -A action
- کنش action ممکن است یکی از موارد زیر برای تولید فهرستی از کاملسازیهای ممکن باشد:
- alias
- نامهای مستعار. همچنین میتواند به صورت -a مشخص شود.
- arrayvar
- نام متغیرهای آرایهای.
- binding
- نامهای کلیدهای مقیدشده در Readline.
- builtin
- نامهای دستورات توکار پوسته. همچنین میتواند به صورت -b مشخص شود.
- command
- نامهای دستور. همچنین میتواند به صورت -c مشخص شود.
- directory
- نامهای دایرکتوری. همچنین میتواند به صورت -d مشخص شود.
- disabled
- نامهای دستورات توکار غیرفعالشده پوسته.
- enabled
- نامهای دستورات توکار فعالشده پوسته.
- export
- نامهای متغیرهای صادرشده (exportشده) پوسته. همچنین میتواند به صورت -e مشخص شود.
- file
- نامهای فایل و دایرکتوری، مشابه با کاملسازی نام فایل در readline. همچنین میتواند به صورت -f مشخص شود.
- function
- نامهای توابع پوسته.
- group
- نامهای گروه. همچنین میتواند به صورت -g مشخص شود.
- helptopic
- موضوعات راهنما به شکلی که توسط دستور توکار help پذیرفته میشوند.
- hostname
- نامهای میزبان، بهگونهای که از فایل مشخصشده توسط متغیر پوستهٔ HOSTFILE گرفته شدهاند.
- job
- نامهای کار، در صورتی که مدیریت کارها فعال باشد. همچنین میتواند به صورت -j مشخص شود.
- keyword
- کلمات رزرو شدهٔ پوسته. همچنین میتواند به صورت -k مشخص شود.
- running
- نامهای کارهای در حال اجرا، در صورتی که مدیریت کارها فعال باشد.
- service
- نامهای سرویس. همچنین میتواند به صورت -s مشخص شود.
- setopt
- آرگومانهای معتبر برای گزینهٔ -o در دستور توکار set.
- shopt
- نامهای گزینهٔ پوسته بهگونهای که توسط دستور توکار shopt پذیرفته میشوند.
- signal
- نامهای سیگنال.
- stopped
- نامهای کارهای متوقفشده، در صورتی که مدیریت کارها فعال باشد.
- user
- نامهای کاربری. همچنین میتواند به صورت -u مشخص شود.
- variable
- نامهای همهٔ متغیرهای پوسته. همچنین میتواند به صورت -v مشخص شود.
- -C command
- دستور command در یک محیط زیرپوسته اجرا میشود و خروجی آن به عنوان کاملکردنهای ممکن استفاده میشود. آرگومانها همانند گزینهٔ -F ارسال میشوند.
- -F function
- تابع پوستهٔ function در محیط پوستهٔ فعلی اجرا میشود. هنگامی که تابع اجرا میشود، نخستین آرگومان ($1) نام دستوری است که آرگومانهایش در حال کامل شدن هستند، دومین آرگومان ($2) کلمهای است که در حال کامل شدن است، و سومین آرگومان ($3) کلمهٔ پیش از کلمهٔ در حال کامل شدن در خط فرمان فعلی است. هنگامی که function پایان مییابد، کاملکردن برنامهپذیر، کاملکردنهای ممکن را از مقدار متغیر آرایهای COMPREPLY بازیابی میکند.
- -G globpat
- الگوی بسط نام مسیر globpat را برای تولید کاملکردنهای ممکن بسط میدهد.
- -P prefix
- پس از اعمال همهٔ گزینههای دیگر، prefix را به آغاز هر کاملکردن ممکن میافزاید.
- -S suffix
- پس از اعمال همهٔ گزینههای دیگر، suffix را به انتهای هر کاملکردن ممکن الحاق میکند.
- -W wordlist
- فهرست کلمات wordlist را با استفاده از نویسههای موجود در متغیر ویژهٔ IFS به عنوان جداکننده تفکیک کرده و هر کلمهٔ حاصل را بسط میدهد. نقلقول پوسته درون wordlist رعایت میشود تا سازوکاری فراهم آید که کلمات بتوانند شامل فرانویسههای پوسته یا نویسههای موجود در مقدار IFS باشند. کاملکردنهای ممکن، اعضایی از فهرست حاصل هستند که با پیشوندی از کلمهٔ در حال کامل شدن مطابقت دارند.
- -X filterpat
- الگوی filterpat الگویی همانند الگوهای بسط نام مسیر است. این الگو بر روی فهرست تکمیلهای احتمالی تولیدشده توسط گزینهها و آرگومانهای پیشین اعمال میشود و هر تکمیلی که با filterpat تطابق داشته باشد از فهرست حذف میگردد. وجود یک ! در ابتدای filterpat الگو را نقیض میکند؛ در این حالت، هر تکمیلی که با filterpat تطابق نداشته باشد حذف خواهد شد.
مقدار بازگشتی درست (true) است مگر اینکه یک گزینه نامعتبر ارائه شود، گزینهای غیر از -p، -r، -D، -E، یا -I بدون آرگومان name ارائه گردد، تلاشی برای حذف مشخصات تکمیل برای یک name که هیچ مشخصاتی برای آن وجود ندارد انجام شود، یا خطایی هنگام افزودن مشخصات تکمیل رخ دهد.
- compopt [-o option] [-DEI] [+o option] [name]
- گزینههای تکمیل را برای هر name بر اساس optionها، یا در صورت ارائه نشدن name برای تکمیل در حال اجرای فعلی تغییر میدهد. اگر هیچ optionی ارائه نشود، گزینههای تکمیل را برای هر name یا تکمیل فعلی نمایش میدهد. مقادیر احتمالی برای option همان مواردی هستند که برای دستور توکار complete که پیشتر توضیح داده شد، معتبرند.
- گزینه -D نشان میدهد که سایر گزینههای ارائه شده باید بر روی تکمیل “پیشفرض” دستور اعمال شوند؛ گزینه -E نشان میدهد که سایر گزینههای ارائه شده باید بر روی تکمیل دستور “خالی” اعمال شوند؛ و گزینه -I نشان میدهد که سایر گزینههای ارائه شده باید بر روی تکمیل کلمه ابتدایی خط اعمال گردند. این موارد به همان روش دستور توکار complete تعیین میشوند.
- اگر گزینههای چندگانه ارائه شوند، گزینه -D بر -E اولویت دارد و هر دو بر -I تقدم دارند.
- مقدار بازگشتی درست (true) است مگر اینکه یک گزینه نامعتبر ارائه شود، تلاشی برای تغییر گزینهها برای یک name که هیچ مشخصات تکمیلی برای آن وجود ندارد صورت گیرد، یا خطایی در خروجی رخ دهد.
- continue [n]
- دستور continue تکرار بعدی حلقه دربرگیرنده for، while، until، یا select را از سر میگیرد. اگر n مشخص شده باشد، bash حلقه دربرگیرنده nام را از سر میگیرد. n باید ≥ 1 باشد. اگر n بزرگتر از تعداد حلقههای دربرگیرنده باشد، پوسته آخرین حلقه دربرگیرنده (حلقه “بالاترین”سطح یا top-level) را از سر میگیرد. مقدار بازگشتی 0 است مگر اینکه n بزرگتر یا مساوی 1 نباشد.
- declare [-aAfFgiIlnrtux] [-p] [name[=value] ...]
- typeset [-aAfFgiIlnrtux] [-p] [name[=value] ...]
- متغیرها را تعریف کرده و/یا به آنها صفت (ویژگی) میدهد. اگر هیچ nameی داده نشود، مقادیر متغیرها یا توابع را نمایش میدهد. گزینه -p صفتها و مقادیر هر name را نمایش خواهد داد. هنگامی که -p با آرگومانهای name استفاده شود، گزینههای اضافی، به جز -f و -F، نادیده گرفته میشوند.
- هنگامی که -p بدون آرگومانهای name ارائه شود، declare صفتها و مقادیر تمام متغیرهایی که صفتهای مشخصشده توسط گزینههای اضافی را دارند، نمایش خواهد داد. اگر گزینه دیگری همراه با -p ارائه نشود، declare صفتها و مقادیر تمام متغیرهای پوسته را نمایش میدهد. گزینه -f نمایش را به توابع پوسته محدود میکند.
- گزینه -F از نمایش تعاریف توابع جلوگیری میکند؛ فقط نام تابع و صفتهای آن چاپ میشوند. اگر گزینه پوسته extdebug با استفاده از shopt فعال شده باشد، نام فایل منبع و شماره خطی که هر name در آن تعریف شده است نیز نمایش داده میشود. گزینه -F به معنای اعمال ضمنی -f است.
- گزینه -g متغیرها را مجبور میکند در حوزه سراسری (global scope) ایجاد یا ویرایش شوند، حتی اگر declare درون یک تابع پوسته اجرا گردد. هنگامی که declare درون یک تابع پوسته اجرا نشود، این گزینه نادیده گرفته میشود.
- گزینه -I باعث میشود متغیرهای محلی، صفتها (به جز صفت nameref) و مقدار هر متغیر موجود با همان name در حوزه دربرگیرنده پیرامون را به ارث ببرند. اگر متغیر موجودی وجود نداشته باشد، متغیر محلی در ابتدا بدون مقدار (unset) خواهد بود.
- گزینههای زیر میتوانند برای محدود کردن خروجی به متغیرهایی با صفت مشخص یا دادن صفتها به متغیرها استفاده شوند:
- -a
- هر name یک متغیر آرایه ایندکسشده (نمایهای) است (بخش Arrays در بالا را ببینید).
- -A
- هر name یک متغیر آرایه انجمنی (متناظر) است (بخش Arrays در بالا را ببینید).
- -f
- هر name به یک تابع پوسته اشاره دارد.
- -i
- متغیر به عنوان یک عدد صحیح در نظر گرفته میشود؛ ارزیابی حسابی (بخش ARITHMETIC EVALUATION در بالا را ببینید) هنگامی که مقداری به متغیر انتساب داده میشود، انجام میگیرد.
- -l
- هنگامی که مقداری به متغیر انتساب داده میشود، تمام حروف بزرگ به حروف کوچک تبدیل میشوند. صفت حروف بزرگ غیرفعال میشود.
- -n
- به هر name صفت nameref را میدهد، و آن را به یک ارجاع نامی (name reference) به متغیری دیگر تبدیل میکند. آن متغیر دیگر با مقدار name تعریف میشود. تمام ارجاعات، انتسابها، و تغییرات صفتها روی name، به جز مواردی که از خود صفت -n استفاده میکنند یا آن را تغییر میدهند، بر روی متغیری انجام میشود که مقدار name به آن ارجاع دارد. صفت nameref را نمیتوان برای متغیرهای آرایهای به کار برد.
- -r
- nameها را فقطخواندنی (readonly) میکند. سپس نمیتوان با دستورات انتساب بعدی مقداری به این نامها اختصاص داد یا آنها را با unset حذف کرد.
- -t
- به هر name صفت trace را میدهد. توابع ردگیریشده، تلههای (traps) DEBUG و RETURN را از پوسته فراخواننده به ارث میبرند. صفت trace معنای خاصی برای متغیرها ندارد.
- -u
- هنگامی که مقداری به متغیر انتساب داده میشود، تمام حروف کوچک به حروف بزرگ تبدیل میشوند. صفت حروف کوچک غیرفعال میشود.
- -x
- هر name را برای صدور (export) به دستورات بعدی از طریق محیط علامتگذاری میکند.
استفاده از “+” به جای “-” صفت مشخصشده را خاموش (غیرفعال) میکند، با این استثناها که +a و +A را نمیتوان برای نابود کردن متغیرهای آرایهای استفاده کرد و +r صفت فقطخواندنی را حذف نخواهد کرد.
هنگامی که در یک تابع استفاده شوند، declare و typeset مانند دستور local هر name را محلی میکنند، مگر اینکه گزینه -g ارائه شده باشد. اگر به دنبال نام یک متغیر =value بیاید، مقدار متغیر برابر با value قرار میگیرد. هنگام استفاده از -a یا -A و ساختار انتساب مرکب برای ایجاد متغیرهای آرایهای، صفتهای اضافی تا انتسابهای بعدی اعمال نخواهند شد.
مقدار بازگشتی 0 است مگر اینکه یک گزینه نامعتبر دریافت شود، تلاشی برای تعریف یک تابع با استفاده از “-f foo=bar” صورت گیرد، تلاشی برای انتساب یک مقدار به یک متغیر فقطخواندنی صورت گیرد، تلاشی برای انتساب یک مقدار به یک متغیر آرایهای بدون استفاده از ساختار انتساب مرکب صورت گیرد (بخش Arrays در بالا را ببینید)، یکی از nameها یک نام متغیر معتبر در پوسته نباشد، تلاشی برای خاموش کردن وضعیت فقطخواندنی برای یک متغیر فقطخواندنی صورت گیرد، تلاشی برای خاموش کردن وضعیت آرایهای برای یک متغیر آرایهای صورت گیرد، یا تلاشی برای نمایش یک تابع ناموجود با -f انجام شود.
- dirs [-clpv] [+n] [-n]
- بدون گزینهها، فهرست دایرکتوریهای بهخاطرسپردهشده کنونی را نمایش میدهد. نمایش پیشفرض در یک خط واحد است که نام دایرکتوریها در آن با فاصله از هم جدا شدهاند. دایرکتوریها با دستور pushd به فهرست افزوده میشوند؛ دستور popd مدخلهایی را از فهرست حذف میکند. دایرکتوری جاری همیشه اولین دایرکتوری در پشته است.
- گزینهها در صورت ارائه، معانی زیر را دارند:
- -c
- پشته دایرکتوری را با حذف تمام مدخلها پاک میکند.
- -l
- فهرستی با استفاده از نام کامل مسیرها تولید میکند؛ قالب پیشفرض فهرستنویسی از یک تیلدا (علامت مد) برای نمایش دایرکتوری خانگی استفاده میکند.
- -p
- پشته دایرکتوری را با یک مدخل در هر خط چاپ میکند.
- -v
- پشته دایرکتوری را با یک مدخل در هر خط چاپ میکند، و در ابتدای هر مدخل شاخص (اندیس) آن در پشته را درج میکند.
- +n
- مدخل nام را با شمارش از سمت چپ فهرستی که توسط dirs هنگام فراخوانی بدون گزینه نشان داده شده است نمایش میدهد، با شروع از صفر.
- -n
- مدخل nام را با شمارش از سمت راست فهرستی که توسط dirs هنگام فراخوانی بدون گزینه نشان داده شده است نمایش میدهد، با شروع از صفر.
مقدار بازگشتی 0 است مگر اینکه گزینه نامعتبری ارائه شود یا n به فراتر از انتهای پشته دایرکتوری اشاره کند.
- disown [-ar] [-h] [id ...]
- بدون گزینهها، هر id را از جدول کارهای فعال حذف میکند. هر id میتواند مشخصه کار jobspec یا شناسه فرآیند pid باشد؛ اگر id یک pid باشد، disown از کاری که شامل آن pid است به عنوان jobspec استفاده میکند.
- اگر گزینه -h مشخص شده باشد، disown کارهای متناظر با هر id را از جدول کارها حذف نمیکند، بلکه آنها را علامتگذاری میکند تا در صورتی که پوسته سیگنال SIGHUP را دریافت کرد، آن را به این کار ارسال نکند SIGHUP.
- اگر هیچ id مشخص نشده باشد، گزینه -a به معنای حذف یا علامتگذاری همه کارها است؛ گزینه -r بدون آرگومان id کارهای در حال اجرا را حذف یا علامتگذاری میکند. اگر هیچ id مشخص نشده باشد و هیچیک از گزینههای -a و -r نیز ارائه نشده باشند، disown کار جاری را حذف یا علامتگذاری میکند.
- مقدار بازگشتی 0 است مگر اینکه یک id یک کار معتبر را مشخص نکند.
- echo [-neE] [arg ...]
- آرگومانهای arg را با فاصله از یکدیگر و به دنبال آن یک خط جدید خروجی میدهد. وضعیت بازگشتی 0 است مگر اینکه خطای نوشتن رخ دهد. اگر -n مشخص شده باشد، خط جدید پایانی چاپ نمیشود.
- اگر گزینه -e داده شود، echo نویسههای گریز با بکاسلش زیر را تفسیر میکند. گزینه -E تفسیر این نویسههای گریز را حتی در سیستمهایی که بهطور پیشفرض تفسیر میشوند، غیرفعال میکند. گزینه پوسته xpg_echo تعیین میکند که آیا echo هیچیک از گزینهها را تفسیر کرده و این نویسههای گریز را بسط میدهد یا خیر. دستور echo عبارت -- را به معنای پایان گزینهها تفسیر نمیکند.
- echo توالیهای گریز زیر را تفسیر میکند:
- \a
- هشدار (زنگ اخبار یا bell)
- \b
- پسبر (backspace)
- \c
- جلوگیری از ادامه خروجی
- \e
- \E
- نویسه گریز (escape)
- \f
- برگخور (form feed)
- \n
- خط جدید (new line)
- \r
- بازگشت به ابتدای سطر (carriage return)
- \t
- تب افقی
- \v
- تب عمودی
- \\
- بکاسلش (ممیز وارونه)
- \0nnn
- نویسه هشتبیتی که مقدار آن برابر با مقدار هشتهشتی (اکتال) nnn است (صفر تا سه رقم در مبنای ۸).
- \xHH
- نویسه هشتبیتی که مقدار آن برابر با مقدار شانزدهشانزدهی (هگزادسیمال) HH است (یک یا دو رقم در مبنای ۱۶).
- \uHHHH
- نویسه یونیکد (ISO/IEC 10646) که مقدار آن برابر با مقدار شانزدهشانزدهی HHHH است (یک تا چهار رقم در مبنای ۱۶).
- \UHHHHHHHH
- نویسه یونیکد (ISO/IEC 10646) که مقدار آن برابر با مقدار شانزدهشانزدهی HHHHHHHH است (یک تا هشت رقم در مبنای ۱۶).
دستور echo هر نویسه مهارشده با بکاسلشِ ناشناخته را بدون تغییر مینویسد.
- enable [-a] [-dnps] [-f filename] [name ...]
- فعال و غیرفعال کردن دستورات توکار پوسته. غیرفعال کردن یک دستور توکار اجازه میدهد یک فایل اجرایی که همنام با یک دستور توکار پوسته است، بدون تعیین مسیر کامل آن اجرا شود، اگرچه پوسته معمولاً پیش از فایلها، به دنبال دستورات توکار میگردد.
- اگر -n ارائه شود، هر name غیرفعال میشود؛ در غیر این صورت، nameها فعال میشوند. برای مثال، جهت استفاده از فایل دودویی test یافتشده با استفاده از PATH به جای نسخه توکار پوسته، این دستور را اجرا کنید: “enable -n test”.
- اگر هیچ آرگومان nameای مشخص نشود، یا اگر گزینه -p داده شود، فهرستی از دستورات توکار پوسته چاپ میشود. بدون آرگومانهای گزینهای دیگر، این فهرست شامل تمام دستورات توکار فعال پوسته خواهد بود. اگر -n ارائه شود، تنها دستورات توکار غیرفعال را چاپ میکند. اگر -a ارائه شود، فهرست چاپشده شامل تمام دستورات توکار خواهد بود، همراه با نشانگری مبنی بر اینکه آیا هر کدام فعال هستند یا خیر. گزینه -s به معنای محدود کردن خروجی به دستورات توکار special در استاندارد POSIX است.
- گزینه -f به معنای بارگذاری دستور توکار جدید name از شیء اشتراکی (shared object) filename است، در سیستمهایی که از بارگذاری پویا پشتیبانی میکنند. اگر filename شامل اسلش نباشد، Bash از مقدار متغیر BASH_LOADABLES_PATH به عنوان فهرستی از دایرکتوریهای جداشده با دونقطه (:) برای جستجوی filename استفاده خواهد کرد. مقدار پیشفرض BASH_LOADABLES_PATH وابسته به سیستم است، و ممکن است شامل “.” باشد تا جستجو در دایرکتوری جاری را اجباری کند. گزینه -d دستور توکاری را که پیشتر با -f بارگذاری شده بود، حذف خواهد کرد. اگر -s همراه با -f استفاده شود، دستور توکار جدید به یک دستور توکار ویژه در POSIX تبدیل میشود.
- اگر هیچ گزینهای داده نشود و یک name دستور توکار پوسته نباشد، enable تلاش خواهد کرد تا name را از یک شیء اشتراکی به نام name بارگذاری کند، گویی که دستور بدین صورت اجرا شده است: “enable -f name name”.
- مقدار بازگشتی 0 است مگر آنکه یک name دستور توکار پوسته نباشد یا خطایی در بارگذاری یک دستور توکار جدید از یک شیء اشتراکی رخ دهد.
- eval [arg ...]
- آرگومانهای arg را با قرار دادن فاصله بین آنها به یک دستور واحد متصل میکند. سپس Bash این دستور را خوانده و اجرا مینماید، و وضعیت خروج آن را به عنوان وضعیت بازگشتی eval برمیگرداند. اگر هیچ arg یا تنها آرگومانهای تهی وجود داشته باشد، eval مقدار 0 را برمیگرداند.
- exec [-cl] [-a name] [command [arguments]]
- اگر command مشخص شده باشد، بدون ایجاد یک فرایند جدید جایگزین پوسته میشود. command نمیتواند یک تابع یا دستور توکار پوسته باشد. شناسههای arguments به عنوان آرگومانهای command به آن داده میشوند. اگر گزینهٔ -l ارائه شده باشد، پوسته یک خط تیره (dash) در ابتدای آرگومان صفرم ارسالشده به command قرار میدهد. این همان کاری است که login(1) انجام میدهد. گزینهٔ -c باعث میشود که command با یک محیط (environment) خالی اجرا شود. اگر -a ارائه شود، پوسته name را به عنوان آرگومان صفرم به دستور اجراشده ارسال میکند.
- اگر command به دلیلی قابل اجرا نباشد، یک پوسته غیرتعاملی خارج میشود، مگر اینکه گزینهٔ پوسته execfail فعال باشد. در این صورت، وضعیتی غیرصفر برمیگرداند. اگر فایل قابل اجرا نباشد، یک پوسته تعاملی وضعیتی غیرصفر برمیگرداند. در صورت شکست خوردن exec، زیرپوسته (subshell) بدون قید و شرط خارج میشود.
- اگر command مشخص نشده باشد، هرگونه تغییر مسیر بر روی پوسته جاری اعمال میشود، و وضعیت بازگشتی 0 خواهد بود. اگر خطایی در تغییر مسیر رخ دهد، وضعیت بازگشتی 1 است.
- exit [n]
- باعث خروج پوسته با وضعیت n میشود. اگر n حذف شود، وضعیت خروج برابر با وضعیت آخرین دستور اجراشده خواهد بود. هرگونه تله (trap) بر روی EXIT پیش از خاتمه یافتن پوسته اجرا میشود.
- export [-fn] [name[=value]] ...
- export -p [-f]
- نامهای names ارائهشده برای صدور خودکار (export) به محیط دستوراتی که متعاقباً اجرا میشوند، علامتگذاری میشوند. اگر گزینهٔ -f داده شود، names به توابع اشاره دارند.
- گزینهٔ -n صفت صدور (export) را از هر name حذف کرده یا آن را از حالت صادرشده خارج میسازد. اگر هیچ names داده نشود، یا اگر تنها گزینهٔ -p ارائه گردد، export فهرستی از نامهای تمام متغیرهای صادرشده را در خروجی استاندارد نمایش میدهد. استفاده همزمان از -p و -f توابع صادرشده را نمایش میدهد. گزینهٔ -p خروجی را در قالبی نمایش میدهد که میتواند مجدداً به عنوان ورودی استفاده شود.
- export این امکان را فراهم میکند که مقدار متغیر هنگام صدور یا لغو صدور، با قرار دادن =value پس از نام متغیر تنظیم شود. این کار در حین تغییر صفت صدور (export)، مقدار متغیر را روی value تنظیم میکند. دستور export وضعیت خروج 0 را برمیگرداند مگر آنکه یک گزینهٔ نامعتبر دریافت شود، یکی از names یک نام معتبر برای متغیرهای پوسته نباشد، یا -f همراه با یک name که یک تابع نیست ارائه گردد.
- false
- کاری انجام نمیدهد؛ یک وضعیت غیرصفر (شکست) برمیگرداند.
- fc [-e ename] [-lnr] [first] [last]
- fc -s [pat=rep] [cmd]
- شکل اول محدودهای از دستورات را از first تا last از فهرست تاریخچه انتخاب کرده و آنها را نمایش میدهد یا ویرایش و دوباره اجرا میکند. First و last میتوانند به عنوان یک رشته (برای یافتن آخرین دستوری که با آن رشته آغاز میشود) یا به عنوان یک عدد (یک نمایه در فهرست تاریخچه، که در آن یک عدد منفی به عنوان فاصله از شماره دستور فعلی استفاده میشود) مشخص شوند.
- هنگام فهرست کردن، مقدار 0 برای first یا last معادل -1 است و -0 معادل دستور فعلی است (معمولاً دستور fc)؛ در غیر این صورت 0 معادل -1 بوده و -0 نامعتبر است. اگر last مشخص نشده باشد، برای فهرست کردن روی دستور فعلی تنظیم میشود (به طوری که “fc -l -10” ۱۰ دستور آخر را چاپ میکند) و در غیر این صورت روی first تنظیم میشود. اگر first مشخص نشده باشد، برای ویرایش روی دستور قبلی و برای فهرست کردن روی -16 تنظیم میشود.
- اگر گزینه -l ارائه شود، دستورات در خروجی استاندارد فهرست میشوند. گزینه -n شماره دستورات را هنگام فهرست کردن حذف میکند. گزینه -r ترتیب دستورات را معکوس میکند.
- در غیر این صورت، fc ویرایشگر نامبردهشده توسط ename را روی فایلی حاوی آن دستورات فراخوانی میکند. اگر ename ارائه نشده باشد، fc از مقدار متغیر FCEDIT استفاده میکند، و از مقدار EDITOR در صورتی که FCEDIT تنظیم نشده باشد. اگر هیچیک از متغیرها تنظیم نشده باشند، fc از vi. استفاده میکند. هنگامی که ویرایش کامل شد، fc فایل حاوی دستورات ویرایششده را میخواند و آنها را چاپ کرده و اجرا میکند.
- در شکل دوم، fc پس از جایگزینی هر نمونه از pat با rep، دستور command را مجدداً اجرا میکند. Command همانند first در بالا تفسیر میشود.
- یک نام مستعار کاربردی برای استفاده با fc عبارت است از “r="fc -s"”, به طوری که تایپ کردن “r cc” آخرین دستوری را که با “cc” آغاز میشود اجرا میکند و تایپ کردن “r” آخرین دستور را مجدداً اجرا مینماید.
- اگر از شکل اول استفاده شود، مقدار بازگشتی صفر است مگر اینکه با یک گزینه نامعتبر مواجه شود یا first یا last خطوطی از تاریخچه را مشخص کنند که خارج از محدوده باشد. هنگام ویرایش و اجرای مجدد یک فایل حاوی دستورات، مقدار بازگشتی برابر با مقدار آخرین دستور اجرا شده خواهد بود یا در صورت بروز خطا در فایل موقت، نشاندهنده شکست است. اگر از شکل دوم استفاده شود، وضعیت بازگشتی همان وضعیت دستور بازاجراشده است، مگر اینکه cmd یک مدخل معتبر در تاریخچه را مشخص نکند، که در این صورت fc یک وضعیت غیرصفر برمیگرداند.
- fg [jobspec]
- ادامه دادن اجرای jobspec در پیشزمینه، و تبدیل آن به کار جاری. اگر jobspec مشخص نشده باشد، fg از مفهوم پوسته برای کار جاری استفاده میکند. مقدار بازگشتی برابر با مقدار بازگشتی دستوری است که در پیشزمینه قرار گرفته، یا در صورت اجرا در حالتی که کنترل کارها غیرفعال است، یا در زمان اجرا با کنترل کارهای فعال، اگر jobspec یک کار معتبر را مشخص نکند یا jobspec کاری را مشخص کند که بدون کنترل کارها شروع شده است، نشاندهنده شکست است.
- getopts optstring name [arg ...]
- دستور getopts توسط اسکریپتها و توابع پوسته برای تجزیه پارامترهای مکانی و بهدست آوردن گزینهها و آرگومانهای آنها استفاده میشود. optstring شامل نویسههای گزینهای است که باید شناسایی شوند؛ اگر پس از یک نویسه یک دونقطه (colon) بیاید، انتظار میرود که آن گزینه یک آرگومان داشته باشد، که باید با فضای خالی (whitespace) از آن جدا شود. نویسههای دونقطه و علامت سؤال نباید بهعنوان نویسههای گزینه استفاده شوند.
- با هر بار فراخوانی، getopts گزینه بعدی را در متغیر پوسته name قرار میدهد و در صورتی که name وجود نداشته باشد، آن را مقداردهی اولیه میکند، و شاخص آرگومان بعدی را که باید پردازش شود در متغیر OPTIND میگذارد. OPTIND هر بار که پوسته یا یک اسکریپت پوسته فراخوانی میشود با مقدار 1 مقداردهی اولیه میشود. هنگامی که یک گزینه به یک آرگومان نیاز دارد، getopts آن آرگومان را در متغیر OPTARG قرار میدهد.
- پوسته مقدار OPTIND را بهطور خودکار بازنشانی نمیکند؛ برای استفاده از یک مجموعه پارامتر جدید، باید آن را بهصورت دستی بین چندین فراخوانی getopts در همان فراخوانی پوسته بازنشانی کرد.
- هنگامی که به پایان گزینهها میرسد، getopts با یک مقدار بازگشتی بزرگتر از صفر خارج میشود. OPTIND روی شاخص اولین آرگومان غیرگزینهای تنظیم میشود، و name روی ? تنظیم میگردد.
- getopts معمولاً پارامترهای مکانی را تجزیه میکند، اما اگر آرگومانهای بیشتری بهعنوان مقادیر arg ارائه شوند، getopts آنها را بهجای آن تجزیه میکند.
- دستور getopts میتواند خطاها را به دو روش گزارش کند. اگر اولین نویسه optstring یک دونقطه باشد، getopts از گزارش خطای بیصدا (silent) استفاده میکند. در عملکرد عادی، getopts هنگام برخورد با گزینههای نامعتبر یا آرگومانهای مفقود گزینه، پیامهای تشخیصی چاپ میکند. اگر متغیر OPTERR روی 0 تنظیم شده باشد، getopts هیچ پیام خطایی نمایش نمیدهد، حتی اگر اولین نویسه optstring دونقطه نباشد.
- اگر getopts یک گزینه نامعتبر شناسایی کند، ? را در name قرار میدهد و در صورتی که بیصدا نباشد، یک پیام خطا چاپ کرده و متغیر OPTARG را حذف (unset) میکند. اگر getopts بیصدا باشد، نویسه گزینه پیدا شده را به OPTARG اختصاص میدهد و هیچ پیام تشخیصی چاپ نمیکند.
- اگر یک آرگومان الزامی پیدا نشود، و getopts بیصدا نباشد، مقدار name را روی یک علامت سؤال (?) تنظیم میکند، OPTARG را حذف میکند، و یک پیام تشخیصی چاپ مینماید. اگر getopts بیصدا باشد، مقدار name را روی یک دونقطه (:) تنظیم کرده و OPTARG را روی نویسه گزینه پیدا شده قرار میدهد.
- دستور getopts در صورت پیدا شدن یک گزینه، چه مشخصشده و چه مشخصنشده، مقدار true برمیگرداند. اگر به انتهای گزینهها برسد یا خطایی رخ دهد، مقدار false بازمیگرداند.
- hash [-lr] [-p filename] [-dt] [name]
- هر بار که hash فراخوانی میشود، مسیر کامل دستور name را همانطور که از طریق جستجو در دایرکتوریهای موجود در $PATH تعیین شده است، به خاطر میسپارد. هر مسیر ذخیرهشدهٔ قبلی مرتبط با name دور ریخته میشود. اگر گزینهٔ -p مشخص شده باشد، hash از filename به عنوان مسیر کامل دستور استفاده میکند.
- گزینهٔ -r باعث میشود پوسته تمام مکانهای بهخاطرسپردهشده را فراموش کند. مقداردهی به متغیر PATH نیز تمام نامفایلهای جدول هش را پاک میکند. گزینهٔ -d باعث میشود پوسته مکان بهخاطرسپردهشده برای هر name را فراموش کند.
- اگر گزینهٔ -t مشخص شده باشد، hash مسیر کامل مربوط به هر name را چاپ میکند. اگر چندین آرگومان name همراه با -t داده شوند، hash پیش از مسیر کامل هششدهٔ مربوطه، نام (name) را چاپ میکند. گزینهٔ -l خروجی را در قالبی نمایش میدهد که میتواند مجدداً به عنوان ورودی استفاده شود.
- اگر هیچ آرگومانی داده نشود، یا اگر تنها -l داده شود، hash اطلاعات مربوط به دستورات بهخاطرسپردهشده را چاپ میکند. گزینههای -t، -d و -p (گزینههایی که بر روی آرگومانهای name اثر میگذارند) مانعةالجمع هستند. تنها یکی از آنها فعال خواهد بود. اگر بیش از یکی از آنها مشخص شود، -t اولویت بالاتری نسبت به -p دارد، و هر دو اولویت بالاتری نسبت به -d دارند.
- وضعیت بازگشتی صفر است مگر اینکه یک name یافت نشود یا یک گزینهٔ نامعتبر داده شود.
- help [-dms] [pattern]
- اطلاعات مفیدی دربارهٔ دستورات توکار نمایش میدهد. اگر pattern مشخص شده باشد، help همانطور که در زیر شرح داده شده، راهنمای مفصلی را دربارهٔ تمام دستورات مطابق با pattern ارائه میدهد؛ در غیر این صورت، فهرستی از تمام دستورات توکار و دستورات مرکب پوسته را نمایش میدهد.
- گزینهها در صورت مشخص شدن، معانی زیر را دارند:
- اگر pattern شامل نویسههای تطبیق الگو باشد (به Pattern Matching در بالا مراجعه کنید)، با آن مانند یک الگوی پوسته رفتار میشود و help توضیحات هر عنوان راهنمای مطابق با pattern را چاپ میکند.
- در غیر این صورت، و چنانچه pattern دقیقاً با نام یک عنوان راهنما مطابقت داشته باشد، help توضیحات مرتبط با آن موضوع را چاپ میکند. در غیر این صورت، help تطبیق پیشوند انجام میدهد و توضیحات تمام موضوعات راهنمای منطبق را چاپ میکند.
- وضعیت بازگشتی 0 است مگر اینکه هیچ دستوری با pattern مطابقت نداشته باشد.
- history [n]
- history -c
- history -d offset
- history -d start-end
- history -anrw [filename]
- history -p arg [arg ...]
- history -s arg [arg ...]
- بدون هیچ گزینهای، فهرست تاریخچهٔ دستورات را همراه با شمارهها نمایش میدهد. مدخلهایی که با یک * پیشوند دارند، تغییر یافتهاند. یک آرگومان n تنها آخرین n مدخل را فهرست میکند. اگر متغیر پوستهٔ HISTTIMEFORMAT تنظیم شده و خالی نباشد، بهعنوان یک رشتهٔ قالببندی برای strftime(3) جهت نمایش برچسب زمانی مرتبط با هر مدخل تاریخچهٔ نمایشدادهشده استفاده میشود. اگر history از HISTTIMEFORMAT استفاده کند، فاصلهٔ اضافهای میان برچسب زمانی قالببندیشده و مدخل تاریخچه چاپ نمیکند.
- اگر filename ارائه شود، history از آن بهعنوان نام فایل تاریخچه استفاده میکند؛ در غیر این صورت، از مقدار HISTFILE استفاده میکند. اگر filename ارائه نشود و HISTFILE تنظیم نشده یا خالی باشد، گزینههای -a، -n، -r و -w هیچ تأثیری ندارند.
- گزینهها در صورت ارائه، معانی زیر را دارند:
- -c
- پاک کردن فهرست تاریخچه با حذف تمام مدخلها. این گزینه میتواند همراه با گزینههای دیگر برای جایگزینی فهرست تاریخچه استفاده شود.
- -d offset
- حذف مدخل تاریخچه در موقعیت offset. اگر offset منفی باشد، نسبت به یکی بیشتر از آخرین موقعیت تاریخچه تفسیر میشود؛ بنابراین شاخصهای منفی از انتهای تاریخچه به عقب شمارش میشوند و شاخص -1 به خود دستور جاری history -d اشاره میکند.
- -d start-end
- حذف بازهای از مدخلهای تاریخچه بین موقعیتهای start و end، بهصورت شامل هر دو انتها. مقادیر مثبت و منفی برای start و end همانطور که در بالا شرح داده شد تفسیر میشوند.
- -a
- الحاق خطوط تاریخچهٔ “new” به فایل تاریخچه. اینها خطوط تاریخچهای هستند که از زمان آغاز نشست جاری bash وارد شدهاند، اما قبلاً به فایل تاریخچه الحاق نشدهاند.
- -n
- خواندن خطوط تاریخچهای که هنوز از فایل تاریخچه خوانده نشدهاند و اضافه کردن آنها به فهرست تاریخچهٔ جاری. اینها خطوطی هستند که از آغاز نشست جاری bash به فایل تاریخچه الحاق شدهاند.
- -r
- خواندن فایل تاریخچه و الحاق محتویات آن به فهرست تاریخچهٔ جاری.
- -w
- نوشتن فهرست تاریخچهٔ جاری در فایل تاریخچه و رونویسی روی فایل تاریخچه.
- -p
- جایگزینی تاریخچه را روی args دادهشده انجام میدهد و نتیجه را در خروجی استاندارد نمایش میدهد، بدون اینکه نتایج را در فهرست تاریخچه ذخیره کند. هر arg باید نقلقول شود تا بسط عادی تاریخچه غیرفعال گردد.
- -s
- شناسههای args را به عنوان یک مدخل واحد در فهرست تاریخچه ذخیره میکند. آخرین دستور در فهرست تاریخچه، پیش از اضافه شدن args حذف میشود.
- اگر متغیر HISTTIMEFORMAT تنظیم شده باشد، history اطلاعات برچسب زمانی مرتبط با هر مدخل تاریخچه را، همانطور که در بالا شرح داده شد با علامت نویسه توضیح تاریخچه نشانهگذاری کرده و در فایل تاریخچه مینویسد. هنگامی که فایل تاریخچه خوانده میشود، خطوطی که با نویسه توضیح تاریخچه آغاز شده و بلافاصله بعد از آن یک رقم میآید، بهعنوان برچسب زمانی برای مدخل تاریخچه پس از آن تفسیر میشوند.
- مقدار بازگشتی 0 است، مگر اینکه یک گزینه نامعتبر مشخص شود، خطایی هنگام خواندن یا نوشتن فایل تاریخچه رخ دهد، یک offset یا محدوده نامعتبر بهعنوان آرگومان به -d داده شود، یا بسط تاریخچه ارائهشده بهعنوان آرگومان به -p ناموفق باشد.
- jobs [-lnprs] [ jobspec ... ]
- jobs -x command [ args ... ]
- شکل اول، کارهای فعال را فهرست میکند. گزینهها معانی زیر را دارند:
- -l
- شناسههای فرایند (PID) را علاوه بر اطلاعات عادی فهرست میکند.
- -n
- اطلاعات را تنها برای کارهایی نمایش میدهد که وضعیت آنها از زمان آخرین اطلاعرسانی به کاربر تغییر کرده است.
- -p
- تنها شناسه فرایند (PID) مربوط به سرگروه گروه فرایندی کار را فهرست میکند.
- -r
- تنها کارهای در حال اجرا را نمایش میدهد.
- -s
- تنها کارهای متوقفشده را نمایش میدهد.
- اگر jobspec مشخص شده باشد، jobs خروجی را به اطلاعات مربوط به همان کار محدود میکند. وضعیت خروج 0 است، مگر اینکه یک گزینه نامعتبر یا یک jobspec نامعتبر ارائه شود.
- اگر گزینه -x مشخص شده باشد، jobs هر jobspec یافتشده در command یا args را با شناسه گروه فرایندی متناظر جایگزین میکند و command را اجرا کرده، args را به آن ارسال میکند و وضعیت خروج آن را بازمیگرداند.
- kill [-s sigspec | -n signum | -sigspec] id [ ... ]
- kill -l|-L [sigspec | exit_status]
- سیگنال مشخصشده توسط sigspec یا signum را به فرایندهایی که با هر id مشخص شدهاند، ارسال میکند. هر id میتواند یک مشخصه کار jobspec یا یک شناسه فرایند pid باشد. sigspec میتواند نام یک سیگنال بدون حساسیت به حروف بزرگ و کوچک، مانند SIGKILL (با پیشوند SIG یا بدون آن) یا شماره یک سیگنال باشد؛ signum شماره یک سیگنال است. اگر sigspec ارائه نشود، kill سیگنال SIGTERM را ارسال میکند.
- گزینه -l نام سیگنالها را فهرست میکند. اگر هنگام استفاده از -l هر آرگومانی ارائه شود، kill نامهای سیگنالهای متناظر با آن شناسهها را فهرست کرده و وضعیت خروج 0 خواهد بود. شناسه exit_status برای -l عددی است که یا یک شماره سیگنال و یا وضعیت خروج فرایندی را مشخص میکند که توسط یک سیگنال متوقف شده است؛ اگر ارائه شود، kill نام سیگنالی را چاپ میکند که موجب پایان فرایند شده است. kill فرض میکند وضعیتهای خروج فرایند بزرگتر از 128 هستند؛ هر مقداری کمتر از آن، یک شماره سیگنال در نظر گرفته میشود. گزینه -L معادل با -l است.
- دستور kill اگر حداقل یک سیگنال با موفقیت ارسال شود مقدار درست (true) و اگر خطایی رخ دهد یا یک گزینه نامعتبر ارائه شود مقدار نادرست (false) بازمیگرداند.
- let arg [arg ...]
- هر arg بهعنوان یک عبارت حسابی ارزیابی میشود (بخش ارزیابی حسابی (ARITHMETIC EVALUATION) را در بالا ببینید). اگر آخرین arg به 0 ارزیابی شود، let مقدار 1 را بازمیگرداند؛ در غیر این صورت let مقدار 0 را برمیگرداند.
- local [option] [name[=value] ... | - ]
- به ازای هر آرگومان، یک متغیر محلی به نام name ایجاد کرده و مقدار value را به آن اختصاص میدهد. گزینهٔ option میتواند هر یک از گزینههای پذیرفتهشده توسط declare باشد. هنگامی که local درون یک تابع استفاده شود، باعث میشود که دامنهٔ دید متغیر name تنها به همان تابع و فرزندان آن محدود گردد. استفاده از local در خارج از یک تابع خطاست.
- اگر name برابر - باشد، مجموعه گزینههای پوسته را برای تابعی که local در آن فراخوانی شده، محلی میکند: هر گزینهٔ پوستهای که با استفاده از دستور توکار set درون تابع پس از فراخوانی local تغییر کند، پس از بازگشت تابع به مقادیر اولیه خود بازگردانده میشود. این بازیابی بهگونهای انجام میشود که گویی مجموعهای از دستورات set برای بازگرداندن مقادیر قبلی موجود پیش از تابع اجرا شدهاند.
- بدون هیچ عملوندی، local فهرستی از متغیرهای محلی را در خروجی استاندارد مینویسد.
- وضعیت بازگشتی 0 است مگر اینکه local خارج از یک تابع استفاده شود، یک name نامعتبر ارائه گردد، یا name یک متغیر فقطخواندنی باشد.
- logout [n]
- خروج از یک پوستهٔ ورود به سیستم (login shell)، همراه با بازگرداندن وضعیت n به والد پوسته.
- mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
- readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
- خواندن خطوط از ورودی استاندارد، یا از توصیفگر فایل fd در صورت ارائهٔ گزینهٔ -u، در متغیر آرایهٔ اندیسدار array. متغیر MAPFILE مقدار پیشفرض array است. گزینهها در صورت ارائه، معانی زیر را دارند:
- -d
- استفاده از نخستین نویسهٔ delim برای پایان دادن به هر خط ورودی، بهجای نویسهٔ خط جدید. اگر delim یک رشتهٔ خالی باشد، mapfile خط را با خواندن نویسهٔ NUL پایان میدهد.
- -n
- کپی کردن حداکثر count خط. اگر مقدار count برابر 0 باشد، تمام خطوط کپی میشوند.
- -O
- شروع مقداردهی به array از اندیس origin. اندیس پیشفرض 0 است.
- -s
- تعداد count خط اول خواندهشده را نادیده میگیرد.
- -t
- کاراکتر پایانی delim (بهطور پیشفرض خط جدید یا newline) را از انتهای هر خط خواندهشده حذف میکند.
- -u
- خطوط را بهجای ورودی استاندارد، از توصیفگر فایل fd میخواند.
- -C
- تابع یا دستور callback را هر بار پس از خواندن quantum خط ارزیابی و اجرا میکند. گزینه -c مقدار quantum را مشخص میکند.
- -c
- تعداد خطوط خواندهشده بین هر بار فراخوانی callback را مشخص میکند.
- اگر -C بدون -c مشخص شود، مقدار پیشفرض quantum برابر ۵۰۰۰ است. هنگامی که callback ارزیابی میشود، اندیس عنصر بعدی آرایه که قرار است مقداردهی شود و نیز خطی که قرار است به آن عنصر اختصاص یابد، به عنوان آرگومانهای اضافی به آن ارسال میشوند. callback پس از خواندهشدن خط اما پیش از اختصاص دادهشدن آن به عنصر آرایه ارزیابی میشود.
- اگر مبدأ صریحی مشخص نشده باشد، mapfile پیش از مقداردهی، array را پاک خواهد کرد.
- دستور mapfile مقدار صفر را برمیگرداند مگر اینکه یک گزینه یا آرگومانِ گزینه نامعتبر ارائه شده باشد، array نامعتبر یا غیرقابل انتساب باشد، یا array یک آرایه اندیسدار نباشد.
- popd [-n] [+n] [-n]
- ورودیها را از پشته دایرکتوری حذف میکند. عناصر از ۰ با شروع از اولین دایرکتوری فهرستشده توسط dirs شمارهگذاری میشوند، بنابراین popd معادل است با “popd +0.” بدون هیچ آرگومانی، popd بالاترین دایرکتوری را از پشته حذف کرده، و به دایرکتوری بالای پشته جدید منتقل میشود. آرگومانها، در صورت ارائه، دارای معانی زیر هستند:
- -n
- هنگام حذف دایرکتوریها از پشته، از تغییر عادی دایرکتوری جلوگیری میکند، و تنها پشته را دستکاری مینماید.
- +n
- با شمارش از سمت چپ فهرست نمایش دادهشده توسط dirs، با شروع از صفر، nاُمین ورودی را از پشته حذف میکند. برای مثال: “popd +0” اولین دایرکتوری را حذف میکند، “popd +1” دومی را.
- -n
- با شمارش از سمت راست فهرست نمایش دادهشده توسط dirs، با شروع از صفر، nاُمین ورودی را حذف میکند. برای مثال: “popd -0” آخرین دایرکتوری را حذف میکند، “popd -1” یکی مانده به آخر را.
- اگر عنصر بالایی پشته دایرکتوری تغییر کند و گزینه -n ارائه نشده باشد، popd از دستور توکار cd برای رفتن به دایرکتوری موجود در بالای پشته استفاده میکند. اگر cd شکست بخورد، popd یک مقدار غیرصفر بازمیگرداند.
- در غیر این صورت، popd در صورتی که یک گزینه نامعتبر ارائه شده باشد، پشته دایرکتوری خالی باشد، یا n به ورودی ناموجودی در پشته دایرکتوری اشاره کند، مقدار نادرست (false) بازمیگرداند.
- اگر دستور popd موفقیتآمیز باشد، bash دستور dirs را اجرا میکند تا محتویات نهایی پشته دایرکتوری را نمایش دهد، و وضعیت بازگشتی ۰ خواهد بود.
- printf [-v var] format [arguments]
- نوشتن arguments باقالببندی در خروجی استاندارد تحت کنترل format. گزینهٔ -v خروجی را به متغیر var اختصاص میدهد به جای اینکه آن را در خروجی استاندارد چاپ کند.
- قالب format یک رشته نویسهای است که شامل سه نوع شیء است: نویسههای معمولی، که به سادگی در خروجی استاندارد کپی میشوند، توالیهای گریز نویسهای، که تبدیل شده و در خروجی استاندارد کپی میشوند، و مشخصکنندههای قالب، که هر یک باعث چاپ argument بعدی به ترتیب میشوند. علاوه بر نویسههای قالب استاندارد printf(3) شامل cCsSndiouxXeEfFgGaA، دستور printf مشخصکنندههای قالب اضافی زیر را تفسیر میکند:
- %b
- باعث میشود printf توالیهای گریز با ممیز وارونه (backslash) را در argument متناظر دقیقاً همانند echo -e بسط دهد.
- %q
- باعث میشود printf شناسهٔ argument متناظر را در قالبی خروجی دهد که بتوان آن را مجدداً به عنوان ورودی پوسته استفاده کرد. %q و %Q از شیوهٔ نقلقول $'' استفاده میکنند اگر نویسهای در رشتهٔ شناسه به آن نیاز داشته باشد، و در غیر این صورت از نقلقول با ممیز وارونه استفاده میکنند. اگر رشتهٔ قالب از حالت جایگزین printf استفاده کند، این دو قالب رشتهٔ شناسه را با استفاده از نقلقول تکی (single quote) نقلقول میکنند.
- %Q
- مانند %q، اما هر دقت ارائهشدهای را پیش از نقلقول کردن بر روی argument اعمال میکند.
- %(datefmt)T
- باعث میشود printf رشتهٔ تاریخ-زمان حاصل از استفاده از datefmt به عنوان رشتهٔ قالب برای strftime(3) را در خروجی چاپ کند. شناسهٔ argument متناظر یک عدد صحیح است که نمایانگر تعداد ثانیهها از زمان مبدأ (epoch) میباشد. این مشخصکننده قالب دو مقدار شناسهٔ ویژه را به رسمیت میشناسد: -1 نشاندهندهٔ زمان جاری است، و -2 نشاندهندهٔ زمانی است که پوسته فراخوانی شده است. اگر هیچ شناسهای مشخص نشود، تبدیل طوری رفتار میکند که گویی -1 ارائه شده است. این یک استثناء بر رفتار معمول printf است.
- مشخصکنندههای قالب %b، %q، و %T همگی از شناسههای پهنای فیلد و دقت از مشخصات قالب استفاده میکنند و به همان تعداد بایت از (یا فیلدی با آن اندازه پهنا برای) شناسهٔ بسطیافته مینویسند، که معمولاً حاوی نویسههای بیشتری نسبت به نسخهٔ اصلی است.
- مشخصکننده قالب %n شناسهٔ متناظری را میپذیرد که به عنوان نام یک متغیر پوسته در نظر گرفته میشود.
- مشخصکنندههای قالب %s و %c یک اصلاحکنندهٔ l (long) را میپذیرند، که آنها را مجبور میکند رشتهٔ شناسه را به یک رشته از نویسههای عریض تبدیل کنند و هر پهنای فیلد و دقت ارائهشده را بر حسب نویسهها اعمال کنند، نه بایتها. مشخصکنندههای قالب %S و %C به ترتیب معادل %ls و %lc هستند.
- شناسههای مشخصکنندههای قالب غیررشتهای به عنوان ثوابت C در نظر گرفته میشوند، با این استثناء که علامت مثبت یا منفی در ابتدای آنها مجاز است، و اگر نویسهٔ آغازین یک نقلقول تکی یا دوگانه باشد، مقدار برابر با مقدار عددی نویسهٔ بعدی با استفاده از محلیسازی (locale) جاری خواهد بود.
- رشتهٔ format در صورت نیاز مجدداً استفاده میشود تا تمام arguments مصرف شوند. اگر format به arguments بیشتری نسبت به موارد ارائهشده نیاز داشته باشد، مشخصات قالب اضافی طوری رفتار میکنند که گویی حسب مورد، مقدار صفر یا یک رشتهٔ تهی ارائه شده است. مقدار بازگشتی در صورت موفقیت صفر، و در صورت ارائهٔ یک گزینهٔ نامعتبر یا بروز خطای نوشتن یا انتساب، غیرصفر است.
- pushd [-n] [+n] [-n]
- pushd [-n] [dir]
- افزودن یک دایرکتوری به بالای پشتهٔ دایرکتوریها، یا چرخاندن پشته، به طوری که بالای جدید پشته دایرکتوری کاری جاری شود. بدون هیچ شناسهای، دستور pushd دو عنصر بالای پشتهٔ دایرکتوری را با یکدیگر جابهجا میکند. شناسهها، در صورت ارائه، معانی زیر را دارند:
- -n
- از تغییر دایرکتوری عادی هنگام چرخش یا افزودن دایرکتوریها به پشته جلوگیری میکند؛ تنها پشته را دستکاری میکند.
- +n
- پشته را طوری میچرخاند که nـمین دایرکتوری (با شمارش از سمت چپِ فهرست نمایشدادهشده توسط dirs، با شروع از صفر) در بالای پشته قرار گیرد.
- -n
- پشته را طوری میچرخاند که nـمین دایرکتوری (با شمارش از سمت راستِ فهرست نمایشدادهشده توسط dirs، با شروع از صفر) در بالای پشته قرار گیرد.
- dir
- دایرکتوری dir را به بالای پشته دایرکتوری اضافه میکند.
- پس از تغییر پشته، اگر گزینه -n مشخص نشده باشد، pushd از دستور توکار cd برای تغییر به دایرکتوری بالای پشته استفاده میکند. اگر cd ناموفق باشد، pushd یک مقدار غیرصفر بازمیگرداند.
- در غیر این صورت، اگر هیچ آرگومانی ارائه نشود، pushd مقدار صفر بازمیگرداند مگر اینکه پشته دایرکتوری خالی باشد. هنگام چرخش پشته دایرکتوری، pushd مقدار صفر بازمیگرداند مگر اینکه پشته دایرکتوری خالی باشد یا n عنصری ناموجود از پشته دایرکتوری را مشخص کند.
- اگر دستور pushd موفقیتآمیز باشد، bash دستور dirs را برای نمایش محتویات نهایی پشته دایرکتوری اجرا میکند.
- pwd [-LP]
- نام مسیر مطلق دایرکتوری کاری جاری را چاپ میکند. مسیر چاپشده شامل هیچ پیوند نمادینی نخواهد بود اگر گزینه -P ارائه شده باشد یا گزینه -o physical برای دستور توکار set فعال باشد. اگر از گزینه -L استفاده شود، مسیر چاپشده ممکن است شامل پیوندهای نمادین باشد. وضعیت بازگشتی 0 است مگر اینکه هنگام خواندن نام دایرکتوری جاری خطایی رخ دهد یا گزینهای نامعتبر ارائه شود.
- read [-Eers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
- یک سطر از ورودی استاندارد، یا از توصیفگر فایل fd که به عنوان آرگومان به گزینه -u داده شده است، میخواند، آن را طبق آنچه در بالا تحت بخش تفکیک کلمات (Word Splitting) شرح داده شده به کلمات تفکیک میکند، و اولین کلمه را به اولین name، دومین کلمه را به دومین name و به همین ترتیب اختصاص میدهد. اگر تعداد کلمات بیشتر از نامها باشد، کلمات باقیمانده و جداکنندههای میانی آنها به آخرین name اختصاص مییابند. اگر تعداد کلمات خواندهشده از جریان ورودی کمتر از نامها باشد، به نامهای باقیمانده مقادیر خالی اختصاص داده میشود. نویسهها در مقدار متغیر IFS برای تفکیک سطر به کلمات با استفاده از همان قواعدی که پوسته برای بسط به کار میبرد استفاده میشوند (شرح داده شده در بالا تحت بخش تفکیک کلمات (Word Splitting)). نویسه بکاسلش (\) هرگونه معنای ویژه را از نویسه بعدی که خوانده میشود حذف میکند و برای ادامه سطر استفاده میشود.
- گزینهها، در صورت ارائه، معانی زیر را دارند:
- -a aname
- کلمات به اندیسهای متوالی متغیر آرایهای aname، شروع از ۰، اختصاص داده میشوند. aname پیش از انتساب هر مقدار جدید، لغو مقدار (unset) میشود. سایر آرگومانهای name نادیده گرفته میشوند.
- -d delim
- نخستین نویسه از delim به جای خط جدید، به خط ورودی پایان میدهد. اگر delim یک رشته خالی باشد، read هنگام خواندن یک نویسه NUL، خط را خاتمه میدهد.
- -e
- اگر ورودی استاندارد از یک ترمینال میآید، read از readline (ببینید READLINE above) برای دریافت خط استفاده میکند. Readline از تنظیمات ویرایش جاری (یا پیشفرض، اگر ویرایش خط قبلاً فعال نبوده است) استفاده میکند، اما از تکمیل نام فایل پیشفرضِ readline استفاده مینماید.
- -E
- اگر ورودی استاندارد از یک ترمینال میآید، read از readline (ببینید READLINE above) برای دریافت خط استفاده میکند. Readline از تنظیمات ویرایش جاری (یا پیشفرض، اگر ویرایش خط قبلاً فعال نبوده است) استفاده میکند، اما از تکمیل پیشفرض bash، از جمله تکمیل برنامهپذیر (programmable completion) استفاده مینماید.
- -i text
- اگر readline برای خواندن خط به کار گرفته شده باشد، read متن text را پیش از آغاز ویرایش در بافر ویرایش قرار میدهد.
- -n nchars
- دستور read پس از خواندن nchars نویسه به جای انتظار برای یک خط ورودی کامل، بازمیگردد، مگر آنکه با EOF روبرو شود یا مهلت زمانی read پایان یابد، اما اگر پیش از نویسهٔ جداکننده کمتر از nchars نویسه خوانده باشد، جداکننده را رعایت میکند.
- -N nchars
- دستور read دقیقاً پس از خواندن nchars نویسه به جای انتظار برای یک خط ورودی کامل، بازمیگردد، مگر اینکه با EOF مواجه شود یا زمان read به سر رسد. هیچ نویسهٔ جداکنندهای در ورودی بهطور خاص در نظر گرفته نمیشود و تا زمانی که nchars نویسه خوانده نشود، باعث بازگشت read نخواهد شد. نتیجه روی نویسههای درون IFS تفکیک نمیشود؛ هدف این است که دقیقاً نویسههای خواندهشده به متغیر اختصاص داده شوند (به استثنای بکاسلش؛ گزینهٔ -r در زیر را ببینید).
- -p prompt
- پیش از تلاش برای خواندن هرگونه ورودی، اعلانِ prompt را بدون خط جدیدِ پایانی روی خطای استاندارد نمایش میدهد، اما تنها در صورتی که ورودی از ترمینال باشد.
- -r
- بکاسلش بهعنوان یک نویسه گریز (escape) عمل نمیکند. بکاسلش جزئی از خط به شمار میآید. بهویژه، یک جفت بکاسلش-خطجدید نمیتواند برای ادامهٔ خط استفاده شود.
- -s
- حالت خاموش (بیصدا). اگر ورودی از ترمینال میآید، نویسهها اکو (نمایش داده) نمیشوند.
- -t timeout
- باعث میشود read در صورتی که نتواند یک خط ورودی کامل (یا تعداد نویسههای مشخصشده) را ظرف timeout ثانیه بخواند، با اتمام مهلت مواجه شده و وضعیت شکست بازگرداند. timeout میتواند یک عدد اعشاری با یک بخش کسری پس از ممیز اعشار باشد. این گزینه فقط زمانی مؤثر است که read ورودی را از یک ترمینال، لوله (pipe)، یا دیگر فایلهای خاص میخواند؛ و هنگام خواندن از فایلهای معمولی هیچ اثری ندارد. اگر زمان read به سر رسد، هر ورودیِ جزئیِ خواندهشده را در متغیر مشخصشدهٔ name ذخیره میکند، و وضعیت خروج بزرگتر از ۱۲۸ خواهد بود. اگر timeout برابر ۰ باشد، read بلافاصله و بدون تلاش برای خواندن هیچ دادهای، بازمیگردد. در این حالت، اگر ورودی روی توصیفگر فایلِ مشخصشده در دسترس باشد، وضعیت خروج ۰ است، یا خواندن مقدار EOF را بازمیگرداند؛ در غیر این صورت مقداری غیر صفر خواهد بود.
- -u fd
- خواندن ورودی از توصیفگر فایل fd به جای ورودی استاندارد.
- به جز در حالتی که delim یک رشته خالی باشد، read هرگونه نویسه NUL را در ورودی نادیده میگیرد.
- اگر هیچ names مشخص نشود، read خط خواندهشده را، بدون جداکننده پایانی اما بدون هیچ تغییر دیگری، به متغیر REPLY اختصاص میدهد.
- وضعیت خروج صفر است، مگر اینکه با پایان فایل (end-of-file) مواجه شود، مهلت زمانی read به پایان برسد (که در این حالت وضعیت بزرگتر از ۱۲۸ است)، خطای انتساب متغیر (مانند انتساب به یک متغیر فقطخواندنی) رخ دهد، یا یک توصیفگر فایل نامعتبر بهعنوان آرگومان برای -u ارائه شده باشد.
- readonly [-aAf] [-p] [name[=word] ...]
- شناسههای names دادهشده بهعنوان فقطخواندنی (readonly) علامتگذاری میشوند؛ مقادیر این names را نمیتوان با انتساب بعدی تغییر داد یا حذف کرد (unset). اگر گزینه -f داده شود، هر name به یک تابع پوسته اشاره دارد. گزینه -a متغیرها را به آرایههای اندیسی محدود میکند؛ گزینه -A متغیرها را به آرایههای انجمنی محدود میسازد. اگر هر دو گزینه داده شوند، -A اولویت دارد. اگر هیچ آرگومان name ارائه نشود، یا اگر گزینه -p داده شود، فهرستی از تمام نامهای فقطخواندنی چاپ میشود. سایر گزینهها ممکن است برای محدود کردن خروجی به زیرمجموعهای از مجموعه نامهای فقطخواندنی استفاده شوند. گزینه -p خروجی را در قالبی نمایش میدهد که میتواند دوباره بهعنوان ورودی مورد استفاده قرار گیرد.
- دستور readonly این امکان را فراهم میکند که مقدار یک متغیر همزمان با تغییر صفت فقطخواندنی، با قرار دادن =value پس از نام متغیر تنظیم شود. این کار مقدار متغیر را روی value تنظیم میکند و در عین حال صفت فقطخواندنی را تغییر میدهد.
- وضعیت بازگشت ۰ است مگر اینکه با گزینهای نامعتبر مواجه شود، یکی از names یک نام معتبر برای متغیر پوسته نباشد، یا -f همراه با یک name که تابع نیست ارائه شده باشد.
- return [n]
- توقف اجرای یک تابع پوسته یا فایل منبعشده (sourced file) و بازگرداندن مقدار مشخصشده توسط n به فراخوانندهاش. اگر n حذف شود، وضعیت بازگشت همان وضعیت آخرین دستور اجرا شده است. اگر return توسط یک گرداننده تله (trap handler) اجرا شود، آخرین دستور استفادهشده برای تعیین وضعیت، آخرین دستور اجرا شده قبل از گرداننده تله است. اگر return در حین تله DEBUG اجرا شود، آخرین دستور استفادهشده برای تعیین وضعیت، آخرین دستور اجرا شده توسط گرداننده تله پیش از فراخوانی return است.
- هنگامی که return برای خاتمه دادن به اجرای اسکریپتی که توسط دستور . (source) در حال اجراست استفاده شود، باعث میشود پوسته اجرای آن اسکریپت را متوقف کند و n یا وضعیت خروج آخرین دستور اجرا شده در اسکریپت را بهعنوان وضعیت خروج اسکریپت بازگرداند. اگر n مشخص شده باشد، مقدار بازگشتی ۸ بیت کمارزشتر آن است.
- هر دستوری که با تله RETURN مرتبط باشد، قبل از اینکه ادامه اجرای برنامه پس از تابع یا اسکریپت از سر گرفته شود، اجرا میگردد.
- وضعیت بازگشت غیرصفر است اگر به return یک آرگومان غیرعددی داده شود، یا در خارج از یک تابع و نه در طول اجرای یک اسکریپت توسط . یا source استفاده شود.
- set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [arg ...]
- set [+abefhkmnptuvxBCEHPT] [+o option-name] [--] [-] [arg ...]
- set -o
- set +o
- بدون گزینهها، نام و مقدار هر متغیر پوسته را در قالبی نمایش میدهد که میتواند مجدداً به عنوان ورودی برای تنظیم یا بازنشانی متغیرهای فعلاً تنظیمشده استفاده شود. متغیرهای فقطخواندنی قابل بازنشانی نیستند. در حالت posix، فقط متغیرهای پوسته فهرست میشوند. خروجی بر اساس لوکال (locale) فعلی مرتب میشود. هنگامی که گزینهها مشخص شوند، ویژگیهای پوسته را تنظیم یا لغو میکنند. هرگونه آرگومان باقیمانده پس از پردازش گزینهها، به عنوان مقادیر برای پارامترهای مکانی در نظر گرفته شده و به ترتیب به $1، $2، ...، $n اختصاص مییابند. گزینهها در صورت تعیین شدن، معانی زیر را دارند:
- -a
- به هر متغیر یا تابعی که ایجاد یا تغییر داده میشود، صفت export داده شده و برای برونریزی به محیط دستورات بعدی نشانهگذاری میشود.
- -b
- وضعیت کارهای پسزمینه پایانیافته را فوراً گزارش میدهد، نه قبل از اعلان اولیه بعدی یا پس از پایان یک دستور پیشزمینه. این تنها زمانی مؤثر است که مدیریت کارها فعال باشد.
- -e
- اگر یک خط لوله (که ممکن است شامل یک دستور ساده باشد)، یک فهرست، یا یک دستور مرکب (نگاه کنید به گرامر پوسته (SHELL GRAMMAR) در بالا)، با یک وضعیت غیرصفر خارج شود، بلافاصله خارج میشود. پوسته خارج نمیشود اگر دستوری که با شکست مواجه میشود بخشی از فهرست دستوراتی باشد که بلافاصله پس از کلمه رزرو شده while یا until میآید، بخشی از آزمون پس از کلمات رزرو شده if یا elif باشد، بخشی از هر دستوری باشد که در یک فهرست && یا || اجرا میشود به جز دستوری که پس از آخرین && یا || میآید، هر دستوری در یک خط لوله به جز آخرین دستور باشد (مشروط به وضعیت گزینه پوسته pipefail)، یا اگر مقدار بازگشتی دستور با ! معکوس شده باشد. اگر یک دستور مرکب غیر از یک زیرپوسته (subshell) به دلیل شکست دستوری در حالی که -e نادیده گرفته میشده، وضعیت غیرصفر برگرداند، پوسته خارج نمیشود. یک تله (trap) روی ERR، در صورت تنظیم بودن، پیش از خروج پوسته اجرا میشود. این گزینه برای محیط پوسته و هر محیط زیرپوسته بهطور جداگانه اعمال میشود (نگاه کنید به محیط اجرای دستور (COMMAND EXECUTION ENVIRONMENT) در بالا)، و ممکن است باعث شود زیرپوستهها پیش از اجرای همه دستورات موجود در زیرپوسته خارج شوند.
- اگر یک دستور مرکب یا تابع پوسته در زمینهای اجرا شود که در آن -e نادیده گرفته میشود، هیچیک از دستورات اجرا شده در داخل بدنه دستور مرکب یا تابع تحت تأثیر تنظیمات -e قرار نخواهند گرفت، حتی اگر -e تنظیم شده باشد و یک دستور وضعیت شکست برگرداند. اگر یک دستور مرکب یا تابع پوسته هنگام اجرا در زمینهای که -e در آن نادیده گرفته میشود، -e را تنظیم کند، این تنظیم تا زمانی که دستور مرکب یا دستوری که حاوی فراخوانی تابع است کامل نشود، هیچ اثری نخواهد داشت.
- -f
- غیرفعال کردن بسط نام مسیر (pathname expansion).
- -h
- بهخاطر سپردن مکان دستورها هنگام جستجو برای اجرا. این گزینه بهطور پیشفرض فعال است.
- -k
- تمام آرگومانها در قالب عبارات انتساب در محیط دستور قرار میگیرند، نه فقط آنهایی که قبل از نام دستور میآیند.
- -m
- حالت پایش (Monitor mode). مدیریت کارها فعال میشود. این گزینه بهطور پیشفرض برای پوستههای تعاملی در سیستمهایی که از آن پشتیبانی میکنند روشن است (ببینید مدیریت کارها (JOB CONTROL) در بالا). تمام فرآیندها در یک گروه فرآیند جداگانه اجرا میشوند. هنگامی که یک کار پسزمینه کامل میشود، پوسته خطی شامل وضعیت خروج آن چاپ میکند.
- -n
- خواندن دستورها بدون اجرای آنها. این میتواند برای بررسی خطاهای نحوی یک اسکریپت پوسته استفاده شود. توسط پوستههای تعاملی نادیده گرفته میشود.
- -o option-name
- مقدار option-name میتواند یکی از موارد زیر باشد:
- allexport
- مشابه -a.
- braceexpand
- مشابه -B.
- emacs
- استفاده از رابط ویرایش خط فرمان به سبک emacs. این گزینه بهطور پیشفرض زمانی که پوسته تعاملی است فعال است، مگر اینکه پوسته با گزینه --noediting آغاز شده باشد. این همچنین بر رابط ویرایش مورد استفاده برای read -e تأثیر میگذارد.
- errexit
- مشابه -e.
- errtrace
- مشابه -E.
- functrace
- مشابه -T.
- hashall
- مشابه -h.
- histexpand
- مشابه -H.
- history
- فعال کردن تاریخچه دستورها، همانطور که توضیح داده شده است در بالا در بخش تاریخچه (HISTORY). این گزینه بهطور پیشفرض در پوستههای تعاملی روشن است.
- ignoreeof
- تأثیر آن مانند این است که دستور پوسته “IGNOREEOF=10” اجرا شده باشد (ببینید متغیرهای پوسته (Shell Variables) در بالا).
- keyword
- مشابه -k.
- monitor
- همانند -m.
- noclobber
- همانند -C.
- noexec
- همانند -n.
- noglob
- همانند -f.
- nolog
- در حال حاضر نادیده گرفته میشود.
- notify
- همانند -b.
- nounset
- همانند -u.
- onecmd
- همانند -t.
- physical
- همانند -P.
- pipefail
- اگر تنظیم شود، مقدار بازگشتی یک خط لوله (pipeline) برابر با مقدار آخرین (راستترین) دستوری است که با وضعیتی غیر از صفر خارج شده است، یا صفر اگر تمام دستورات درون خط لوله با موفقیت پایان یابند. این گزینه به صورت پیشفرض غیرفعال است.
- posix
- فعالسازی حالت posix؛ تغییر رفتار bash در مواردی که عملکرد پیشفرض با استاندارد POSIX متفاوت است تا با این استاندارد مطابقت یابد. ببینید همچنین ببینید (SEE ALSO) در زیر برای ارجاع به سندی که جزئیات چگونگی تأثیر حالت posix بر رفتار bash را شرح میدهد.
- privileged
- همانند -p.
- verbose
- همانند -v.
- vi
- استفاده از یک رابط ویرایش خط فرمان به سبک vi. این گزینه همچنین بر رابط ویرایش مورد استفاده برای read -e اثر میگذارد.
- xtrace
- همانند -x.
اگر -o بدون هیچ option-name ارائه شود، set تنظیمات کنونی گزینههای پوسته را چاپ میکند. اگر +o بدون هیچ option-name ارائه شود، set یک سری از دستورات set را برای بازسازی تنظیمات کنونی گزینهها در خروجی استاندارد چاپ میکند.
- -p
- روشن کردن حالت privileged. در این حالت، پوسته فایلهای $ENV و $BASH_ENV را نمیخواند، توابع پوسته از محیط به ارث برده نمیشوند، و متغیرهای SHELLOPTS، BASHOPTS، CDPATH، و GLOBIGNORE در صورت حضور در محیط نادیده گرفته میشوند. اگر پوسته با شناسه کاربری (گروهی) مؤثری آغاز شود که با شناسه کاربری (گروهی) واقعی برابر نیست و گزینه -p ارائه نشده باشد، این اقدامات انجام میشوند و شناسه کاربری مؤثر به شناسه کاربری واقعی تغییر مییابد. اگر گزینه -p هنگام راهاندازی ارائه شود، شناسه کاربری مؤثر بازنشانی نمیشود. خاموش کردن این گزینه باعث میشود که شناسههای کاربری و گروهی مؤثر به شناسههای کاربری و گروهی واقعی بازگردانده شوند.
- -r
- فعالسازی حالت پوستهٔ محدود (restricted shell). این گزینه پس از تنظیم شدن، دیگر قابل غیرفعال کردن نیست.
- -t
- خروج پس از خواندن و اجرای یک دستور.
- -u
- هنگام انجام بسط پارامتر، با متغیرها و پارامترهای مقداردهینشده (بهجز پارامترهای ویژهٔ “@” و “*”، یا متغیرهای آرایهای با اندیس “@” یا “*”) بهعنوان خطا رفتار میکند. اگر تلاشی برای بسط یک متغیر یا پارامتر مقداردهینشده انجام شود، پوسته یک پیام خطا چاپ کرده و اگر تعاملی نباشد، با وضعیتی غیرصفر خارج میشود.
- -v
- چاپ خطوط ورودی پوسته به همان صورتی که خوانده میشوند.
- -x
- پس از بسط هر simple command (دستور ساده)، دستور for، دستور case، دستور select یا دستور حسابی for، مقدار بسطیافتهٔ PS4 را نمایش میدهد که به دنبال آن دستور و آرگومانهای بسطیافتهاش یا فهرست کلمات مرتبط، در خروجی خطای استاندارد (standard error) چاپ میشود.
- -B
- پوسته بسط آکولاد را انجام میدهد (ببینید بسط آکولاد (Brace Expansion) را در بالا). این گزینه بهطور پیشفرض فعال است.
- -C
- در صورت تنظیم، bash یک فایل موجود را با عملگرهای تغییر مسیر >، >& و <> رونویسی (overwrite) نمیکند. استفاده از عملگر تغییر مسیر >| به جای > این مورد را نادیده میگیرد و ایجاد یک فایل خروجی را اجباری میکند.
- -E
- در صورت تنظیم، هرگونه تله (trap) روی ERR توسط توابع پوسته، جایگزینیهای دستور، و دستورات اجراشده در محیط زیرپوسته (subshell) به ارث برده میشود. تلهٔ ERR در چنین مواردی معمولاً به ارث برده نمیشود.
- -H
- فعالسازی جایگزینی تاریخچه به سبک !. این گزینه بهطور پیشفرض زمانی که پوسته تعاملی باشد فعال است.
- -P
- در صورت تنظیم، پوسته هنگام اجرای دستوراتی مانند cd که دایرکتوری کاری جاری را تغییر میدهند، پیوندهای نمادین (symbolic links) را دنبال و حل نمیکند. در عوض از ساختار فیزیکی دایرکتوری استفاده میکند. بهطور پیشفرض، bash هنگام اجرای دستوراتی که دایرکتوری جاری را تغییر میدهند، زنجیرهٔ منطقی دایرکتوریها را دنبال میکند.
- -T
- در صورت تنظیم، هرگونه تله روی DEBUG و RETURN توسط توابع پوسته، جایگزینیهای دستور، و دستورات اجراشده در محیط زیرپوسته به ارث برده میشود. تلههای DEBUG و RETURN معمولاً در چنین مواردی به ارث برده نمیشوند.
- --
- اگر هیچ آرگومانی به دنبال این گزینه نیاید، پارامترهای مکانی مقداردهینشده (unset) میشوند. در غیر این صورت، پارامترهای مکانی را برابر با argها قرار میدهد، حتی اگر برخی از آنها با یک - شروع شوند.
- -
- پایان گزینهها را اعلام کرده و تمام argهای باقیمانده را به پارامترهای موضعی اختصاص میدهد. گزینههای -x و -v خاموش (غیرفعال) میشوند. اگر هیچ argای وجود نداشته باشد، پارامترهای موضعی بدون تغییر باقی میمانند.
گزینهها بهطور پیشفرض غیرفعال هستند مگر آنکه خلاف آن ذکر شده باشد. استفاده از + بهجای - باعث غیرفعال شدن این گزینهها میشود. گزینهها را میتوان بهعنوان آرگومان هنگام فراخوانی پوسته نیز مشخص کرد. مجموعه گزینههای فعلی را میتوان در $- یافت. وضعیت بازگشتی همیشه صفر است مگر آنکه با یک گزینه نامعتبر مواجه شود.
- shift [n]
- تغییر نام پارامترهای موضعی از n+1 ... به $1 .... پارامترهایی که با شمارههای $# تا $#-n+1 مشخص شدهاند، حذف میشوند (unset میشوند). n باید یک عدد غیرمنفی کمتر یا مساوی با $# باشد. اگر n برابر 0 باشد، هیچ پارامتری تغییر نمیکند. اگر n داده نشود، فرض میشود 1 است. اگر n بزرگتر از $# باشد، پارامترهای موضعی تغییر نمیکنند. وضعیت بازگشتی بزرگتر از صفر خواهد بود اگر n بزرگتر از $# یا کمتر از صفر باشد؛ در غیر این صورت 0 است.
- shopt [-pqsu] [-o] [optname ...]
- تغییر وضعیت مقادیر تنظیماتی که رفتارهای اختیاری پوسته را کنترل میکنند. این تنظیمات میتوانند موارد فهرستشده در زیر باشند، یا اگر گزینه -o استفاده شود، گزینههای موجود با گزینه -o برای دستور توکار set خواهند بود.
- بدون هیچ گزینهای، یا با گزینه -p، فهرستی از تمام گزینههای قابل تنظیم را به همراه نمایش وضعیت فعال یا غیرفعال بودن هر یک نشان میدهد؛ اگر هرگونه optname ارائه شود، خروجی به آن گزینهها محدود میشود. گزینه -p خروجی را به شکلی نمایش میدهد که میتواند مجدداً بهعنوان ورودی استفاده شود.
- سایر گزینهها معانی زیر را دارند:
- -s
- فعال کردن (تنظیم) هر optname.
- -u
- غیرفعال کردن (لغو تنظیم) هر optname.
- -q
- خروجی عادی را سرکوب میکند (حالت بیصدا)؛ وضعیت بازگشتی مشخص میکند که آیا optname فعال است یا غیرفعال. اگر چند آرگومان optname همراه با -q ارائه شوند، در صورتی که تمام optnameها فعال باشند وضعیت بازگشتی صفر خواهد بود؛ در غیر این صورت غیرصفر است.
- -o
- مقادیر optname را به مواردی که برای گزینه -o دستور توکار set تعریف شدهاند، محدود میکند.
اگر هر یک از گزینههای -s یا -u بدون هیچ آرگومان optname استفاده شود، shopt بهترتیب تنها آن دسته از گزینههایی را نشان میدهد که فعال یا غیرفعال هستند. مگر در مواردی که خلاف آن ذکر شده باشد، گزینههای shopt بهطور پیشفرض غیرفعال (لغو شده) هستند.
وضعیت بازگشتی هنگام فهرست کردن گزینهها در صورتی که تمام optnameها فعال باشند صفر، و در غیر این صورت غیرصفر است. هنگام تنظیم یا لغو تنظیم گزینهها، وضعیت بازگشتی صفر است مگر اینکه یک optname گزینه معتبری برای پوسته نباشد.
فهرست گزینههای shopt عبارت است از:
- array_expand_once
- در صورت تنظیم، پوسته از ارزیابی چندباره زیرنویسهای آرایههای انجمنی و اندیسی در طول ارزیابی عبارات حسابی، هنگام اجرای دستورات توکاری که میتوانند تخصیص متغیر انجام دهند، و هنگام اجرای دستورات توکاری که ارجاعزدایی آرایه را انجام میدهند، جلوگیری میکند.
- assoc_expand_once
- منسوخشده؛ مترادفی برای array_expand_once.
- autocd
- در صورت تنظیم، نام دستوری که نام یک دایرکتوری باشد بهگونهای اجرا میشود که گویی آرگومانی برای دستور cd بوده است. این گزینه فقط توسط پوستههای تعاملی استفاده میشود.
- bash_source_fullpath
- در صورت تنظیم، نام فایلهای اضافهشده به متغیر آرایهای BASH_SOURCE به نام مسیرهای کامل تبدیل میشوند (بخش متغیرهای پوسته (Shell Variables) در بالا را ببینید).
- cdable_vars
- در صورت تنظیم، آرگومان ارائهشده به دستور توکار cd که یک دایرکتوری نباشد، بهعنوان نام متغیری در نظر گرفته میشود که مقدار آن دایرکتوری مورد نظر برای تغییر مسیر است.
- cdspell
- در صورت تنظیم، دستور cd تلاش میکند خطاهای املایی جزئی در بخشهای تشکیلدهنده نام دایرکتوری را تصحیح کند. خطاهای جزئی شامل جابهجایی نویسهها، یک نویسه جاافتاده، و یک نویسه اضافه است. اگر cd نام دایرکتوری را تصحیح کند، نام فایل تصحیحشده را چاپ میکند و اجرای دستور ادامه مییابد. این گزینه فقط توسط پوستههای تعاملی استفاده میشود.
- checkhash
- در صورت تنظیم، bash پیش از تلاش برای اجرای فرمانی که در جدول هش یافت شده است، وجود آن را بررسی میکند. اگر دستور هششده دیگر وجود نداشته باشد، bash یک جستجوی مسیر عادی انجام میدهد.
- checkjobs
- در صورت تنظیم، bash وضعیت تمام کارهای متوقفشده و در حال اجرا را قبل از خروج از یک پوسته تعاملی فهرست میکند. اگر کاری در حال اجرا باشد، bash خروج را به تعویق میاندازد تا زمانی که تلاش دومی برای خروج بدون اجرای دستوری در این میان انجام شود (بخش مدیریت کارها (JOB CONTROL) در بالا را ببینید). اگر کاری متوقف شده باشد، پوسته همیشه خروج را به تعویق میاندازد.
- checkwinsize
- در صورت تنظیم، bash اندازه پنجره را پس از هر دستور خارجی (غیرتوکار) بررسی میکند و در صورت نیاز، مقادیر LINES و COLUMNS را با استفاده از توصیفگر فایل مرتبط با خطای استاندارد (standard error) در صورتی که یک ترمینال باشد، بهروزرسانی مینماید. این گزینه بهطور پیشفرض فعال است.
- cmdhist
- در صورت تنظیم، bash تلاش میکند تا تمام خطوط یک دستور چندخطی را در همان مدخل تاریخچه ذخیره کند. این امکان ویرایش مجدد و آسان دستورات چندخطی را فراهم میسازد. این گزینه بهطور پیشفرض فعال است، اما تنها در صورتی تأثیر دارد که تاریخچه دستورات فعال باشد، همانطور که در بالا ذیل تاریخچه (HISTORY) شرح داده شده است.
- compat31
- compat32
- compat40
- compat41
- compat42
- compat43
- compat44
- این گزینهها جنبههای مختلف حالت سازگاری پوسته را کنترل میکنند (ببینید حالت سازگاری پوسته (SHELL COMPATIBILITY MODE) در زیر).
- complete_fullquote
- در صورت تنظیم بودن، bash هنگام انجام تکمیل (completion)، تمام فراکاراکترهای (metacharacters) پوسته را در نام فایلها و نام دایرکتوریها نقلقولبندی (quote) میکند. در صورت عدم تنظیم، bash فراکاراکترهایی مانند علامت دلار را از مجموعه کاراکترهایی که در نام فایلهای تکمیلشده نقلقولبندی میشوند، در صورتی که این فراکاراکترها در ارجاعات متغیرهای پوسته در کلمات مورد نظر برای تکمیل ظاهر شوند، حذف میکند. این بدان معناست که علامتهای دلار در نام متغیرهایی که به دایرکتوریها بسط مییابند، نقلقولبندی نخواهند شد؛ با این حال، هیچکدام از علامتهای دلار که در نام فایلها ظاهر میشوند نیز نقلقولبندی نخواهند شد. این ویژگی فقط زمانی فعال است که bash از بکاسلش برای نقلقولبندی نام فایلهای تکمیلشده استفاده میکند. این متغیر بهطور پیشفرض تنظیم است، که رفتار پیشفرض bash در نسخههای تا 4.2 نیز بوده است.
- direxpand
- در صورت تنظیم بودن، bash هنگام انجام تکمیل نام فایل، نام دایرکتوریها را با نتایج بسط کلمه جایگزین میکند. این کار محتویات بافر ویرایشی readline را تغییر میدهد. در صورت عدم تنظیم، bash تلاش میکند آنچه را که کاربر تایپ کرده حفظ کند.
- dirspell
- در صورت تنظیم بودن، bash در صورتی که نام دایرکتوری اولیه ارائهشده وجود نداشته باشد، هنگام تکمیل کلمه برای نامهای دایرکتوری تصحیح املا انجام میدهد.
- dotglob
- در صورت تنظیم بودن، bash نام فایلهایی را که با یک “.” شروع میشوند، در نتایج بسط مسیر وارد میکند. نامهای فایل . و .. همیشه باید به طور صریح مطابقت داده شوند، حتی اگر dotglob تنظیم شده باشد.
- execfail
- در صورت تنظیم بودن، اگر یک پوسته غیرتعاملی نتواند فایلی را که به عنوان آرگومان به دستور توکار exec داده شده اجرا کند، خارج نمیشود. یک پوسته تعاملی در صورت شکست exec خارج نمیشود.
- expand_aliases
- در صورت تنظیم بودن، نامهای مستعار همانطور که در بالا تحت عنوان نامهای مستعار (ALIASES) شرح داده شده بسط مییابند. این گزینه به طور پیشفرض برای پوستههای تعاملی فعال است.
- extdebug
- اگر هنگام فراخوانی پوسته یا در فایل راهانداز پوسته تنظیم شود، ترتیب اجرای پروفایل اشکالزدا (debugger profile) را قبل از شروع پوسته میدهد، دقیقاً مشابه گزینه --debugger. اگر بعد از فراخوانی تنظیم شود، رفتاری که برای استفاده توسط دیباگرها در نظر گرفته شده فعال میشود:
- 1.
- گزینه -F برای دستور توکار declare، نام فایل منبع و شماره خط متناظر با هر نام تابع ارائه شده بهعنوان آرگومان را نمایش میدهد.
- 2.
- اگر دستوری که توسط تله DEBUG اجرا میشود مقداری غیر صفر بازگرداند، دستور بعدی نادیده گرفته شده و اجرا نمیشود.
- 3.
- اگر دستوری که توسط تله DEBUG اجرا میشود مقدار ۲ را بازگرداند، و پوسته در حال اجرا در یک زیرروال باشد (یک تابع پوسته یا یک اسکریپت پوسته که توسط دستورات توکار . یا source اجرا شده باشد)، پوسته یک فراخوانی به return را شبیهسازی میکند.
- 4.
- BASH_ARGC و BASH_ARGV همانطور که در توضیحات آنها بالا آمده است بهروزرسانی میشوند.
- 5.
- ردیابی توابع فعال میشود: جایگزینی دستور، توابع پوسته، و زیرپوستههای فراخوانی شده با ( command )، تلههای DEBUG و RETURN را به ارث میبرند.
- 6.
- ردیابی خطا فعال میشود: جایگزینی دستور، توابع پوسته، و زیرپوستههای فراخوانی شده با ( command )، تله ERR را به ارث میبرند.
- extglob
- در صورت تنظیم، ویژگیهای تطبیق الگوی گسترشیافته شرح داده شده در بالا تحت بخش بسط نام مسیر (Pathname Expansion) را فعال میکند.
- extquote
- در صورت تنظیم، نقلقولهای $'string' و $"string" درون بسطهای ${parameter} محصور در نقلقولهای دوتایی انجام میشود. این گزینه بهطور پیشفرض فعال است.
- failglob
- در صورت تنظیم، الگوهایی که در طول بسط نام مسیر با هیچ نام فایلی تطبیق پیدا نکنند منجر به خطای بسط میشوند.
- force_fignore
- در صورت تنظیم، پسوندهای مشخصشده توسط متغیر پوستهای FIGNORE باعث میشوند هنگام انجام تکمیل کلمات، آن کلمات نادیده گرفته شوند حتی اگر کلمات نادیده گرفتهشده تنها تکمیلهای ممکن باشند. برای توضیحات مربوط به FIGNORE، بخش متغیرهای پوسته (Shell Variables) را در بالا ببینید. این گزینه بهطور پیشفرض فعال است.
- globasciiranges
- در صورت تنظیم، عبارتهای بازه مورد استفاده در عبارتهای قلاب تطبیق الگو (بخش تطبیق الگو (Pattern Matching) را در بالا) ببینید) هنگام انجام مقایسهها مانند محلیسازی سنتی C رفتار میکنند. بدین معنا که تطبیق الگو توالی مرتبسازی لوکال فعلی را در نظر نمیگیرد، بنابراین b بین A و B مرتب نخواهد شد، و نویسههای اسکی بزرگ و کوچک با یکدیگر مرتب میشوند.
- globskipdots
- در صورت تنظیم، بسط نام مسیر هرگز با نامهای فایل . و .. تطبیق داده نخواهد شد، حتی اگر الگو با یک “.” شروع شود. این گزینه بهطور پیشفرض فعال است.
- globstar
- در صورت تنظیم، الگوی ** استفادهشده در زمینه بسط نام مسیر با همه فایلها و صفر یا چند دایرکتوری و زیردایرکتوری مطابقت خواهد داشت. اگر پس از الگو یک / بیاید، تنها با دایرکتوریها و زیردایرکتوریها مطابقت مییابد.
- gnu_errfmt
- در صورت تنظیم، پیامهای خطای پوسته در قالب استاندارد پیام خطای گنو (GNU error message format) نوشته میشوند.
- histappend
- در صورت تنظیم، فهرست تاریخچه هنگام خروج پوسته به انتهای فایلی که نام آن در مقدار متغیر HISTFILE مشخص شده اضافه میشود، بهجای اینکه روی فایل بازنویسی شود.
- histreedit
- در صورت تنظیم و استفاده از readline، این امکان به کاربر داده میشود تا جایگزینی تاریخچه ناموفق را مجدداً ویرایش کند.
- histverify
- در صورت تنظیم و استفاده از readline، نتایج جایگزینی تاریخچه بلافاصله به تجزیهکننده پوسته ارسال نمیشود. در عوض، خط حاصل در بافر ویرایش readline بارگذاری شده و امکان تغییر بیشتر را فراهم میسازد.
- hostcomplete
- در صورت تنظیم و استفاده از readline، پوسته bash هنگام کاملکردن کلمهای حاوی @، تلاش میکند تا تکمیل نام میزبان (hostname) را انجام دهد (بخش Completing در زیر READLINE above را ببینید). این گزینه بهطور پیشفرض فعال است.
- huponexit
- در صورت تنظیم، bash هنگام خروج یک پوسته لاگین تعاملی، سیگنال SIGHUP را به همه کارها ارسال میکند.
- inherit_errexit
- در صورت تنظیم، جایگزینی دستور مقدار گزینه errexit را بهارث میبرد، بهجای اینکه آن را در محیط زیرپوسته غیرفعال کند. این گزینه هنگام فعال بودن حالت posix فعال است.
- interactive_comments
- در یک پوسته تعاملی، کلمهای که با # آغاز شود باعث نادیدهگرفتهشدن آن کلمه و تمام نویسههای باقیمانده در آن خط میشود، درست مانند یک پوسته غیرتعاملی (بخش توضیحات (COMMENTS) above را ببینید). این گزینه بهطور پیشفرض فعال است.
- lastpipe
- در صورت تنظیم و غیرفعال بودن مدیریت کارها، پوسته آخرین دستور از یک خط لوله (pipeline) را که در پسزمینه اجرا نشده است، در محیط پوسته جاری اجرا میکند.
- lithist
- در صورت تنظیم و فعال بودن گزینه cmdhist، دستورات چندخطی با خطوط جدید تعبیهشده بهجای استفاده از جداکنندههای نقطهویرگول در صورت امکان، در تاریخچه ذخیره میشوند.
- localvar_inherit
- در صورت تنظیم، متغیرهای محلی مقدار و ویژگیهای متغیری همنام که در یک حوزه قبلی وجود دارد را قبل از انتساب هر مقدار جدید، بهارث میبرند. ویژگی nameref بهارث برده نمیشود.
- localvar_unset
- در صورت تنظیم، فراخوانی unset روی متغیرهای محلی در حوزههای قبلی تابع، آنها را علامتگذاری میکند تا جستجوهای بعدی تا زمان بازگشت آن تابع، آنها را تنظیمنشده بیابند. این رفتار مشابه رفتار حذف متغیرهای محلی در حوزه تابع فعلی است.
- login_shell
- پوسته این گزینه را در صورتی که بهعنوان یک پوسته لاگین آغاز شده باشد تنظیم میکند (بخش فراخوانی (INVOCATION) above را ببینید). مقدار این گزینه قابل تغییر نیست.
- mailwarn
- در صورت تنظیم، اگر به فایلی که bash برای بررسی ایمیل آن را زیر نظر دارد از زمان آخرین بررسی دسترسی پیدا شده باشد، bash پیام “The mail in mailfile has been read” را نمایش میدهد.
- no_empty_cmd_completion
- در صورت تنظیم، و در صورتی که readline در حال استفاده باشد، هنگام تلاش برای تکمیل خودکار روی یک خط خالی، bash متغیر PATH را برای تکمیلهای احتمالی جستجو نمیکند.
- nocaseglob
- در صورت تنظیم، bash هنگام انجام بسط نام مسیر (نگاه کنید به بسط نام مسیر (Pathname Expansion) در بالا)، نامهای فایل را بدون توجه به بزرگی و کوچکی حروف مطابقت میدهد.
- nocasematch
- در صورت تنظیم، bash هنگام تطبیق در حین اجرای دستورات شرطی case یا [[، هنگام انجام بسط کلمه جایگزینی الگو، یا هنگام فیلتر کردن تکمیلهای احتمالی به عنوان بخشی از تکمیل برنامهپذیر، الگوها را بدون حساسیت به بزرگی و کوچکی حروف تطبیق میدهد.
- noexpand_translation
- در صورت تنظیم، bash نتایج ترجمهشده نقلقولهای $"..." را به جای علامت نقلقول دوتایی (double quotes) در علامت نقلقول تکی (single quotes) محصور میکند. اگر رشته ترجمه نشود، این گزینه تاثیری ندارد.
- nullglob
- در صورت تنظیم، الگوهای بسط نام مسیر که با هیچ فایلی مطابقت ندارند (نگاه کنید به بسط نام مسیر (Pathname Expansion) در بالا) به جای این که به خودشان بسط یابند، به هیچ بسط یافته و حذف میشوند.
- patsub_replacement
- در صورت تنظیم، bash موارد رخداد & در رشته جایگزینیِ جایگزینی الگو را به متن تطبیقدادهشده توسط الگو بسط میدهد، همانطور که در زیر بسط پارامتر (Parameter Expansion) در بالا شرح داده شده است. این گزینه به صورت پیشفرض فعال است.
- progcomp
- در صورت تنظیم، امکانات تکمیل برنامهپذیر را فعال میکند (نگاه کنید به تکمیل برنامهپذیر (Programmable Completion) در بالا). این گزینه به صورت پیشفرض فعال است.
- progcomp_alias
- در صورت تنظیم، و اگر تکمیل برنامهپذیر فعال باشد، bash با نام دستوری که هیچ تکمیلی برای آن وجود ندارد به عنوان یک نام مستعار احتمالی رفتار کرده و اقدام به بسط نام مستعار میکند. اگر این دستور نام مستعار داشته باشد، bash تلاش میکند با استفاده از کلمه دستور حاصل از نام مستعار بسطیافته، تکمیل برنامهپذیر را انجام دهد.
- promptvars
- در صورت تنظیم، رشتههای اعلان پس از بسطیافتن، مطابق با آنچه در خط اعلان (PROMPTING) در بالا شرح داده شده است، تحت بسط پارامتر، جایگزینی دستور، بسط حسابی و حذف نقلقول قرار میگیرند. این گزینه به صورت پیشفرض فعال است.
- restricted_shell
- پوسته اگر در حالت محدود آغاز به کار کرده باشد، این گزینه را تنظیم میکند (نگاه کنید به پوسته محدود (RESTRICTED SHELL) در زیر). مقدار این گزینه را نمیتوان تغییر داد. این مقدار هنگام اجرای فایلهای راهاندازی بازنشانی نمیشود، و به فایلهای راهاندازی امکان میدهد تشخیص دهند که آیا پوسته محدود است یا خیر.
- shift_verbose
- در صورت تنظیم بودن، دستور توکار shift هنگامی که تعداد تغییر مکان (shift) از تعداد پارامترهای مکانی فراتر رود، یک پیام خطا چاپ میکند.
- sourcepath
- در صورت تنظیم بودن، دستور توکار . (source) از مقدار PATH برای یافتن دایرکتوری حاوی فایلی که به عنوان آرگومان داده شده، در صورتی که گزینه -p داده نشده باشد، استفاده میکند. این گزینه بهطور پیشفرض فعال است.
- varredir_close
- در صورت تنظیم بودن، پوسته توصیفگرهای فایلی را که با استفاده از نحو تغییر مسیر {varname} اختصاص داده شدهاند (بخش REDIRECTION در بالا را ببینید) بهجای باز گذاشتن پس از اتمام دستور، بهطور خودکار میبندد.
- xpg_echo
- در صورت تنظیم بودن، دستور توکار echo توالیهای گریز ممیز وارونه (backslash-escape) را بهطور پیشفرض بسط میدهد. اگر گزینه پوسته posix نیز فعال باشد، echo هیچ گزینهای را تفسیر نمیکند.
- suspend [-f]
- اجرای این پوسته را تا زمانی که سیگنال SIGCONT را دریافت کند، معلق میکند. یک پوسته ورود (login shell)، یا پوستهای که مدیریت کارها (job control) در آن فعال نباشد، نمیتواند معلق شود؛ گزینه -f این وضعیت را نادیده گرفته و تعلیق را تحمیل میکند. وضعیت خروج 0 است مگر اینکه پوسته یک پوسته ورود باشد یا مدیریت کارها فعال نبوده و -f داده نشده باشد.
- test expr
- [ expr ]
- بسته به ارزیابی عبارت شرطی expr، وضعیت 0 (درست) یا 1 (نادرست) را برمیگرداند. هر عملگر و عملوند باید یک آرگومان جداگانه باشد. عبارتها از عناصر پایهای تشکیل شدهاند که در بالا تحت عنوان عبارات شرطی (CONDITIONAL EXPRESSIONS) شرح داده شدهاند. test هیچ گزینهای را نمیپذیرد، و همچنین آرگومان -- را به عنوان نشاندهنده پایان گزینهها نمیپذیرد و نادیده نمیگیرد.
- عبارتها ممکن است با استفاده از عملگرهای زیر ترکیب شوند که به ترتیب کاهش تقدم فهرست شدهاند. ارزیابی به تعداد آرگومانها بستگی دارد؛ به پایین مراجعه کنید. test هنگامی که پنج یا بیشتر آرگومان وجود داشته باشد از تقدم عملگرها استفاده میکند.
- ! expr
- درست است اگر expr نادرست باشد.
- ( expr )
- مقدار expr را برمیگرداند. این ممکن است برای نادیده گرفتن تقدم معمولی عملگرها استفاده شود.
- expr1 -a expr2
- درست است اگر هر دو expr1 و expr2 درست باشند.
- expr1 -o expr2
- درست است اگر یکی از expr1 یا expr2 درست باشد.
دستورهای test و [ عبارات شرطی را با استفاده از مجموعهای از قواعد بر اساس تعداد آرگومانها ارزیابی میکنند.
- 0 arguments
- عبارت نادرست (false) است.
- 1 argument
- عبارت درست (true) است اگر و تنها اگر آرگومان تهی (null) نباشد.
- 2 arguments
- اگر اولین آرگومان ! باشد، عبارت درست است اگر و تنها اگر آرگومان دوم تهی باشد. اگر اولین آرگومان یکی از عملگرهای شرطی یگانی (تکعملوندی) فهرستشده above تحت عبارات شرطی (CONDITIONAL EXPRESSIONS) باشد، در صورتی که آزمون یگانی درست باشد، عبارت درست است. اگر اولین آرگومان یک عملگر شرطی یگانی معتبر نباشد، عبارت نادرست است.
- 3 arguments
- شرایط زیر به ترتیبی که ذکر شدهاند اعمال میشوند. اگر آرگومان دوم یکی از عملگرهای شرطی دودویی (دوعملوندی) فهرستشده above تحت عبارات شرطی (CONDITIONAL EXPRESSIONS) باشد، نتیجهٔ عبارت، حاصل آزمون دودویی با استفاده از آرگومان اول و سوم بهعنوان عملوندها خواهد بود. عملگرهای -a و -o هنگامی که سه آرگومان وجود دارد، عملگرهای دودویی در نظر گرفته میشوند. اگر آرگومان اول ! باشد، مقدار برابر با نقیضِ آزمون دوآرگومانی با استفاده از آرگومانهای دوم و سوم است. اگر آرگومان اول دقیقاً ( و آرگومان سوم دقیقاً ) باشد، نتیجه آزمون تکآرگومانیِ آرگومان دوم خواهد بود. در غیر این صورت، عبارت نادرست است.
- 4 arguments
- شرایط زیر به ترتیبی که ذکر شدهاند اعمال میشوند. اگر اولین آرگومان ! باشد، نتیجه، نقیضِ عبارت سهآرگومانی تشکیلشده از آرگومانهای باقیمانده است. اگر آرگومان اول دقیقاً ( و آرگومان چهارم دقیقاً ) باشد، نتیجه، آزمون دوآرگومانیِ آرگومانهای دوم و سوم است. در غیر این صورت، عبارت بر اساس اولویتها با استفاده از قواعد ذکرشده در بالا تجزیه و ارزیابی میشود.
- 5 or more arguments
- عبارت بر اساس اولویتها با استفاده از قواعد ذکرشده در بالا تجزیه و ارزیابی میشود.
هنگامی که پوسته در حالت posix باشد، یا اگر عبارت بخشی از دستور [[ باشد، عملگرهای < و > با استفاده از لوکال (locale) جاری مرتبسازی میکنند. اگر پوسته در حالت posix نباشد، دستورهای test و [ به صورت لغتنگاری با استفاده از ترتیب ASCII مرتبسازی را انجام میدهند.
تجزیهٔ سنتی اولویت عملگرها با ۴ آرگومان یا بیشتر میتواند هنگام مواجهه با رشتههایی که شبیه عملوندهای اولیه (primaries) هستند، منجر به ابهام شود. استاندارد POSIX عملوندهای اولیهٔ -a و -o و محصور کردن عبارات درون پرانتزها را منسوخ اعلام کرده است. اسکریپتها دیگر نباید از آنها استفاده کنند. بسیار قابلاطمینانتر است که فراخوانیهای test به یک عملوند اولیه محدود شوند، و استفاده از -a و -o با عملگرهای لیستیِ && و || پوسته جایگزین شود.
- times
- زمانهای انباشتهشدهٔ کاربر و سیستم را برای پوسته و فرایندهای اجراشده از پوسته چاپ میکند. وضعیت بازگشتی 0 است.
- trap [-lpP] [[action] sigspec ...]
- دستورِ action دستوری است که هنگام دریافت هر یک از سیگنالهای sigspec توسط پوسته، خوانده و اجرا میشود. اگر action حاضر نباشد (و تنها یک sigspec وجود داشته باشد) یا برابر با - باشد، هر sigspec مشخصشده به مقداری که در زمان شروع به کار پوسته داشت، بازنشانی میشود. اگر action رشتهٔ تهی باشد، سیگنال مشخصشده توسط هر sigspec توسط پوسته و دستورهایی که فراخوانی میکند، نادیده گرفته میشود.
- اگر هیچ آرگومانی ارائه نشود، trap عملیات مرتبط با هر سیگنال به دامافتاده را به عنوان مجموعهای از دستورهای trap نمایش میدهد که میتوانند دوباره به عنوان ورودی پوسته برای بازیابی چینشهای جاری سیگنال استفاده شوند. اگر -p داده شود، و action وجود نداشته باشد، آنگاه trap عملیات مرتبط با هر sigspec یا در صورت ارائه نشدن هیچکدام، برای همهٔ سیگنالهای به دامافتاده را به صورت مجموعهای از دستورهای trap نمایش میدهد که میتوانند مجدداً به عنوان ورودی پوسته برای بازیابی چینشهای جاری سیگنال استفاده شوند. گزینهٔ -P رفتاری مشابه دارد، اما تنها عملیات مرتبط با هر آرگومان sigspec را نمایش میدهد. گزینهٔ -P به حداقل یک آرگومان sigspec نیاز دارد. گزینههای -P یا -p ممکن است در یک محیط زیرپوسته (مانند جایگزینی دستور) استفاده شوند و تا زمانی که قبل از بهکارگیری trap برای تغییر مدیریت یک سیگنال استفاده شوند، وضعیت تلههای والد خود را نمایش خواهند داد.
- گزینهٔ -l فهرستی از نامهای سیگنالها و شمارههای متناظر با آنها را چاپ میکند. هر sigspec یا یک نام سیگنال تعریفشده در <signal.h> است، یا یک شمارهٔ سیگنال. نامهای سیگنال به حروف بزرگ و کوچک حساس نیستند و پیشوندِ SIG اختیاری است. اگر -l بدون هیچ آرگومان sigspec ارائه شود، فهرستی از نامهای سیگنال معتبر را چاپ میکند.
- اگر یک sigspec برابر با EXIT (0) باشد، action هنگام خروج از پوسته اجرا میشود. اگر یک sigspec برابر با DEBUG باشد، action قبل از هر simple command (دستور ساده)، دستور for، دستور case، دستور select، دستور حسابی ((، دستور شرطی [[، دستور حسابی for، و قبل از اجرای اولین دستور در یک تابع پوسته اجرا میشود (ببینید گرامر پوسته (SHELL GRAMMAR) above). برای جزئیات اثر آن بر تلهٔ DEBUG، به توضیحات گزینهٔ پوستهایِ extdebug مراجعه کنید (ببینید shopt above). اگر یک sigspec برابر با RETURN باشد، action هر بار که یک تابع پوسته یا یک اسکریپتِ اجراشده با دستورات توکار . یا source اجرای خود را به پایان میرساند، اجرا میشود.
- اگر یک sigspec برابر با ERR باشد، action هر زمان که یک خطلوله (pipeline - که ممکن است شامل یک دستور سادهٔ تکی باشد)، یک لیست، یا یک دستور مرکب یک وضعیت خروج غیرصفر برگرداند، با رعایت شرایط زیر اجرا میشود. تلهٔ ERR اجرا نمیشود اگر دستور شکستخورده بخشی از فهرست دستورات بلافاصله پس از یک کلمهٔ رزروشدهٔ while یا until باشد، بخشی از آزمون در یک عبارت if باشد، بخشی از یک دستورِ اجراشده در یک فهرستِ && یا || بهجز دستورِ پس از && یا || نهایی باشد، هر دستوری در یک خطلوله به جز آخرین دستور (مشروط به وضعیت گزینهٔ پوستهای pipefail) باشد، یا اگر مقدار بازگشتی دستور با استفاده از ! معکوس شده باشد. اینها همان شرایطی هستند که گزینهٔ errexit (-e) از آنها پیروی میکند.
- هنگامی که پوسته تعاملی نباشد، سیگنالهایی که هنگام ورود به پوسته نادیده گرفته شدهاند، قابل به دام انداختن یا بازنشانی نیستند. پوستههای تعاملی امکان به دام انداختن سیگنالهای نادیده گرفتهشده در بدو ورود را میدهند. سیگنالهای به دامافتادهای که نادیده گرفته نمیشوند، هنگام ایجاد یک زیرپوسته یا محیط زیرپوسته، به مقادیر اصلی خود بازنشانی میشوند. اگر هر sigspec نامعتبر باشد، وضعیت بازگشتی نادرست (false) است؛ در غیر این صورت trap مقدار درست (true) را برمیگرداند.
- true
- کاری انجام نمیدهد، وضعیت 0 را برمیگرداند.
- type [-aftpP] name [name ...]
- مشخص میکند که هر name در صورت استفاده به عنوان نام دستور چگونه تفسیر خواهد شد.
- اگر گزینه -t استفاده شود، type رشتهای را چاپ میکند که یکی از موارد alias، keyword، function، builtin، یا file است، بسته به اینکه name به ترتیب یک نام مستعار، کلمه رزرو شده پوسته، تابع، دستور توکار یا فایل اجرایی باشد. اگر name یافت نشود، type چیزی چاپ نمیکند و وضعیت خروج غیرصفر برمیگرداند.
- اگر گزینه -p استفاده شود، type یا مسیر کامل فایل اجرایی را برمیگرداند که با جستجوی $PATH برای name یافت میشود، یا اگر “type -t name” مقدار file را برنگرداند، چیزی چاپ نمیکند. گزینه -P جستجو در PATH را برای هر name اجباری میکند، حتی اگر “type -t name” مقدار file را برنگرداند. اگر name در جدول دستورات هششده موجود باشد، -p و -P مقدار هششده را چاپ میکنند که لزوماً فایلی نیست که ابتدا در PATH ظاهر میشود.
- اگر گزینه -a استفاده شود، type تمام مکانهایی را که شامل دستوری با نام name هستند چاپ میکند. این شامل نامهای مستعار، کلمات رزرو شده، توابع و دستورات توکار میشود، اما گزینههای جستجوی مسیر (-p و -P) میتوانند ارائه شوند تا خروجی را به فایلهای اجرایی محدود کنند. type هنگام استفاده از -a به همراه -p، به جدول دستورات هششده مراجعه نمیکند، و فقط یک جستجو در PATH برای name انجام میدهد.
- گزینه -f جستجوی توابع پوسته را نادیده میگیرد، مشابه دستور توکار command. type اگر تمام آرگومانها یافت شوند مقدار درست (true) و در صورت پیدا نشدن هر یک از آنها مقدار نادرست (false) را برمیگرداند.
- ulimit [-HS] -a
- ulimit [-HS] [-bcdefiklmnpqrstuvxPRT [limit]]
- امکان کنترل روی منابع در دسترس پوسته و فرایندهایی که آغاز میکند را در سیستمهایی که چنین کنترلی را مجاز میدانند، فراهم میکند.
- گزینههای -H و -S مشخص میکنند که آیا محدودیت سخت (hard) یا نرم (soft) برای منبع دادهشده تنظیم شود. یک محدودیت سخت پس از تنظیم نمیتواند توسط کاربر غیرریشه (non-root) افزایش یابد؛ یک محدودیت نرم ممکن است تا مقدار محدودیت سخت افزایش پیدا کند. اگر نه -H و نه -S مشخص نشده باشد، ulimit هر دو محدودیت نرم و سخت را تنظیم میکند.
- مقدار limit میتواند عددی در واحد مشخصشده برای منبع باشد یا یکی از مقادیر ویژه hard، soft، یا unlimited، که به ترتیب نشاندهنده محدودیت سخت فعلی، محدودیت نرم فعلی و نامحدود هستند. اگر limit حذف شود، ulimit مقدار فعلی محدودیت نرم آن منبع را چاپ میکند، مگر اینکه گزینه -H داده شده باشد. هنگامی که بیش از یک منبع مشخص شده باشد، نام محدودیت و واحد آن، در صورت مناسب بودن، پیش از مقدار چاپ میشوند. گزینههای دیگر به شرح زیر تفسیر میشوند:
- -a
- تمام محدودیتهای فعلی را گزارش میدهد؛ هیچ محدودیتی تنظیم نمیشود.
- -b
- حداکثر اندازه بافر سوکت.
- -c
- حداکثر اندازه فایلهای core ایجاد شده.
- -d
- حداکثر اندازه بخش داده (data segment) یک فرایند.
- -e
- حداکثر اولویت زمانبندی (“nice”).
- -f
- حداکثر اندازه فایلهای نوشتهشده توسط پوسته و فرزندان آن.
- -i
- حداکثر تعداد سیگنالهای معلق (pending).
- -k
- حداکثر تعداد kqueueهایی که میتوان تخصیص داد.
- -l
- حداکثر اندازهای که میتوان در حافظه قفل کرد.
- -m
- حداکثر اندازه مجموعه مقیم (resident set size) (بسیاری از سیستمها این محدودیت را رعایت نمیکنند).
- -n
- حداکثر تعداد توصیفکنندههای باز فایل (بیشتر سیستمها اجازه تنظیم این مقدار را نمیدهند).
- -p
- اندازه پایپ بر حسب بلوکهای ۵۱۲ بایتی (این مقدار ممکن است قابل تنظیم نباشد).
- -q
- حداکثر تعداد بایتها در صفهای پیام POSIX .
- -r
- حداکثر اولویت زمانبندی بلادرنگ (real-time).
- -s
- حداکثر اندازه پشته (stack).
- -t
- حداکثر مقدار زمان پردازنده (cpu) بر حسب ثانیه.
- -u
- حداکثر تعداد فرایندهای در دسترس برای یک کاربر واحد.
- -v
- حداکثر مقدار حافظه مجازی در دسترس پوسته و در برخی سیستمها، فرزندان آن.
- -x
- حداکثر تعداد قفلهای فایل.
- -P
- حداکثر تعداد شبهترمینالها (pseudoterminals).
- -R
- حداکثر زمانی که یک فرایند بلادرنگ میتواند قبل از مسدود شدن اجرا شود، بر حسب میکروثانیه.
- -T
- حداکثر تعداد ریسهها (threads).
اگر limit داده شود و گزینه -a استفاده نشود، limit مقدار جدید منبع مشخصشده خواهد بود. اگر هیچ گزینهای مشخص نشود، آنگاه -f فرض میشود.
مقادیر در پلههای ۱۰۲۴ بایتی هستند، به جز -t، که بر حسب ثانیه است؛ -R، که بر حسب میکروثانیه است؛ -p، که در واحدهایی از بلوکهای ۵۱۲ بایتی است؛ -P، -T، -b، -k، -n، و -u، که مقادیر بدون مقیاس هستند؛ و هنگامی که در حالت posix باشد، -c و -f، که در پلههای ۵۱۲ بایتی هستند. وضعیت خروج 0 است مگر اینکه گزینه یا آرگومان نامعتبری ارائه شود، یا هنگام تنظیم یک محدودیت جدید خطایی رخ دهد.
- umask [-p] [-S] [mode]
- ماسک ایجاد فایل کاربر را روی mode تنظیم میکند. اگر mode با یک رقم شروع شود، به عنوان یک عدد در مبنای هشت (اکتال) تفسیر میشود؛ در غیر این صورت، به عنوان یک ماسک حالت نمادین مشابه آنچه توسط chmod(1) پذیرفته میشود، تفسیر خواهد شد. اگر mode حذف شود (مشخص نشود)، umask مقدار فعلی ماسک را چاپ میکند. گزینه -S بدون آرگومان mode، ماسک را در قالب نمادین چاپ میکند؛ خروجی پیشفرض یک عدد در مبنای هشت است. اگر گزینه -p داده شود و mode مشخص نشود، خروجی به شکلی خواهد بود که میتواند مجدداً به عنوان ورودی استفاده شود. وضعیت بازگشتی در صورتی که حالت با موفقیت تغییر یابد یا اگر هیچ آرگومان mode داده نشده باشد صفر، و در غیر این صورت غیرصفر است.
- unalias [-a] [name ...]
- هر name را از فهرست نامهای مستعار تعریفشده حذف میکند. اگر -a مشخص شود، تمام تعاریف نامهای مستعار حذف میشوند. مقدار بازگشتی درست (true) است مگر اینکه یک name ارائهشده جزو نامهای مستعار تعریفشده نباشد.
- unset [-fv] [-n] [name ...]
- به ازای هر name، متغیر یا تابع متناظر را حذف میکند. اگر گزینه -v داده شود، هر name به یک متغیر پوسته اشاره دارد و آن متغیر حذف میشود. اگر -f مشخص شود، هر name به یک تابع پوسته اشاره دارد و تعریف آن تابع حذف میگردد. اگر گزینه -n ارائه شود و name متغیری با ویژگی nameref باشد، به جای متغیری که به آن ارجاع دارد، خود name لغو مقدار (unset) میشود. در صورت ارائه گزینه -f، گزینه -n هیچ تأثیری ندارد. متغیرها و توابع فقطخواندنی (Read-only) را نمیتوان لغو مقدار کرد. هنگامی که متغیرها یا توابع حذف میشوند، از محیطی که به دستورات بعدی منتقل میشود نیز حذف میگردند. اگر هیچ گزینهای مشخص نشود، هر name به یک متغیر اشاره دارد؛ اگر هیچ متغیری با آن نام وجود نداشته باشد، تابعی با آن نام (در صورت وجود) لغو مقدار میشود. برخی از متغیرهای پوسته را نمیتوان لغو مقدار کرد. اگر هر یک از متغیرهای BASH_ALIASES، BASH_ARGV0، BASH_CMDS، BASH_COMMAND، BASH_SUBSHELL، BASHPID، COMP_WORDBREAKS، DIRSTACK، EPOCHREALTIME، EPOCHSECONDS، FUNCNAME، GROUPS، HISTCMD، LINENO، RANDOM، SECONDS، یا SRANDOM لغو مقدار شوند، ویژگیهای خاص خود را از دست میدهند، حتی اگر بعداً دوباره مقداردهی شوند. وضعیت خروج درست (true) است مگر اینکه یک name فقطخواندنی باشد یا نتوان آن را لغو مقدار کرد.
- wait [-fn] [-p varname] [id ...]
- منتظر پایان هر پردازه فرزند مشخصشده با id میماند و وضعیت خاتمه آخرین id را بازمیگرداند. هر id میتواند یک شناسه پردازه pid یا مشخصه کار jobspec باشد؛ اگر مشخصه کار داده شود، wait منتظر تمام پردازههای آن کار میماند.
- اگر هیچ گزینه یا idای مشخص نشود، wait منتظر تمام کارهای در حال اجرای پسزمینه و آخرین جایگزینی پردازه اجراشده (اگر شناسه پردازه آن با $! یکسان باشد) میماند، و وضعیت بازگشتی صفر خواهد بود.
- اگر گزینه -n مشخص شود، wait منتظر هر کدام از idهای دادهشده یا، در صورتی که هیچ idای داده نشده باشد، منتظر تکمیل هر کار یا جایگزینی پردازهای میماند و وضعیت خروج آن را بازمیگرداند. اگر هیچیک از idهای مشخصشده فرزند پوسته نباشند، یا اگر هیچ idای داده نشده باشد و پوسته هیچ فرزندِ منتظرناشدهای نداشته باشد، وضعیت خروج ۱۲۷ است.
- اگر گزینه -p مشخص شود، wait شناسه پردازه یا کارِ کاری را که وضعیت خروج آن بازگردانده شده، به متغیر varname که توسط آرگومان گزینه نامگذاری شده است انتساب میدهد. این متغیر، که نمیتواند فقطخواندنی باشد، ابتدا و پیش از هر انتسابی، لغو مقدار (unset) خواهد شد. این مورد تنها زمانی که همراه با گزینه -n استفاده شود کاربرد دارد.
- مشخص کردن گزینه -f، در زمانی که مدیریت کارها فعال است، wait را مجبور میکند که به جای بازگشت در هنگام تغییر وضعیت هر id، تا خاتمه یافتن کامل آن منتظر بماند و سپس وضعیتش را برگرداند.
- اگر هیچیک از idها نشاندهنده یکی از پردازههای فرزند فعال پوسته نباشد، وضعیت بازگشتی ۱۲۷ است. اگر اجرای wait با یک سیگنال متوقف شود، هر متغیر varname بهصورت تنظیمنشده (unset) باقی میماند، و وضعیت بازگشتی بزرگتر از ۱۲۸ خواهد بود، همانطور که در بخش سیگنالها (SIGNALS) در بالا شرح داده شده است. در غیر این صورت، وضعیت بازگشتی، وضعیت خروج آخرین id خواهد بود.
حالت سازگاری پوسته (SHELL COMPATIBILITY MODE)
نگارش 4.0 پوسته Bash مفهوم سطح سازگاری پوسته (shell compatibility level) را معرفی کرد، که به عنوان مجموعهای از گزینهها برای دستور توکار shopt مشخص میشود (compat31، compat32، compat40، compat41، و غیره). تنها یک سطح سازگاری جاری وجود دارد — هر گزینه با دیگری ناسازگار و مانعةالجمع است. هدف از سطح سازگاری این است که به کاربران اجازه دهد رفتار نسخههای پیشین را که با نسخههای جدیدتر ناسازگار است انتخاب کنند تا بتوانند اسکریپتهای خود را جهت استفاده از ویژگیها و رفتارهای جدید منتقل نمایند. این ویژگی به عنوان یک راهکار موقتی در نظر گرفته شده است.
این بخش به رفتاری که برای یک نسخه خاص استاندارد است اشارهای نمیکند (برای مثال، تنظیم compat32 به این معنی است که نقلقول کردن سمت راست عملگر تطبیق عبارت منظم، نویسههای خاص عبارت منظم را در کلمه نقلقول میکند، که رفتار پیشفرض در bash-3.2 و نسخههای بعدی آن است).
اگر کاربری برای نمونه compat32 را فعال کند، ممکن است بر رفتار سایر سطوح سازگاری تا و شامل سطح سازگاری جاری تأثیر بگذارد. ایده این است که هر سطح سازگاری رفتاری را کنترل میکند که در آن نسخه از bash تغییر یافته است، اما آن رفتار ممکن است در نسخههای پیشین نیز وجود داشته باشد. برای نمونه، تغییر به استفاده از مقایسههای مبتنی بر محلیسازی (locale) با دستور [[ در bash-4.1 اضافه شد، در حالی که نسخههای قبلی از مقایسههای مبتنی بر ASCII استفاده میکردند؛ بنابراین فعالسازی compat32 مقایسههای مبتنی بر ASCII را نیز فعال میکند. این سطح از تفکیک ممکن است برای همه کاربردها کافی نباشد، و در نتیجه کاربران باید سطوح سازگاری را با دقت به کار گیرند. برای آگاهی از رفتار جاری، مستندات مربوط به هر ویژگی خاص را مطالعه کنید.
نگارش 4.3 پوسته Bash یک متغیر پوسته جدید معرفی کرد: BASH_COMPAT. مقدار منتسبشده به این متغیر (یک شماره نسخه اعشاری مانند 4.2، یا یک عدد صحیح متناظر با گزینه compatNN، مانند 42) سطح سازگاری را تعیین میکند.
با شروع از bash-4.4، bash منسوخ کردن سطوح سازگاری قدیمیتر را آغاز کرد. در نهایت، این گزینهها به نفع BASH_COMPAT حذف خواهند شد.
نسخهٔ Bash-5.0 آخرین نسخهای بود که یک گزینهٔ shopt اختصاصی برای نسخهٔ قبلی داشت. BASH_COMPAT تنها سازوکار برای کنترل سطح سازگاری در نسخههای جدیدتر از bash-5.0 است.
جدول زیر تغییرات رفتاری کنترلشده توسط هر تنظیم سطح سازگاری را شرح میدهد. برچسب compatNN به عنوان کوتهنوشتی برای تنظیم سطح سازگاری روی NN با استفاده از یکی از سازوکارهای زیر به کار میرود. برای نسخههای پیش از bash-5.0، سطح سازگاری ممکن است با استفاده از گزینهٔ compatNN متناظر در shopt تنظیم شود. برای نسخهٔ bash-4.3 و نسخههای جدیدتر، متغیر BASH_COMPAT ترجیح داده میشود، و برای bash-5.1 و نسخههای جدیدتر الزامی است.
- compat31
- •
- نقلقول کردن سمت راست عملگر تطابق عبارت منظم در دستور [[ (یعنی =~) اثر خاصی ندارد.
- compat32
- •
- عملگرهای < و > در دستور [[ هنگام مقایسهٔ رشتهها لوکال جاری را در نظر نمیگیرند؛ آنها از ترتیب اسکی (ASCII) استفاده میکنند.
- compat40
- •
- عملگرهای < و > در دستور [[ هنگام مقایسهٔ رشتهها لوکال جاری را در نظر نمیگیرند؛ آنها از ترتیب اسکی (ASCII) استفاده میکنند. نسخههای Bash پیش از bash-4.1 از تطبیق ترتیبی اسکی و strcmp(3) استفاده میکنند؛ نسخهٔ bash-4.1 و جدیدتر از ترتیب تطبیق لوکال جاری و strcoll(3) استفاده میکنند.
- compat41
- در حالت posix، دستور time ممکن است با گزینههایی دنبال شود و همچنان بهعنوان یک کلمهٔ رزرو شده شناخته شود (این تفسیر شماره ۲۶۷ POSIX است).
- در حالت posix، تجزیهکننده الزام میکند که تعداد زوجی از نقلقولهای تکی در بخش word از یک بسط پارامتر دابلکوتیشندار وجود داشته باشد و با آنها بهطور ویژهای رفتار میکند، بهطوری که نویسههای درون کوتیشنهای تکی نقلقولشده (کوتیشندار) در نظر گرفته میشوند (این تفسیر شماره ۲۲۱ POSIX است).
- compat42
- رشتهٔ جایگزین در جایگزینی الگوی دابلکوتیشندار، بر خلاف نسخههای پس از bash-4.2، تحت حذف نقلقول قرار نمیگیرد.
- در حالت posix، نقلقولهای تکی هنگام بسط بخش word در یک بسط پارامتر دابلکوتیشندار ویژه در نظر گرفته میشوند و میتوانند برای نقلقول کردن یک آکولاد بسته یا نویسهٔ ویژهٔ دیگر استفاده شوند (این بخشی از تفسیر شماره ۲۲۱ POSIX است)؛ در نسخههای جدیدتر، نقلقولهای تکی درون بسطهای کلمهٔ دابلکوتیشندار ویژه نیستند.
- compat43
- خطاهای بسط کلمه به عنوان خطاهای غیرمهلک در نظر گرفته میشوند که حتی در حالت posix نیز تنها باعث شکست دستور جاری میگردند (رفتار پیشفرض این است که آنها خطاهای مهلکی تلقی شوند که موجب خروج پوسته میشوند).
- هنگام اجرای یک تابع پوسته، وضعیت حلقه (while/until/غیره) بازنشانی نمیشود، بنابراین break یا continue در آن تابع، باعث شکستن یا ادامهیافتن حلقهها در محیط فراخواننده خواهد شد. Bash-4.4 و نسخههای بعدی وضعیت حلقه را بازنشانی میکنند تا از این اتفاق جلوگیری شود.
- compat44
- پوسته مقادیر مورد استفاده توسط BASH_ARGV و BASH_ARGC را طوری تنظیم میکند که حتی در صورت غیرفعال بودن حالت اشکالزدایی پیشرفته (extended debugging mode)، بتوانند به پارامترهای مکانی پوسته بسط یابند.
- یک زیرپوسته (subshell) حلقهها را از محیط والد خود به ارث میبرد، بنابراین break یا continue باعث خروج زیرپوسته خواهد شد. Bash-5.0 و نسخههای بعدی وضعیت حلقه را بازنشانی میکنند تا از این خروج جلوگیری شود.
- انتسابهای متغیر پیش از دستورات توکار مانند export و readonly که صفتها را تنظیم میکنند، حتی اگر پوسته در حالت posix نباشد، همچنان بر روی متغیرهای با نام یکسان در محیط فراخواننده تأثیر میگذارند.
- نسخه Bash-5.1 روش تولید $RANDOM را تغییر داد تا تصادفیبودنِ کمی بیشتری ایجاد کند. اگر سطح سازگاری پوسته روی 50 یا پایینتر تنظیم شده باشد، به روش bash-5.0 و نسخههای قبل بازمیگردد، بنابراین مقداردهی اولیه (seed) تولیدکننده اعداد تصادفی با انتساب یک مقدار به RANDOM همان دنبالهای را تولید خواهد کرد که در bash-5.0 تولید میشد.
- اگر جدول هش دستورات خالی باشد، نسخههای قبل از bash-5.1 پیامی اطلاعاتی مبنی بر این موضوع چاپ میکردند، حتی زمانی که خروجیای تولید میشد که میتوانست مجدداً به عنوان ورودی استفاده شود. Bash-5.1 هنگامی که گزینه -l ارائه شده باشد، آن پیام را سرکوب میکند.
- دستور توکار unset تلاشها برای حذف اندیسهای آرایه @ و * را بسته به این که آرایه اندیسی است یا انجمنی، متفاوت و متفاوت از نسخههای قبلی پردازش میکند.
- دستورات حسابی ( ((...)) ) و عبارات درون یک عبارت for حسابی میتوانند بیش از یک بار بسط یابند.
- عباراتی که به عنوان آرگومان برای عملگرهای حسابی در دستور شرطی [[ استفاده میشوند، میتوانند بیش از یک بار بسط یابند.
- عبارات موجود در بسط آکولادی پارامتر زیررشته (substring parameter brace expansion) میتوانند بیش از یک بار بسط یابند.
- عبارات موجود در بسط کلمه $((...)) میتوانند بیش از یک بار بسط یابند.
- عبارات حسابی که به عنوان اندیس آرایه اندیسی استفاده میشوند، میتوانند بیش از یک بار بسط یابند.
- دستور test -v، اگر آرگومان A[@] به آن داده شود که در آن A یک آرایه انجمنی موجود است، در صورتی که آرایه دارای هر عنصر مقداردهیشدهای باشد، مقدار درستی (true) برمیگرداند. Bash-5.2 به دنبال کلیدی با نام @ خواهد گشت و وضعیت آن را گزارش میدهد.
- بسط کلمه ${parameter[:]=value} مقدار value را پیش از اعمال هرگونه تبدیلات اختصاصی متغیر (مانند تبدیل به حروف کوچک) برمیگرداند. Bash-5.2 مقدار نهایی انتسابدادهشده به متغیر را بازمیگرداند.
- تجزیه جایگزینی دستور به گونهای عمل خواهد کرد که گویی انطباق الگوی گسترشیافته (extended globbing - توضیحات دستور توکار shopt در بالا را ببینید) فعال است، به طوری که تجزیه یک جایگزینی دستور حاوی الگوی extglob (برای مثال، به عنوان بخشی از یک تابع پوسته) با شکست مواجه نخواهد شد. این امر با فرض این است که هدف، فعالسازی extglob قبل از اجرای دستور و انجام بسط کلمات است. اگر extglob تا زمان اجرای دستور فعال نشده باشد، در زمان بسط کلمه با شکست مواجه خواهد شد.
- دستور توکار test هنگام دریافت پنج یا تعداد بیشتری آرگومان، از الگوریتم تاریخی خود برای تجزیه زیرعبارتهای درون پرانتز استفاده میکند.
- اگر گزینه -p یا -P به دستور توکار bind داده شود، bind با هرگونه آرگومان باقیمانده پس از پردازش گزینهها مانند نام دستورات قابل پیوند رفتار میکند و بهجای رفتار با آرگومانها به عنوان دنباله کلیدهایی برای مقیدسازی، هرگونه دنباله کلید پیوندیافته به آن دستورات را نمایش میدهد.
پوسته محدود (RESTRICTED SHELL)
اگر bash با نام rbash آغاز به کار کند، یا گزینه -r در هنگام فراخوانی داده شود، پوسته به صورت محدود درمیآید. یک پوسته محدود برای برپایی محیطی با کنترل بیشتر نسبت به پوسته استاندارد استفاده میشود. این پوسته رفتاری کاملاً یکسان با bash دارد، به استثنای اینکه موارد زیر غیرمجاز هستند یا انجام نمیشوند:
- تغییر دایرکتوری با استفاده از cd.
- تنظیم یا لغو تنظیم مقادیر SHELL، PATH، HISTFILE، ENV یا BASH_ENV.
- مشخص کردن نام دستورات حاوی /.
- مشخص کردن نام فایلی که شامل / است به عنوان آرگومان برای دستور توکار ..
- استفاده از گزینه -p برای دستور توکار . به جهت تعیین مسیر جستجو.
- مشخص کردن نام فایلی که شامل اسلش است به عنوان آرگومان برای دستور توکار history.
- مشخص کردن نام فایلی که شامل اسلش است به عنوان آرگومان برای گزینه -p دستور توکار hash.
- وارد کردن تعاریف توابع از محیط پوسته در زمان راهاندازی.
- تجزیه مقادیر BASHOPTS و SHELLOPTS از محیط پوسته در زمان راهاندازی.
- تغییر مسیر خروجی با استفاده از عملگرهای تغییر مسیر >، >|، <>، >&، &> و >>.
- استفاده از دستور توکار exec برای جایگزین کردن پوسته با دستوری دیگر.
- افزودن یا حذف دستورات توکار با گزینههای -f و -d دستور توکار enable.
- استفاده از دستور توکار enable برای فعال کردن دستورات توکار غیرفعالشده پوسته.
- مشخص کردن گزینه -p برای دستور توکار command.
- خاموش کردن حالت محدود با set +r یا shopt -u restricted_shell.
این محدودیتها پس از خوانده شدن تمام فایلهای راهاندازی اعمال میشوند.
هنگامی که دستوری اجرا میشود که مشخص شود یک اسکریپت پوسته است (بخش COMMAND EXECUTION در بالا را ببینید)، rbash تمام محدودیتها را در پوستهای که برای اجرای این اسکریپت ایجاد شده است، غیرفعال میکند.
همچنین ببینید (SEE ALSO)
- Bash Reference Manual, Brian Fox and Chet Ramey
- The Gnu Readline Library, Brian Fox and Chet Ramey
- The Gnu History Library, Brian Fox and Chet Ramey
- Portable Operating System Interface (POSIX) Part 2: Shell and Utilities, IEEE —
- http://pubs.opengroup.org/onlinepubs/9799919799
- http://tiswww.case.edu/~chet/bash/POSIX — شرحی درباره حالت posix
- sh(1), ksh(1), csh(1)
- emacs(1), vi(1)
- readline(3)
فایلها (FILES)
- /bin/bash
- فایل اجرایی bash
- /etc/profile
- فایل مقداردهی اولیه سراسری سیستم، که برای پوستههای ورود به سیستم (login shells) اجرا میشود
- ~/.bash_profile
- فایل مقداردهی اولیه شخصی، که برای پوستههای ورود به سیستم اجرا میشود
- ~/.bashrc
- فایل راهاندازی اختصاصی به ازای هر پوسته تعاملی
- ~/.bash_logout
- فایل پاکسازی اختصاصی پوسته ورود به سیستم، که هنگام خروج از پوسته ورود اجرا میشود
- ~/.bash_history
- مقدار پیشفرض برای HISTFILE؛ فایلی که bash تاریخچه دستورات را در آن ذخیره میکند
- ~/.inputrc
- فایل مقداردهی اولیه اختصاصی readline
نویسندگان (AUTHORS)
Brian Fox, Free Software Foundation
bfox@gnu.org
Chet Ramey, Case Western Reserve University
chet.ramey@case.edu
گزارش اشکالات (BUG REPORTS)
اگر اشکالی در bash پیدا کردید، باید آن را گزارش دهید. اما ابتدا، باید مطمئن شوید که آن مورد واقعاً یک اشکال است و در آخرین نسخه از bash وجود دارد. آخرین نسخه همیشه از طریق ftp://ftp.gnu.org/pub/gnu/bash و http://git.savannah.gnu.org/cgit/bash.git/snapshot/bash-master.tar.gz در دسترس است.
هنگامی که اطمینان یافتید که اشکال واقعاً وجود دارد، از دستور bashbug برای ارسال گزارش اشکال استفاده کنید. اگر برای آن راهحلی دارید، پیشنهاد میشود آن را نیز از طریق ایمیل ارسال کنید! میتوانید پیشنهادات و گزارشهای اشکال “فلسفی” را به bug-bash@gnu.org ارسال نمایید یا آنها را در گروه خبری یوزنت gnu.bash.bug پست کنید.
تمامی گزارشهای اشکال باید شامل موارد زیر باشند:
- شماره نسخه bash
- سختافزار و سیستمعامل
- کامپایلر مورد استفاده برای ساخت و کامپایل
- شرح رفتار اشکال (bug)
- یک اسکریپت کوتاه یا “دستورالعمل” که اشکال را بازتولید کرده و به نمایش بگذارد
ابزار bashbug سه مورد اول را به طور خودکار در قالبی که برای ثبت گزارش اشکال ارائه میدهد، درج میکند.
نظرات و گزارشهای مربوط به اشکالات این صفحه راهنما باید به نشانی زیر ارسال شوند: chet.ramey@case.edu.
اشکالات شناختهشده (BUGS)
بسیار بزرگ و بسیار کند است.
تفاوتهای ظریفی میان bash و نسخههای سنتی sh وجود دارد، که عمدتاً به دلیل الزامات مشخصات POSIX است.
نامهای مستعار (aliasها) در برخی کاربردها گیجکننده هستند.
دستورات توکار پوسته و توابع قابلیت متوقف شدن یا راهاندازی مجدد (stoppable/restartable) ندارند.
دستورات مرکب و فهرستهای دستوری به شکل “a ; b ; c” هنگامی که با تعلیق فرایند ترکیب میشوند، به درستی و ظرافت مدیریت نمیشوند. هنگامی که فرایندی متوقف میشود، پوسته بیدرنگ دستور بعدی در فهرست را اجرا میکند یا از هرگونه حلقه فعلی خارج میشود. برای حل این مورد کافی است دستور را در پرانتز قرار دهید تا اجرای آن به یک زیرپوسته (subshell) تحمیل شود که میتواند به عنوان یک واحد متوقف گردد، یا اینکه دستور را در پسزمینه آغاز کرده و بلافاصله آن را به پیشزمینه بیاورید.
متغیرهای آرایهای ممکن است (هنوز) قابلیت برونریزی (export) نداشته باشند.
| 2025 April 7 | GNU Bash 5.3 |