Farbiger PS1-String

898
Will Vousden

Klarstellung: Ich möchte __foojedes Mal ausgeführt werden, wenn der PS1-String im Terminal präsentiert wird, nicht wenn der PS1-String erstellt wird (daher in Anführungszeichen). __fooenthält eine Logik, die das aktuelle Verzeichnis untersucht, daher muss seine Ausführung zurückgestellt werden.


Ich versuche aus meiner Bash-Funktion heraus, verschiedene Farben in meinem Bash PS1-String zu verwenden:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m"  __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' }  PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$' 

Im Wesentlichen möchte ich __fooeinen Teil der PS1 in verschiedenen Farben erzeugen. Mein Versuch scheint jedoch nicht zu funktionieren; es erzeugt die folgende Ausgabe:

-bash: 31m: command not found -bash: 32m: command not found \[]firstcolour \[\]secondcolour $ 

Was gibt und wie kann ich das beheben?

1

3 Antworten auf die Frage

2
zero2cx

Verwenden Sie die Bash-Umgebungsvariable $ PROMPT_COMMAND, um die $ PS1- Variable unmittelbar vor der Anzeige der Eingabeaufforderung neu zu definieren .

LIGHTRED='\033[1;31m' LIGHTGREEN='\033[1;32m' RESET='\033[m'  __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n "\[$1\]firstcolour \[$2\]secondcolour" }  PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$OFF\]\n\$ "' 

Hinweis: Zwei zusätzliche Änderungen, die ich an Ihrem Code vorgenommen habe, sind hier optional. Sie wurden hinzugefügt, weil ich denke, es wird klargestellt, wo / wo nicht die Escape-Codes erweitert werden:

  • Harte Anführungszeichen 'um die Farbdefinitionsvariablen.
  • Weiche Anführungszeichen "um den Rücksprung für__foo
Was ist der Vorteil der Verwendung von $ PROMPT_COMMAND, um $ PS1 zu setzen, anstatt nur einen dynamischen String für $ PS1 zu haben? Will Vousden vor 11 Jahren 0
Ich denke, das Zitieren ist einfacher mit PROMPT_COMMAND. Sie müssen nicht bei jeder Auswertung einen String erstellen, der einen Befehl ausführt. Sie bewerten nur die dynamischen Teile und setzen das Ergebnis in "PS1". chepner vor 11 Jahren 0
@WillVousden - Kein Vorteil. Es ist nur eine Antwort, die funktionieren wird. Ich habe dieses zur Verfügung gestellt, weil ich vermutete, dass niemand sonst vorschlagen würde, die Frage mit diesem Ansatz zu lösen. zero2cx vor 11 Jahren 0
Vielen Dank; $ PROMPT_COMMAND` war mir nicht bekannt, das ist gut zu wissen! Will Vousden vor 11 Jahren 0
1
Eureka

Your function foo returns a string which is executed by bash as a command, since you surrounded it with $() (and escaped all variable substitution with single quote marks.

Changing your code to this make it work just fine:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m" __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' } PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$ 
Ich hätte in meiner Frage klarer sein sollen: Ich möchte, dass "__foo" jedes Mal ausgeführt wird, wenn der PS1-String am Terminal präsentiert wird, nicht wenn das Skript ausgeführt wird. Ich habe meine Frage aktualisiert. Wie kann ich das machen? Will Vousden vor 11 Jahren 0
0
Will Vousden

Ich habe es gelöst:

LIGHTRED="\033[1;31m" LIGHTGREEN="\033[1;32m" RESET="\033[m"  __foo () { # Do some stuff and genereate a string to echo in different colours: echo -n '\['$1'\]firstcolour \['$2'\]secondcolour' }  PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$' 

Die Argumente __foomussten in Anführungszeichen gesetzt werden.