คำสั่ง Bash prompt execute ทุกครั้งที่มีพรอมต์ใหม่ปรากฏขึ้น


11

ฉันมีพรอมต์ต่อไปนี้ในทุบตีซึ่งแสดงสาขา git ปัจจุบัน:

PS1+="$(git_prompt)" #git_prompt is a function in my .bashrc

ซึ่งทำงานเมื่อฉันจัดหา. bashrc แต่ไม่ใช่เมื่อฉันเปลี่ยนสาขาดังนั้น PS1 var จะได้รับการประเมินเฉพาะเมื่อฉันจัดหาที่. bashrc แต่ควรได้รับการประเมินทุกครั้งที่มีการแสดงพรอมต์ใหม่ สิ่งนี้สามารถทำได้ด้วย bash 4.3?

คำตอบ:


14

ปัญหาของคุณคือการที่$(git_prompt)ได้รับการประเมินเพื่อสตริงคงที่บางส่วนก่อนที่$PS1มันจะถูกเพิ่ม คุณต้องเพิ่มรหัสแทน:

PS1+='$(git_prompt)'

2
สิ่งนี้จะทำให้เกิดข้อผิดพลาดbash: command substitution: line 1: syntax error near unexpected token ) 'bash: การทดแทนคำสั่ง: บรรทัดที่ 1:git_prompt)'
danielr1996

1
นั่นแปลกจริงๆ สร้าง "backup" ( oldPS1="$PS1") จากนั้นลอง:PS1='$(git_prompt) '
Hauke ​​Laging

9

ฉันแก้ไขตอนนี้โดยใช้สิ่งนี้เป็นพรอมต์

PS1="$green\u $r@ $red\h $r: $yellow\W \!$r \$(git_prompt) \n$yellow\$ $r"

ก่อนที่ฉันจะต่อหลายสายเข้ากับหนึ่งสาย PS1 ดูเหมือนจะมีปัญหา เคล็ดลับคือการเขียน\ก่อน excuting $(git_prompt)คำสั่งด้วย

ดังนั้น$(git_prompt)จะได้รับการประเมินเมื่อ.bashrcมีการประเมินและ

\$(git_prompt) จะได้รับการประเมินทุกครั้งที่มีข้อความแจ้งใหม่ปรากฏขึ้น


5
สำหรับทุกคนที่พบสิ่งนี้ในอนาคต: โปรดสังเกตเครื่องหมายคำพูดคู่ล้อม"รอบสตริง การใช้ที่\$(git_prompt)ไม่มีสิ่งเหล่านี้จะไม่ทำงาน
dthor

1

ลองอ้างเดี่ยวใน ps1 ของคุณ

PS1+='$(git_prompt)'

ฉันยังแนะนำฟังก์ชันpsOneของฉัน

psOne () 
{ 
    ps1tm=${1:-01};
    ps1tc=(30 31 32 33 34 35 36 37 38);
    PS1='${debian_chroot:+($debian_chroot)}\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]\u\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]@\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\]\h\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] :\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] \w\[\033[${ps1tm};${ps1tc[$((RANDOM%${#ps1tc[@]}))]}m\] \$ '
}

ป้อนคำอธิบายรูปภาพที่นี่


มันดูน่าสนใจคุณช่วยอธิบายว่า ps1tm มีไว้เพื่ออะไร
danielr1996

@ danielr1996 เป็นโหมดข้อความ (ตัวหนาตัวหนากะพริบขีดเส้นใต้ {0..5}, ในฟังก์ชั่นนี้มันถูกตั้งค่าเป็น 01 ถ้าไม่มีข้อโต้แย้ง
โจนาห์

0

ต้องการที่จะเห็นความบ้าคลั่ง? นี่คือวิธีที่ฉันสร้าง bash prompt:

# inspiration: http://www.stumbleupon.com/su/2LpQMi 
user_host_path="${debian_chroot:+($debian_chroot) }"'\u@\h:\w'
xterm_title='\[\e]0;'"$user_host_path"'\a\]'
[[ $TERM == xterm* || $TERM == rxvt* ]] && line1="${xterm_title}"
git_branch='$(git_current_branch " (%s)")'
line1="${line1}${user_host_path}${git_branch} "
line2='\$ '
print_time='{ printf "%*s" $(($(tput cols) - 10)) " "|sed -e "s/./˙/g" -re "s/.{6}(..)$/ bash \1/"; date "+ %T"; } >&2'
color_bold='\[\e[0;1m\]'
color_reset='\[\e[0m\]'
PROMPT_COMMAND="_rc_=\$?;${print_time};((_rc_!=0)) && PS1='${line1}\n${color_bold}[\$_rc_]${color_reset} ${line2}' || PS1='${line1}\n${line2}'"
unset user_host_path xterm_title color_bold color_reset line1 line2 print_time git_branch

ฉันไม่ใช่แฟนตัวยงของสี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.