Warum bewirkt das manuelle Setzen der Bash-Eingabeaufforderung (PS1), dass root ein $ anstelle eines # hat?


11

Ich bin auf CentOS 6.4. Standardmäßig hat die Eingabeaufforderung des Root-Benutzers ein #Symbol, dh es sieht ungefähr so ​​aus [root@myserver ~]# .

echo $PS1druckt aus [\u@\h \W]\$; aber wenn ich das tue PS1="[\u@\h \W]\$"(was nichts ändern sollte, afaics), bekomme ich eine Eingabeaufforderung, die so aussieht : [root@myserver ~]$.

Warum interpretiert es das $wörtlich, wenn ich versuche, es selbst einzustellen (ich möchte es letztendlich in etwas Nützlicheres ändern) ? Nahezu jede Seite, die ich finden kann (z. B. Gewusst wie: Ändern / Einrichten der benutzerdefinierten Bash-Eingabeaufforderung (PS1) ), besagt, dass \$dies zu einem #für den Root-Benutzer führen sollte.


PS1=[\u@\h \W]\$kehrt zurück -bash: W]$: command not found.
Choroba

@choroba oops, sorry, habe die doppelten Anführungszeichen verpasst, es hätte sein sollen PS1="[\u@\h \W]\$".
Stripybadger

Antworten:


14

In Ihrer Frage implizieren Sie, dass Sie die Zeile überhaupt nicht zitieren. Das ist eindeutig falsch, denn dann würde das Leerzeichen die Argumentzuweisung "PS1 = [\ u @ \ h" vom Befehl "\ W] \ $" trennen. Bitte beachten Sie, dass jeder Charakter wichtig ist.

Wie auch immer, wahrscheinlich verwenden Sie doppelte Anführungszeichen (") anstelle von einfachen Anführungszeichen ('). Sie verhalten sich sehr unterschiedlich, wenn es um die Interpretation der von Ihnen eingegebenen Shell geht. Mit doppelten Anführungszeichen wird versucht, clevere Dinge zu tun Die Sequenzen von Backslash / Some-Character. Da \ u, \ h und \ W nichts Besonderes sind, bleiben sie für diese Zuordnung unberührt. Eckige Klammern können an verschiedenen Stellen besondere Bedeutungen haben, in diesem Fall jedoch nicht. Sie bleiben also an Ort und Stelle, aber da a $eine Vielzahl von Bedeutungen hat, die alle speziell sind, wird die \$Sequenz als "Ignorieren Sie die Besonderheit des Dollarzeichens und lassen Sie es einfach dort" interpretiert, und diese Sequenz wird durch ersetzt ein nicht weiter analysiertes einzelnes Dollarzeichen. Das Ergebnis all dessen wird zugewiesenPS1und da es ein wörtliches Dollarzeichen gibt und nicht die magische \$Sequenz, wenn die Shell die eigentliche Eingabeaufforderung erstellt, erhalten Sie nur das Dollarzeichen und nicht das vom effektiven Benutzer abhängige Zeichen. Das eigentliche Parsen ist etwas komplizierter, aber das ist der Kern dieses Beispiels.

Was Sie eingegeben haben: PS1="[\u@\h \W]\$ "
Was die Shell zugewiesen hat: PS1 <- "[\u@\h \W]$ "
Was Sie wollten: PS1 <- "[\u@\h \W]\$ "
Was Sie eingeben sollten:PS1='[\u@\h \W]\$ '

Was Sie als Nächstes tun sollten: Lesen Sie so etwas wie dieses Tutorial , um mehr über Shell-Zitate zu erfahren.


1
Ja, Sie waren genau richtig, ich habe doppelte Anführungszeichen verwendet (es tut mir leid, dass ich sie in der ursprünglichen Frage verpasst habe), danke, dass Sie auf meinen Fehler hingewiesen haben.
Stripybadger

Wenn Sie jemals tun müssen doppelte Anführungszeichen aus irgendeinem Grund verwenden, verwenden , PS1="...\\\$"um sicherzustellen , dass die wörtliche Paar \$gespeichert ist PS1für die Schale später zu interpretieren.
Chepner

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.