Dlaczego ustawienie zachęty bash (PS1) ręcznie powoduje, że root ma $ zamiast #?

11

Jestem na CentOS 6.4. Domyślnie monit użytkownika root ma #symbol, tzn. Wygląda mniej więcej tak [root@myserver ~]# .

echo $PS1drukuje [\u@\h \W]\$; ale jeśli robię PS1="[\u@\h \W]\$"(który nie powinien nic zmieniać, afaics), I skończyć z wiersza, który wygląda tak: [root@myserver ~]$.

Dlaczego, kiedy próbuję to ustawić sam (ostatecznie chciałbym to zmienić na coś bardziej użytecznego), czy interpretuje to $dosłownie? Prawie każda strona, którą mogę znaleźć (np. Porady: zmiana / konfiguracja niestandardowego monitu bash (PS1) ) mówi, że \$powinno to dać #użytkownikowi root.

stripybadger
źródło
PS1=[\u@\h \W]\$zwraca -bash: W]$: command not found.
choroba
@choroba ups, przepraszam, przeoczyłem podwójne cytaty, powinno być PS1="[\u@\h \W]\$".
stripybadger

Odpowiedzi:

14

W swoim pytaniu sugerujesz, że wcale nie cytujesz linii; to jest oczywiście błędne, ponieważ wówczas spacja oddzieliłaby przypisanie argumentu „PS1 = [\ u @ \ h” od polecenia „\ W] \ $”. Pamiętaj, że każda postać jest ważna.

W każdym razie to, co prawdopodobnie robisz, to używanie podwójnych cudzysłowów („) zamiast pojedynczych ('). Zachowują się bardzo różnie, jeśli chodzi o powłokę interpretującą to, co wpisałeś. W przypadku podwójnych cudzysłowów spróbuje robić sprytne rzeczy za pomocą sekwencje odwrotnego ukośnika / jakiegoś znaku. W przypadku tego przypisania, ponieważ nie ma nic specjalnego w \ u, \ hi \ W, są one nietknięte; nawiasy kwadratowe mogą mieć specjalne znaczenie w różnych miejscach, ale nie w tym przypadku, więc są one również pozostawione na miejscu, ale ponieważ $ma wiele znaczeń, wszystkie są wyjątkowe, \$sekwencja jest interpretowana jako „zignoruj ​​specjalność znaku dolara i po prostu zostaw ją tam”, a sekwencja ta zostanie zastąpiona przez pojedynczy znak dolara bez dalszego analizowania. Wynik tego wszystkiego jest przypisany doPS1, a ponieważ istnieje dosłowny znak dolara, a nie magiczna \$sekwencja, gdy powłoka konstruuje rzeczywistą podpowiedź, otrzymujesz po prostu znak dolara, a nie postać zależną od efektywnego użytkownika. Rzeczywiste parsowanie jest nieco bardziej skomplikowane, ale to jest sedno tego w tym konkretnym przykładzie.

Co wpisałeś: PS1="[\u@\h \W]\$ "
Co przypisała powłoka: PS1 <- "[\u@\h \W]$ "
Co chciałeś: PS1 <- "[\u@\h \W]\$ "
Co powinieneś wpisać:PS1='[\u@\h \W]\$ '

Co należy zrobić dalej: Przeczytaj coś w tym samouczku, aby dowiedzieć się więcej o cytowaniu powłoki.

Gabe
źródło
1
Tak, byłeś na miejscu, użyłem podwójnych cudzysłowów (przepraszam, że pominąłem je w pierwotnym pytaniu), dziękuję za wskazanie mojego błędu.
stripybadger
Jeśli kiedykolwiek zrobić potrzebę korzystania podwójne cytaty z jakiegoś powodu, wykorzystanie PS1="...\\\$"w celu zapewnienia, że dosłowna para \$jest przechowywany w PS1dla powłoki interpretować później.
chepner,