Befehl zur Ausführung der Bash-Eingabeaufforderung jedes Mal, wenn eine neue Eingabeaufforderung angezeigt wird

11

Ich habe die folgende Eingabeaufforderung in Bash, die den aktuellen Git-Zweig anzeigt:

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

Dies funktioniert, wenn ich die .bashrc-Quelle beziehe, aber nicht, wenn ich den Zweig ändere. Daher wird die PS1-Variable nur ausgewertet, wenn ich die .bashrc-Quelle beziehe. Sie sollte jedoch jedes Mal ausgewertet werden, wenn eine neue Eingabeaufforderung angezeigt wird. Wie kann dies mit Bash 4.3 erreicht werden?

danielr1996
quelle

Antworten:

14

Ihr Problem ist, dass $(git_prompt)eine konstante Zeichenfolge ausgewertet wird, bevor sie hinzugefügt wird $PS1. Sie müssen stattdessen den Code hinzufügen:

PS1+='$(git_prompt)'
Hauke ​​Laging
quelle
2
Dies gibt den Fehler bash: command substitution: line 1: syntax error near unexpected token ) 'bash: Befehlsersetzung: Zeile 1:git_prompt)'
danielr1996
1
Das ist wirklich seltsam. Machen Sie ein "Backup" ( oldPS1="$PS1") und versuchen Sie dann:PS1='$(git_prompt) '
Hauke ​​Laging
9

Ich habe es jetzt behoben, indem ich dies als Eingabeaufforderung verwendet habe

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

Bevor ich mehrere Strings zu einem PS1-String verkettete, schien es ein Problem zu geben. Der Trick besteht darin, \vor dem Ausführen des Befehls ein zu schreiben $(git_prompt).

So $(git_prompt)bewertet werden , wenn die .bashrcausgewertet wird und

\$(git_prompt) wird jedes Mal ausgewertet, wenn eine neue Eingabeaufforderung angezeigt wird

danielr1996
quelle
5
Für alle, die dies in Zukunft finden: Beachten Sie die doppelten Anführungszeichen "um die Zeichenfolge. Verwenden \$(git_prompt)ohne diese funktioniert nicht.
Am
1

versuchen Sie es mit einem einfachen Anführungszeichen in Ihrem ps1

PS1+='$(git_prompt)'

Ich schlage auch meine psOne- Funktion vor

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

Geben Sie hier die Bildbeschreibung ein

Jona
quelle
Das sieht interessant aus, können Sie erklären, wofür der ps1tm ist?
Danielr1996
@ danielr1996 es ist der Textmodus (fett und fett fett unterstrichen {0..5}, in diesen Funktionen ist es auf 01 gesetzt, wenn kein Argument existiert
Jonah
0

Willst du Wahnsinn sehen? So konstruiere ich meine Bash-Eingabeaufforderung:

# 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

Ich bin kein großer Fan von Farbe.

Glenn Jackman
quelle