Bash PS1 und einfache oder doppelte Anführungszeichen

719
StoneThrow

Ich bin ein Linux- und Bash-Neuling und möchte um Hilfe beim Verständnis der Rolle von einfachen und doppelten Anführungszeichen bei der Zuweisung der PS1-Umgebungsvariable var bitten. Ich wollte das Terminal so einstellen, dass immer das aktuelle Verzeichnis angezeigt wird. Zuerst habe ich es versucht:

export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]" 

Dies führte dazu, dass der Terminaltitel aktualisiert wurde, um das aktuelle Verzeichnis anzuzeigen, wenn ich die Eingabetaste drückte, aber nicht, wenn ich später zu einem anderen Ort wechseln würde .

Durch zielloses Ausprobieren versuchte ich schließlich:

export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]' 

Die zweite Version mit den einfachen Anführungszeichen hatte meinen gewünschten Effekt: Der Terminaltitel wurde jedes Mal aktualisiert, wenn ich in ein neues Verzeichnis wechselte.

Kann jemand erklären, warum sich die Verwendung von einfachen und doppelten Anführungszeichen auf diese Weise unterscheidet? Vielen Dank.

Ich fand diese Diskussion: Wie kann ich den Titel des Mintty-Fensters ändern? aber das OP scheint keine Antwort angekündigt zu haben, und die Antworten, die ich anhand dieses Links ausprobierte, schienen in meiner Hülle keine Wirkung zu haben.

0

1 Antwort auf die Frage

0
mtak

Der Unterschied zwischen einfachen und doppelten Anführungszeichen ist die Interpolation.

Im ersten Beispiel interpoliert die Shell den Ausdruck zwischen den Anführungszeichen, bevor er der PS1-Variablen zugewiesen wird. Der Wert der Variablen wäre also nach der Interpolation der Fall

> /home/user 

Im zweiten Beispiel weist die Shell den Ausdruck aufgrund der einfachen Anführungszeichen buchstäblich der Variablen zu. Dies führt zu dem erwarteten Verhalten (bei jedem Ausdruck einer Eingabeaufforderung interpoliert bash den Ausdruck basierend auf dem aktuellen Verzeichnis). Der Wert von PS1 wäre:

\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\] 

Sie können dies leicht mit ein paar Befehlen überprüfen:

$ a='hello' $ b="$ world" $ c='$ world'  $ echo $b hello world $ echo $c $ world 

In $bwird die Variable ain die Zeichenfolge interpoliert, aber in der Zeichenfolge $cnicht. Daher wird die Zeichenfolge buchstäblich gedruckt.