پرامپت (Prompt) همان رشته متنی است که قبل از ورود دستورات در خط فرمان نمایش داده میشود. شخصیسازی آن نهتنها ظاهر ترمینال را حرفهایتر میکند، بلکه با نمایش اطلاعات مفید (مانند مسیر جاری، وضعیت گیت، یا زمان) بهرهوری شما را به شکل چشمگیری افزایش میدهد. در این درس، با متغیر اصلی PS1، متغیرهای جانبی و کدهای کنترلی برای ساخت یک پرامپت قدرتمند آشنا میشوید.
متغیر PS1 (Primary Prompt String)
PS1 اصلیترین متغیر محیطی برای کنترل ظاهر پرامپت است. این متغیر تعیین میکند که شل چه متنی را هنگام انتظار برای ورودی کاربر نمایش دهد.
مشاهده مقدار فعلی:
echo $PS1
خروجی نمونه (پیشفرض در بسیاری از توزیعها):
\u@\h:\w\$
تغییر ساده (موقت):
PS1="my_prompt> "
با این کار، پرامپت شما به my_prompt> تغییر میکند. اما برای استفاده از قابلیتهای پیشرفته، باید از متغیرهای ویژه (Escape Sequences) استفاده کنید.
متغیرهای ویژه پرامپت (Prompt Variables)
Bash از مجموعهای از بکاسلشها (\) برای نمایش اطلاعات پویا در پرامپت پشتیبانی میکند. در ادامه مهمترین آنها را بههمراه مثال خروجی بررسی میکنیم.
| متغیر | توضیح | مثال خروجی |
|---|---|---|
\u | نام کاربری جاری | alireza |
\h | نام هاست (تا اولین نقطه) | my-laptop |
\H | نام کامل هاست | my-laptop.local |
\w | مسیر کامل دایرکتوری جاری (با جایگزینی ~ برای خانه) | ~/projects/bash |
\W | فقط نام آخرین دایرکتوری جاری | bash |
\d | تاریخ به فرمت Day Mon Date | Fri Aug 28 |
\t | زمان (۲۴ ساعته) با دقت ثانیه | 14:30:45 |
\T | زمان (۱۲ ساعته) | 02:30:45 |
\@ | زمان (۱۲ ساعته با AM/PM) | 02:30 PM |
\$ | اگر کاربر root باشد # وگرنه $ نمایش داده میشود | $ یا # |
\n | رفتن به خط جدید (Newline) | - |
\r | رفتن به ابتدای خط (Carriage Return) | - |
\! | شماره تاریخچه دستورات | 42 |
\# | شماره فرمان در شل جاری | 3 |
\\ | نمایش یک بکاسلش (\) | \ |
شخصیسازی با رنگ (Colorization)
برای افزودن رنگ به پرامپت، از کدهای ANSI Escape استفاده میشود. ساختار کلی به این صورت است:
\e[<کد رنگ>m
-
\eیا\033: کاراکتر Escape. -
[: شروع کد. -
<کد رنگ>: عدد مربوط به رنگ یا سبک. -
m: پایان کد.
نکته حیاتی: برای جلوگیری از محاسبه اشتباه طول خط توسط Bash (که باعث میشود متن هنگام اسکرول در ترمینال بههم بریزد)، حتماً کدهای غیرچاپی (رنگها) را بین
\[و\]قرار دهید.
جدول کدهای رنگهای اصلی
| رنگ | کد متن (Foreground) | کد پسزمینه (Background) |
|---|---|---|
| سیاه (Black) | 30 | 40 |
| قرمز (Red) | 31 | 41 |
| سبز (Green) | 32 | 42 |
| زرد (Yellow) | 33 | 43 |
| آبی (Blue) | 34 | 44 |
| بنفش (Magenta) | 35 | 45 |
| فیروزهای (Cyan) | 36 | 46 |
| سفید (White) | 37 | 47 |
کدهای سبک (Style):
-
0: عادی (Reset) -
1: پررنگ (Bold) -
4: زیرخط (Underline) -
5: چشمکزن (Blink - معمولاً پشتیبانی نمیشود)
مثال عملی با رنگ
فرض کنید میخواهیم نام کاربری را به رنگ سبز پررنگ، نام هاست را به آبی و مسیر را به زرد نمایش دهیم:
PS1="\[\e[1;32m\]\u\[\e[0m\]@\[\e[1;34m\]\h\[\e[0m\]:\[\e[1;33m\]\w\[\e[0m\]\$ "
-
\[\e[1;32m\]: شروع رنگ سبز پررنگ. -
\u: نام کاربری. -
\[\e[0m\]: ریست کردن رنگ به حالت عادی (برای جلوگیری از رنگآمیزی کل متن).
پرامپت پویا با PROMPT_COMMAND
اگر نیاز به نمایش اطلاعاتی دارید که نیاز به اجرای یک دستور دارند (مثلاً وضعیت گیت، یا تعداد فایلهای پوشه جاری)، از متغیر PROMPT_COMMAND استفاده کنید. این متغیر، دستوری را که قبل از نمایش هر پرامپت اجرا میشود، مشخص میکند.
مثال: نمایش زمان اجرای آخرین دستور
function set_prompt() { local exit_code=$? if [ $exit_code -eq 0 ]; then STATUS="\[\e[32m\]✔" else STATUS="\[\e[31m\]✘ $exit_code" fi PS1="${STATUS} \[\e[1;34m\]\w\[\e[0m\]\\$ " } PROMPT_COMMAND=set_prompt
در این مثال، اگر آخرین دستور با موفقیت اجرا شود، یک تیک سبز (✔) و در غیر این صورت یک ضربدر قرمز (✘) بههمراه کد خطا نمایش داده میشود.
مثال پیشرفته: نمایش شاخه گیت (بدون نیاز به نصب پلاگین)
parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' } export PS1="\u@\h \[\e[32m\]\w\[\e[33m\]\$(parse_git_branch)\[\e[0m\]\\$ "
در این حالت، اگر در یک مخزن گیت باشید، نام شاخه فعلی بهصورت (main) در کنار مسیر نمایش داده میشود.
متغیرهای دیگر پرامپت (PS2, PS3, PS4)
Bash از چندین متغیر پرامپت پشتیبانی میکند که هرکدام در شرایط خاصی نمایش داده میشوند:
| متغیر | نام | زمان نمایش |
|---|---|---|
PS1 | Primary Prompt | پرامپت اصلی برای ورود دستورات |
PS2 | Secondary Prompt | زمانی که دستور در چند خط ادامه دارد (معمولاً >) |
PS3 | Select Prompt | در حلقه select برای منوها |
PS4 | Debug Prompt | در حالت set -x برای دیباگ (معمولاً +) |
تغییر PS2 برای خوانایی بیشتر:
PS2="... "
اکنون اگر یک دستور را با \ به خط بعد ببرید، پرامپت به ... تغییر میکند تا نشان دهد ورودی ادامه دارد.
ماندگار کردن پرامپت سفارشی (Persistent)
برای اینکه پرامپت زیبای خود را پس از بستن ترمینال از دست ندهید، تعاریف را به فایل ~/.bashrc اضافه کنید.
مراحل استاندارد:
-
فایل
~/.bashrcرا با یک ویرایشگر باز کنید:vim ~/.bashrc -
محتوای زیر را در انتهای فایل اضافه کنید (ترکیب تمام نکات):
# پرامپت حرفهای با رنگ، تاریخچه و وضعیت گیت parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } # تنظیم رنگها (برای سهولت استفاده) RESET="\[\e[0m\]" RED="\[\e[1;31m\]" GREEN="\[\e[1;32m\]" YELLOW="\[\e[1;33m\]" BLUE="\[\e[1;34m\]" export PS1="${GREEN}\u${RESET}@${BLUE}\h${RESET}:${YELLOW}\w${RESET}\$(parse_git_branch)${RESET}\\$ "
-
ذخیره و اعمال:
source ~/.bashrc
اشتباهات رایج و رفع آنها
-
بههمریختگی خطوط هنگام اسکرول: اگر از رنگ استفاده میکنید و از
\[و\]استفاده نمیکنید، Bash طول پرامپت را اشتباه محاسبه کرده و هنگام ویرایش خطوط طولانی، متن دچار اختلال میشود. راه حل: همیشه کدهای ANSI را درون\[...\]قرار دهید. -
نمایش
\uبهجای نام کاربری: اگر از نقل قول تکی (Single Quote) استفاده کردهاید (')، Bash متغیرها را تفسیر نمیکند. برای مشاهده اثر متغیرهای\، از نقل قول دوگانه (Double Quote)"استفاده کنید:# این کار نمیکند (تکگیومه) PS1='\u@\h$ ' # این کار میکند (دوگیومه) PS1="\u@\h\$ "
-
پرامپت خیلی طولانی است: نمایش مسیر کامل (
\w) در دایرکتوریهای عمیق میتواند خط فرمان را شلوغ کند. پیشنهاد میکنم از\W(فقط نام آخرین پوشه) استفاده کنید یا با ابزارهایی مثلsedمسیر را کوتاهتر کنید.
نکته نهایی: شخصیسازی پرامپت یک فرایند کاملاً سلیقهای و تستوخطا است. پیشنهاد میکنم تغییرات را ابتدا در خط فرمان (موقت) تست کنید و پس از اطمینان، آن را به
~/.bashrcاضافه کنید. همچنین میتوانید از وبسایتهایی مانند bashrcgenerator.com برای ساخت سریع پرامپتهای زیبا و تست کدهای ANSI استفاده کنید.