Podpowiedź Bash wykonuje polecenie za każdym razem, gdy wyświetlany jest nowy monit

11

Mam następujący monit w bash, który pokazuje bieżącą gałąź git:

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

co działa, gdy źródłem .bashrc, ale nie kiedy zmieniam gałąź, więc PS1 var jest oceniany tylko po źródle .bashrc, ale powinien być oceniany za każdym razem, gdy wyświetlany jest nowy monit. Jak można to osiągnąć dzięki wersji bash 4.3?

danielr1996
źródło

Odpowiedzi:

14

Twój problem polega na tym, że przed dodaniem $(git_prompt)jest oceniany na ciąg znaków . Zamiast tego musisz dodać kod:$PS1

PS1+='$(git_prompt)'
Hauke ​​Laging
źródło
2
to daje błąd bash: command substitution: line 1: syntax error near unexpected token ) 'bash: podstawienie polecenia: wiersz 1:git_prompt)'
danielr1996
1
To jest naprawdę dziwne. Utwórz „kopię zapasową” ( oldPS1="$PS1"), a następnie spróbuj:PS1='$(git_prompt) '
Hauke ​​Laging
9

Naprawiłem to teraz, używając tego jako zachęty

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

zanim połączyłem wiele ciągów w jeden ciąg PS1, wydawało się, że jest problem. Sztuczka polega na napisaniu \przed obliczeniem polecenia za pomocą $(git_prompt).

Tak $(git_prompt)będzie oceniany, gdy .bashrcjest oceniany i

\$(git_prompt) będą oceniane za każdym razem, gdy zostanie wyświetlony nowy monit

danielr1996
źródło
5
Dla każdego, kto znajdzie to w przyszłości: Zwróć uwagę na podwójne cudzysłowy "wokół ciągu. Używanie \$(git_prompt)bez nich nie działa.
dthor
1

wypróbuj pojedynczy cytat w swoim ps1

PS1+='$(git_prompt)'

Sugeruję również moją funkcję 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\] \$ '
}

wprowadź opis zdjęcia tutaj

Jonasz
źródło
To wygląda interesująco, czy możesz wyjaśnić, do czego służy ps1TM?
danielr1996
@ danielr1996 to tryb tekstowy (pogrubienie, pogrubienie, mrugnięcie podkreślenie {0..5}, w tej funkcji jest ustawiony na 01, jeśli nie ma argumentu
Jonah
0

Chcesz zobaczyć szaleństwo? Oto jak konstruuję mój monit 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

Nie jestem wielkim fanem kolorów.

Glenn Jackman
źródło