Lệnh Bash thực thi mỗi khi một dấu nhắc mới được hiển thị


11

Tôi có lời nhắc sau trong bash hiển thị nhánh git hiện tại:

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

Nó hoạt động khi tôi nguồn .bashrc, nhưng không hoạt động khi tôi thay đổi nhánh, vì vậy var PS1 chỉ được đánh giá khi tôi nguồn .bashrc, nhưng nó sẽ được đánh giá mỗi khi một dấu nhắc mới được hiển thị. Làm thế nào điều này có thể được thực hiện với bash 4.3?

Câu trả lời:


14

Vấn đề của bạn là $(git_prompt)được đánh giá theo một chuỗi không đổi trước khi nó được thêm vào $PS1. Bạn phải thêm mã thay thế:

PS1+='$(git_prompt)'

2
điều này gây ra lỗi bash: command substitution: line 1: syntax error near unexpected token ) 'bash: lệnh thay thế: dòng 1:git_prompt)'
danielr1996

1
Điều đó thực sự kỳ lạ. Tạo một "bản sao lưu" ( oldPS1="$PS1") và sau đó thử:PS1='$(git_prompt) '
Hauke ​​Laging

9

Tôi đã sửa nó bằng cách sử dụng nó như là dấu nhắc

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

trước khi tôi nối nhiều chuỗi thành một chuỗi PS1, dường như có vấn đề. Bí quyết là viết một \trước khi thực hiện lệnh với $(git_prompt).

Vì vậy, $(git_prompt)sẽ được đánh giá khi .bashrcđược đánh giá và

\$(git_prompt) sẽ được đánh giá mỗi khi một dấu nhắc mới được hiển thị


5
Đối với bất kỳ ai tìm thấy điều này trong tương lai: Lưu ý dấu ngoặc kép kèm theo "xung quanh chuỗi. Sử dụng \$(git_prompt)mà không có những người không làm việc.
dthor

1

hãy thử trích dẫn trong ps1 của bạn

PS1+='$(git_prompt)'

tôi cũng đề nghị chức năng psOne của tôi

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\] \$ '
}

nhập mô tả hình ảnh ở đây


Điều này có vẻ thú vị, bạn có thể giải thích ps1tm để làm gì không?
danielr1996

@ danielr1996 đó là chế độ văn bản (in đậm không nhấp nháy gạch chân {0..5}, trong các chức năng này, nó được đặt thành 01 nếu không có đối số tồn tại
Jonah

0

Bạn muốn thấy sự điên rồ? Đây là cách tôi xây dựng dấu nhắc bash của mình:

# 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

Tôi không phải là một fan hâm mộ lớn của màu sắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.