Команда Bash prompt execute каждый раз, когда отображается новое приглашение

11

У меня есть следующее приглашение в bash, которое показывает текущую ветку git:

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

который работает, когда я получаю исходный код .bashrc, но не когда меняю ветвь, поэтому переменная PS1 оценивается только тогда, когда я получаю исходный код .bashrc, но она должна оцениваться каждый раз, когда отображается новое приглашение. Как это можно сделать с помощью bash 4.3?

danielr1996
источник

Ответы:

14

Ваша проблема заключается в том, что перед добавлением в него $(git_prompt)вычисляется некоторая постоянная строка . Вместо этого вы должны добавить код:$PS1

PS1+='$(git_prompt)'
Хауке Лагинг
источник
2
это дает ошибку bash: command substitution: line 1: syntax error near unexpected token ) 'bash: подстановка команд: строка 1:git_prompt)'
danielr1996
1
Это действительно странно. Сделайте «резервную копию» ( oldPS1="$PS1") и попробуйте:PS1='$(git_prompt) '
Hauke ​​Laging
9

Я исправил это сейчас, используя это как приглашение

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

до того, как я соединил несколько строк в одну строку PS1, казалось, что проблема. Хитрость заключается в том, чтобы написать \перед тем, как выполнить команду с $(git_prompt).

Так $(git_prompt)будет оцениваться, когда .bashrcоценивается и

\$(git_prompt) будет оцениваться каждый раз, когда отображается новое приглашение

danielr1996
источник
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:

# 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

Я не большой поклонник цвета.

Гленн Джекман
источник