Bash (پوستهٔ بورن-دوباره) یک پوستهٔ خط فرمان/زبان برنامهنویسی است که توسط پروژهٔ گنو توسعه یافته است. نام آن به پیشینی خود، پوستهٔ بورن که مدتهاست منسوخ شده، اشاره دارد. Bash میتواند بر روی اکثر سیستمعاملهای شبیه یونیکس، از جمله گنو/لینوکس، اجرا شود.
در توزیع پارچ، پوستهٔ bash به عنوان پوستهٔ پیشفرض استفاده میشود.
رفتار Bash میتواند بسته به نحوهٔ فراخوانی آن تغییر کند. در زیر توضیحاتی دربارهٔ حالتهای مختلف آمده است.
اگر Bash از طریق ورود به یک TTY، توسط یک دیمون SSH یا روشهای مشابه راهاندازی شود، به آن پوستهٔ ورود (login shell) گفته میشود. این حالت همچنین میتواند با استفاده از گزینهٔ خط فرمان -l یا --login فعال شود.
Bash زمانی که ورودی، خروجی و خطای استاندارد آن به یک ترمینال متصل باشد (برای مثال، زمانی که در یک شبیهساز ترمینال اجرا میشود) و با گزینهٔ -c یا آرگومانهای غیرگزینهای (برای مثال، bash script) شروع نشود، به عنوان یک پوستهٔ تعاملی (interactive shell) در نظر گرفته میشود. تمام پوستههای تعاملی فایلهای /etc/bash ، .bashrc و ~/.bashrc را بارگذاری میکنند، در حالی که پوستههای تعاملی ورود همچنین فایلهای /etc/profile و ~/.bash_profile را نیز بارگذاری میکنند.
توجه: در پارچ، /bin/sh (که قبلاً به عنوان اجرایی شل بورن استفاده میشد) به bash لینک نمادین شده است. اگر Bash با نام sh فراخوانی شود، سعی میکند رفتار راهاندازی نسخههای تاریخی sh را تقلید کند، از جمله سازگاری با POSIX.
Bash سعی خواهد کرد مجموعهای از فایلهای راهاندازی را بسته به نحوهٔ فراخوانی آن اجرا کند.
| پرونده | توضیحات | پوستههای ورود (به یاد داشته باشید) | پوستههای تعاملی غیر ورود |
|---|---|---|---|
| /etc/profile | تنظیمات برنامهها را در /etc/profile.d/*.sh و /etc/bash.bashrc بارگذاری میکند. | بله | خیر |
| ~/.bash_profile | برای هر کاربر، پس از /etc/profile. اگر این فایل وجود نداشته باشد، به ترتیب ~/.bash_login و ~/.profile بررسی میشوند. فایل الگو /etc/skel/.bash_profile همچنین ~/.bashrc را بارگذاری میکند. | بله | خیر |
| ~/.bash_logout | برای هر کاربر، پس از خروج از یک پوستهٔ ورود. | بله | خیر |
| /etc/bash.bash_logout | بستگی به پرچم کامپایل -DSYS_BASH_LOGOUT=“/etc/bash.bash_logout” دارد. پس از خروج از یک پوستهٔ ورود. | بله | خیر |
| /etc/bash.bashrc | بستگی به پرچم کامپایل -DSYS_BASHRC=“/etc/bash.bashrc” دارد. /usr/share/bash-completion/bash_completion را بارگذاری میکند. | خیر | بله |
| ~/.bashrc | برای هر کاربر، پس از /etc/bash یا .bashrc. | خیر | بله |
توجه:
پوستههای ورود میتوانند زمانی که با آرگومان --login فراخوانی شوند، غیرتعاملپذیر (non-interactive) باشند. در حالی که پوستههای تعاملی غیر ورود، فایل ~/.bash_profile را بارگذاری نمیکنند، اما همچنان محیط را از فرآیند والد خود (که ممکن است یک پوستهٔ ورود باشد) به ارث میبرند.
رفتار Bash و برنامههایی که توسط آن اجرا میشوند، میتواند تحت تأثیر تعدادی از متغیرهای محیطی قرار گیرد. متغیرهای محیطی برای ذخیرهٔ مقادیر مفید مانند دایرکتوریهای جستجوی فرمان یا مرورگری که باید استفاده شود، به کار میروند. زمانی که یک پوسته یا اسکریپت جدید راهاندازی میشود، متغیرهای والد خود را به ارث میبرد و بنابراین با یک مجموعه داخلی از متغیرهای پوسته شروع میکند.
این متغیرهای پوسته در Bash میتوانند صادر شوند تا به متغیرهای محیطی تبدیل شوند:
VARIABLE=content
export VARIABLE
یا با یک میانبر:
export VARIABLE=content
متغیرهای محیطی به طور معمول در ~/.profile یا /etc/profile قرار میگیرند تا سایر پوستههای سازگار با بورن نیز بتوانند از آنها استفاده کنند.
خط فرمان Bash توسط کتابخانهای جداگانه به نام Readline مدیریت میشود. Readline سبکهای میانبر emacs و vi را برای تعامل با خط فرمان فراهم میکند، به عبارت دیگر، امکان حرکت به جلو و عقب بر اساس کلمات، حذف کلمات و غیره را فراهم میآورد. همچنین، مدیریت تاریخچهٔ دستورات ورودی نیز بر عهدهٔ Readline است. در نهایت، این کتابخانه به شما اجازه میدهد تا ماکروها را ایجاد کنید.
تکمیل خودکار با کلید Tab گزینهای است برای تکمیل خودکار دستورات تایپ شده با فشار دادن کلید Tab (که به طور پیشفرض فعال است).
به طور پیشفرض، Bash فقط دستورات، نام فایلها و متغیرها را با استفاده از کلید Tab تکمیل میکند. بستهٔ bash-completion این قابلیت را گسترش میدهد و تکمیلهای خودکار تخصصیتری را برای دستورات رایج و گزینههای آنها اضافه میکند، که میتوان با بارگذاری فایل /usr/share/bash-completion/bash_completion(که قبلاً در /etc/bash یا .bashrc پارچ بارگذاری شده است) آن را فعال کرد. با استفاده از bash-completion، تکمیلهای معمولی (مانند ls file.* Tab Tab) رفتار متفاوتی خواهند داشت؛ با این حال، میتوان آنها را با استفاده از دستور compopt -o bashdefault program دوباره فعال کرد .
توجه: استفاده از دستور
completeممکن است با bash-completion تداخل ایجاد کند.
به طور پیشفرض، Bash فقط نام فایلها را پس از یک دستور با استفاده از کلید Tab تکمیل میکند.
میتوانید آن را تغییر دهید تا نام دستورات را نیز با استفاده از complete -c تکمیل کند:
~/.bashrc
-----
complete -c man which
یا میتوانید نام دستورات و نام فایلها را با استفاده از گزینه -cf تکمیل کنید:
complete -cf sudo
برای گزینههای بیشتر در مورد تکمیل، به بخش “§ Programmable Completion” در مستندات bash(1) مراجعه کنید.
شما میتونید با بایند کردن کلیدهای جهت بالا و پایین در تاریخچه پوستهٔ بش جابهجا بشید:
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
برای تحت تأثیر قراردادن همه برنامههای readline:
در فایل .inputrc:
"\e[A": history-search-backward
"\e[B": history-search-forward
مقدار HISTCONTROL میتواند باعث شود تا یک سری دستور خاص در تاریخچه ثبت نشوند. برای مثال
برای متوقف کردن ثبت دستورهای متوالی مشابه:
~/.bashrc
------
export HISTCONTROL=ignoredups
برای حذف تمام دستورات مشابه به جز آخرین دستور:
~/.bashrc
------
export HISTCONTROL=erasedups
برای جلوگیری از ذخیرهٔ دستورات که با یک فاصله شروع میشوند:
~/.bashrc
------
export HISTCONTROL=ignorespace
برای جلوگیری از ذخیرهٔ دستورات مشابه متوالی و دستورات که با یک فاصله شروع میشوند:
~/.bashrc
------
export HISTCONTROL=ignoreboth
برای حذف تمام دستورات مشابه به جز آخرین دستور و دستورات که با یک فاصله شروع میشوند:
~/.bashrc
------
export HISTCONTROL="erasedups:ignorespace"
به bash(1) § HISTCONTROL برای جزئیات بیشتر مراجعه کنید.
برای غیرفعال کردن تاریخچه به صورت موقت از دستور زیر استفاده کنید:
set +o history
این دستور به صورت موقت نوشتن تاریخچه را در پروندهٔ $HISTFILE متوقف میکند.
به عنوان مثال، اکنون میتوانید پسوردها را با استفاده از دستور printf secret | sha256sum هش کنید، یا استفاده از GPG را با دستور gpg -eaF secret-pubkey.asc پنهان کنید و در این صورت رمز شما بر روی دیسک نوشته نخواهد شد.
برای فعالسازی تاریخچه:
$ set -o history
برای غیرفعال کردن تمام تاریخچهٔ Bash:
در پروندهٔ ~/.bashrc یا /etc/profile:
export HISTSIZE=0
… و فقط برای اطمینان، پروندهٔ تاریخچهٔ قدیمی خود را برای همیشه نابود کنید:
wipe -i -l2 -x4 -p4 "$HISTFILE"
ln -sv /dev/null "$HISTFILE"
Zsh میتواند با فشار دادن Alt+h، راهنمای مربوط به دستوری که قبل از نشانگر (کرسر) قرار دارد را فراخوانی کند. رفتار مشابهی در Bash با استفاده از این دستور Readline به دست میآید:
در پروندهٔ ~/.bashrc:
run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; }
bind -m vi-insert -x '"\eh": run-help'
bind -m emacs -x '"\eh": run-help'
فرض میشود که شما قادر به استفاده از حالت ویرایش Emacs (که به طور پیشفرض است) هستید.
Atuin تاریخچهٔ شل موجود شما را با یک پایگاه داده SQLite جایگزین میکند و زمینههای اضافی برای دستورات شما را ثبت میکند. علاوه بر این، امکان همگامسازی اختیاری و کاملاً رمزگذاری شدهٔ تاریخچهٔ شما بین ماشینها را از طریق یک سرور Atuin فراهم میکند.
قبل از همگامسازی، زمانبندی تاریخچهٔ Bash را فعال کنید (با استفاده از دستور export HISTTIMEFORMAT="%F %T "). Atuin به خوبی با ابزارهایی مانند blesh-gitAUR و cmd-wrapped کار میکند تا تجربهٔ پایانه بهتری را در بین ماشینها فراهم کند.
alias یک دستور است که امکان جایگزینی یک کلمه با یک رشتهٔ دیگر را فراهم میکند. این دستور معمولاً برای کوتاه کردن یک دستور سیستم یا افزودن آرگومانهای پیشفرض به یک دستور که به طور منظم استفاده میشود، به کار میرود.
نامهای مستعار شخصی میتوانند در فایل ~/.bashrc یا هر فایل جداگانهای که از ~/.bashrc بارگذاری میشود، ذخیره شوند. نامهای مستعار سراسری (که بر تمام کاربران تأثیر میگذارند) باید در فایل /etc/bash.bashrc قرار گیرند.
ble.sh (ویرایشگر خط Bash)، که به عنوان AURblesh-git بستهبندی شده است، یک ویرایشگر خط فرمان نوشته شده به زبان Bash خالص است که جایگزینی برای GNU Readline به شمار میرود. این ابزار دارای ویژگیهای پیشرفتهای مانند هایلایت سینتکس، پیشنهادات خودکار، تکمیل منویی، اختصارات، حالت ویرایش Vim و توابع hook است. سایر ویژگیهای جالب شامل خط وضعیت، اشتراک تاریخچه، پرامپت راست، پرامپت موقتی و عنوان xterm میباشد.
پس از نصب آن، در یک جلسه تعاملی بارگذاری کنید:
~/.bashrc
source /usr/share/blesh/ble.sh
تنظیمات به طور عمیق در فایل ~/.blerc و در ویکی توضیح داده شده است. بستهٔ پایدار AURblesh نیز در دسترس است.
pkgfile شامل یک hook “دستور پیدا نشد” است که به طور خودکار در هنگام وارد کردن یک دستور ناشناخته، به جستجوی مخازن رسمی میپردازد.
برای فعالسازی این hook، باید آن را بارگذاری کنید، به عنوان مثال:
~/.bashrc
source /usr/share/doc/pkgfile/command-not-found.bash
سپس تلاش برای اجرای یک دستور غیرقابل دسترسی، اطلاعات زیر را نمایش میدهد:
$ abiword
abiword may be found in the following packages:
extra/abiword 3.0.1-2 /usr/bin/abiword
توجه: ممکن است نیاز باشد که پایگاه داده pkgfile قبل از کارکرد این ویژگی بهروزرسانی شود.
غیرفعال کردن Ctrl+z در ترمینال
شما میتوانید ویژگی Ctrl+z (که برنامه شما را متوقف یا میبندد) را با استفاده از کد زیر غیرفعال کنید:
#!/bin/bash
trap "" 20
adom
اکنون، وقتی به طور تصادفی Ctrl+z را در adomAUR فشار میدهید به جای Shift+z، هیچ اتفاقی نخواهد افتاد زیرا Ctrl+z نادیده گرفته میشود.
برای پاک کردن صفحه پس از خروج از یک ترمینال مجازی:
~/.bash_logout
clear
reset
Bash میتواند به طور خودکار cd را هنگام وارد کردن فقط یک مسیر در شل اضافه کند. به عنوان مثال:
$ /etc
bash: /etc: Is a directory
اما پس از افزودن یک خط به فایل .bashrc:
~/.bashrc
...
shopt -s autocd
...
شما به این صورت خواهید داشت:
[user@host ~]$ /etc
cd /etc
[user@host etc]$
autojump-gitAUR یک اسکریپت پایتون است که به شما اجازه میدهد با جستجوی رشتهها در یک پایگاه داده از مسیرهای پر بازدید کاربر، در سیستم فایل ناوبری کنید.
zoxide یک جایگزین است که ویژگیها و بهبودهای عملکردی بیشتری نسبت به autojump اصلی دارد و میتواند به عنوان یک جایگزین مستقیم برای autojump عمل کند.
برای جلسهٔ جاری، برای جلوگیری از بازنویسی فایلهای عادی موجود توسط هدایت خروجی شل:
$ set -o noclobber
این معادل set -C است.
برای پایدار کردن تغییرات برای کاربر خود:
~/.bashrc
...
set -o noclobber
برای بازنویسی دستی یک فایل در حالی که noclobber فعال است:
$ echo "output" >| file.txt
دستورات pushd و popd میتوانند برای اضافه کردن یا حذف دایرکتوریها به یک پشته در حین جابجایی به آنها استفاده شوند. این میتواند برای “پخش مجدد” تاریخچهٔ ناوبری شما مفید باشد.
[user@host ~] pushd /tmp/dir1
[user@host /tmp/dir1] pushd /var/lib
[user@host /var/lib] popd
[user@host /tmp/dir1] popd
[user@host ~]
برای اطلاعات بیشتر به bash(1) § DIRSTACK مراجعه کنید.