Perché l'impostazione del prompt di bash (PS1) fa sì che root abbia un $ anziché un #?


11

Sono su CentOS 6.4. Per impostazione predefinita, il prompt dell'utente root ha un #simbolo, cioè sembra qualcosa di simile [root@myserver ~]# .

echo $PS1stampa [\u@\h \W]\$; ma se lo faccio PS1="[\u@\h \W]\$"(che non dovrebbe cambiare nulla, afaics), io alla fine con un prompt che assomiglia a questo: [root@myserver ~]$.

Perché quando provo a impostarlo da solo (alla fine mi piacerebbe cambiarlo in qualcosa di più utile), interpreta $letteralmente? Quasi tutte le pagine che riesco a trovare (ad es. Procedura: modifica / configurazione del prompt personalizzato bash (PS1) ) indicano che \$dovrebbe risultare in un #per l'utente root.


PS1=[\u@\h \W]\$ritorna -bash: W]$: command not found.
Choroba,

@choroba oops, scusa, ho perso le doppie virgolette, avrebbe dovuto essere PS1="[\u@\h \W]\$".
stripybadger,

Risposte:


14

Nella tua domanda, sottintendi che non stai affatto citando la riga; è chiaramente sbagliato, perché lo spazio separerebbe l'assegnazione dell'argomento "PS1 = [\ u @ \ h" dal comando "\ W] \ $". Per favore, rendi conto che ogni personaggio è importante.

Ad ogni modo, quello che probabilmente stai facendo è usare le virgolette doppie (") anziché quelle singole ('). Si comportano in modo molto diverso quando si tratta della shell di interpretare ciò che hai digitato. Con le virgolette doppie, cercherà di fare cose intelligenti con le sequenze di backslash / some-character. Per questo compito, dato che non c'è nulla di speciale su \ u, \ h e \ W, non vengono toccati; le parentesi quadre possono avere significati speciali in vari punti, ma non in questo caso, quindi sono anche lasciati al loro posto, ma poiché una $ha una varietà di significati, tutti speciali, la \$sequenza viene interpretata come "ignora la particolarità del simbolo del dollaro e lasciala lì", e quella sequenza viene sostituita con un segno di dollaro singolo non ulteriormente analizzato. Il risultato di tutto ciò è assegnato aPS1e poiché c'è un segno letterale in dollari, e non la \$sequenza magica quando la shell costruisce il prompt reale, ottieni solo il simbolo del dollaro e non il personaggio dipendente dall'utente effettivo. L'analisi effettiva è un po 'più complicata, ma questo è l'essenza di questo esempio particolare.

Cosa hai digitato: PS1="[\u@\h \W]\$ "
Cosa ha assegnato la shell: PS1 <- "[\u@\h \W]$ "
Cosa volevi: PS1 <- "[\u@\h \W]\$ "
Cosa dovresti digitare:PS1='[\u@\h \W]\$ '

Cosa dovresti fare dopo: leggi qualcosa come questo tutorial per saperne di più sulla quotazione della shell.


1
Sì, eri perfetto, stavo usando le doppie virgolette (scusami per la mancanza della domanda originale), grazie per aver sottolineato il mio errore.
stripybadger,

Se mai fai necessità di utilizzare le virgolette doppie per qualche motivo, l'uso PS1="...\\\$"al fine di garantire che la coppia letterale \$viene memorizzato in PS1per la shell di interpretare più tardi.
Chepner,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.