19 KiB
title | description | published | date | tags | editor | dateCreated |
---|---|---|---|---|---|---|
پوسته Bash | true | 2025-01-05T16:27:50.157Z | bash | markdown | 2025-01-05T13:37:50.828Z |
پوسته Bash
Bash (پوستهٔ بورن-دوباره) یک پوستهٔ خط فرمان/زبان برنامهنویسی است که توسط پروژهٔ گنو توسعه یافته است. نام آن به پیشینی خود، پوستهٔ بورن که مدتهاست منسوخ شده، اشاره دارد. Bash میتواند بر روی اکثر سیستمعاملهای شبیه یونیکس، از جمله گنو/لینوکس، اجرا شود.
در توزیع پارچ، پوستهٔ bash به عنوان پوستهٔ پیشفرض استفاده میشود. {.is-info}
فراخوانی
رفتار 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. {.is-info}
پروندهٔهای پیکربندی
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 را بارگذاری نمیکنند، اما همچنان محیط را از فرآیند والد خود (که ممکن است یک پوستهٔ ورود باشد) به ارث میبرند. {.is-info}
پوسته و متغیرهای محیطی
رفتار Bash و برنامههایی که توسط آن اجرا میشوند، میتواند تحت تأثیر تعدادی از متغیرهای محیطی قرار گیرد. متغیرهای محیطی برای ذخیرهٔ مقادیر مفید مانند دایرکتوریهای جستجوی فرمان یا مرورگری که باید استفاده شود، به کار میروند. زمانی که یک پوسته یا اسکریپت جدید راهاندازی میشود، متغیرهای والد خود را به ارث میبرد و بنابراین با یک مجموعه داخلی از متغیرهای پوسته شروع میکند.
این متغیرهای پوسته در Bash میتوانند صادر شوند تا به متغیرهای محیطی تبدیل شوند:
VARIABLE=content
export VARIABLE
یا با یک میانبر:
export VARIABLE=content
متغیرهای محیطی به طور معمول در ~/.profile
یا /etc/profile
قرار میگیرند تا سایر پوستههای سازگار با بورن نیز بتوانند از آنها استفاده کنند.
خط فرمان
خط فرمان Bash توسط کتابخانهای جداگانه به نام Readline مدیریت میشود. Readline سبکهای میانبر emacs و vi را برای تعامل با خط فرمان فراهم میکند، به عبارت دیگر، امکان حرکت به جلو و عقب بر اساس کلمات، حذف کلمات و غیره را فراهم میآورد. همچنین، مدیریت تاریخچهٔ دستورات ورودی نیز بر عهدهٔ Readline است. در نهایت، این کتابخانه به شما اجازه میدهد تا ماکروها را ایجاد کنید.
تکمیلخودکار با کلید tab
تکمیل خودکار با کلید 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 تداخل ایجاد کند.
{.is-info}
به طور پیشفرض، 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"
شبیهسازی قابلیت run-help Zsh
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 (که به طور پیشفرض است) هستید.
به اشتراکگذاری تاریخچه Bash در بین ماشینها
Atuin تاریخچهٔ شل موجود شما را با یک پایگاه داده SQLite جایگزین میکند و زمینههای اضافی برای دستورات شما را ثبت میکند. علاوه بر این، امکان همگامسازی اختیاری و کاملاً رمزگذاری شدهٔ تاریخچهٔ شما بین ماشینها را از طریق یک سرور Atuin فراهم میکند.
قبل از همگامسازی، زمانبندی تاریخچهٔ Bash را فعال کنید (با استفاده از دستور export HISTTIMEFORMAT="%F %T "
). Atuin به خوبی با ابزارهایی مانند blesh-gitAUR و cmd-wrapped کار میکند تا تجربهٔ پایانه بهتری را در بین ماشینها فراهم کند.
نام مستعار (Aliases)
alias
یک دستور است که امکان جایگزینی یک کلمه با یک رشتهٔ دیگر را فراهم میکند. این دستور معمولاً برای کوتاه کردن یک دستور سیستم یا افزودن آرگومانهای پیشفرض به یک دستور که به طور منظم استفاده میشود، به کار میرود.
نامهای مستعار شخصی میتوانند در فایل ~/.bashrc
یا هر فایل جداگانهای که از ~/.bashrc
بارگذاری میشود، ذخیره شوند. نامهای مستعار سراسری (که بر تمام کاربران تأثیر میگذارند) باید در فایل /etc/bash.bashrc
قرار گیرند.
نکات و ترفندها
هایلایت سینتکس و پیشنهادات خودکار
ble.sh
(ویرایشگر خط Bash)، که به عنوان ^AUR^blesh-git
بستهبندی شده است، یک ویرایشگر خط فرمان نوشته شده به زبان Bash خالص است که جایگزینی برای GNU Readline به شمار میرود. این ابزار دارای ویژگیهای پیشرفتهای مانند هایلایت سینتکس، پیشنهادات خودکار، تکمیل منویی، اختصارات، حالت ویرایش Vim و توابع hook است. سایر ویژگیهای جالب شامل خط وضعیت، اشتراک تاریخچه، پرامپت راست، پرامپت موقتی و عنوان xterm میباشد.
پس از نصب آن، در یک جلسه تعاملی بارگذاری کنید:
~/.bashrc
source /usr/share/blesh/ble.sh
تنظیمات به طور عمیق در فایل ~/.blerc
و در ویکی توضیح داده شده است. بستهٔ پایدار ^AUR^blesh
نیز در دسترس است.
دستور پیدا نشد
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 قبل از کارکرد این ویژگی بهروزرسانی شود. {.is-warning}
غیرفعال کردن Ctrl+z در ترمینال
شما میتوانید ویژگی Ctrl+z (که برنامه شما را متوقف یا میبندد) را با استفاده از کد زیر غیرفعال کنید:
#!/bin/bash
trap "" 20
adom
اکنون، وقتی به طور تصادفی Ctrl+z را در adom
^AUR^ فشار میدهید به جای Shift+z، هیچ اتفاقی نخواهد افتاد زیرا Ctrl+z نادیده گرفته میشود.
پاک کردن صفحه پس از خروج
برای پاک کردن صفحه پس از خروج از یک ترمینال مجازی:
~/.bash_logout
clear
reset
"cd" خودکار هنگام وارد کردن فقط یک مسیر
Bash میتواند به طور خودکار cd
را هنگام وارد کردن فقط یک مسیر در شل اضافه کند. به عنوان مثال:
$ /etc
bash: /etc: Is a directory
اما پس از افزودن یک خط به فایل .bashrc
:
~/.bashrc
...
shopt -s autocd
...
شما به این صورت خواهید داشت:
[user@host ~]$ /etc
cd /etc
[user@host etc]$
Autojump
autojump-git
^AUR^ یک اسکریپت پایتون است که به شما اجازه میدهد با جستجوی رشتهها در یک پایگاه داده از مسیرهای پر بازدید کاربر، در سیستم فایل ناوبری کنید.
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 مراجعه کنید.