Bash-Echo-Farbe als Funktionsausgabe in PS1

990
Francesco Zaffaroni

Ich möchte, dass meine PS1 den Zweig anzeigt (wenn ich in einem Git-Ordner bin) und den Zweig rot färbt, wenn das Arbeitsverzeichnis schmutzig ist, und blau, wenn es sauber ist. Hier ist was ich gemacht habe

IBlack='\e[0;90m' # Nero IRed='\e[0;91m' # Rosso IGreen='\e[0;92m' # Verde IYellow='\e[0;93m' # Giallo IBlue='\e[0;94m' # Blu IPurple='\e[0;95m' # Viola ICyan='\e[0;96m' # Ciano IWhite='\e[0;97m' # Bianco  parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } branch_color() { if git status | grep --quiet "nothing to commit"; then echo -e "$IBlue" else echo -e "$IRed"  fi }   PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → " 

Nun druckt der Code dies:

francesco [demo_app]\e[0;94m (master)  → 

wo ist francesco mein benutzername, demo_app ist der ordner und master der zweig . Die Reihenfolge \ e [0; 94m ändert sich, wenn ich eine Datei im Arbeitsverzeichnis erstelle, aber die Farbe wird nicht analysiert, wie Sie sehen können.

Dann habe ich versucht, die PS1 so zu ändern:

PS1="\[$IGreen\]\u \[$ICyan\][\W]\[$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → " 

Entfernen Sie das '\' vor (branch_color), und jetzt wird die Farbe analysiert, aber es ändert sich nicht, wenn sich der Status des Arbeitsverzeichnisses ändert.

Wie kann ich das lösen? Entschuldigung, wenn ich nicht klar war.

Francesco

0
Ouch, sorry, Gehirn Fehler, ich nicht Fragen so spät beantworten ... löschte ich meine Antwort, da es in der Tat genau das gleiche war, aber das `\ e [0; 94m (Master)` war wahrscheinlich wegen eines Syntaxfehler, Das Kopieren des genauen Codes funktioniert auf meinem System einwandfrei. terdon vor 10 Jahren 0
Welches ist dein System? weil bei mir noch nicht klappt. es gibt die Farbe als String in der Eingabeaufforderung aus, anstatt sie zu analysieren (ich bin unter OSX 10.9.1) Francesco Zaffaroni vor 10 Jahren 0
Ah, ich bin unter Linux. Die Implementierung von `echo` ist möglicherweise unterschiedlich,` printf` ist eher [sicherer] (http://unix.stackexchange.com/q/65803/22222). Versuchen Sie, die beiden Echoaufrufe in `branch_color ()` durch `printf" \ e [0; 94m "` und `printf" \ e [0; 91m "` zu ersetzen terdon vor 10 Jahren 0
Maaan das hat funktioniert! Danke dir! (poste es als Antwort, damit ich es zuordnen kann) Francesco Zaffaroni vor 10 Jahren 0
Großartig! Ich habe eine Antwort gepostet. terdon vor 10 Jahren 0

1 Antwort auf die Frage

0
terdon

Der Code, den Sie haben, funktioniert perfekt auf meinem Debian. Ihr Problem könnte sein, dass OSX echodie Escape-Sequenz nicht korrekt druckt.

Es ist im Allgemeinen besser zu vermeiden echound printfstattdessen zu verwenden, da verschiedene Systeme unterschiedliche echoImplementierungen haben und dies die Portabilität Ihrer Skripts beeinträchtigen und auch andere Probleme verursachen kann. Sehen Sie hier für (viel) mehr Details.

Versuchen echoSie auf jeden Fall, die s in Ihrer Funktion durch `printf zu ersetzen :

branch_color() { if git status 2>/dev/null | grep --quiet "nothing to commit"; then printf "\e[0;94m" else printf "\e[0;91m"  fi } PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → "    PS1="\[$IGreen\]\u \[$ICyan\][\W]\[\$(branch_color)\]\$(parse_git_branch)\[$IWhite\] \n → " 
Toll, die Antwort ausgewählt, ty Francesco Zaffaroni vor 10 Jahren 0