Spędziłem dużo czasu na czytaniu o logowaniu i powłokach interaktywnych i dlaczego należy lub nie należy ustawiać środowisko zmienne, funkcje powłoki itp. w różnych plikach profili i bashrc. W tym poście wspomniano, że specyficzne elementy basha, takie jak opcje podpowiedzi, powinny być ustawione w ~ / .bashrc. To skłoniło mnie do zastanowienia się nad zmienną PS1. We wszystkich przykładach, które widziałem w związku z tym, mają one coś takiego jak export PS1=""
. Czy to naprawdę powinno zostać wyeksportowane do środowiska, ponieważ ma znaczenie tylko dla basha? Po prostu mając PS1=""
w moim ~ / .bashrc daje zamierzony efekt dla mnie, ale zastanawiam się, czy czegoś mi brakuje.
Odpowiedź
To prawda: PS1
ma znaczenie tylko w interaktywnych instancjach basha, dlatego powinno być ustawione w ~/.bashrc
i nie należy ich eksportować. PS1
ma również znaczenie w innych powłokach, ale ma inne znaczenie, ponieważ rozszerzenia zachęty różnią się w poszczególnych powłokach. W rzeczywistości, nawet między wystąpieniami bash, PS1
może mieć różne znaczenia, ponieważ znaczenie zależy od opcji powłoki (przynajmniej promptvars
).
Eksportowanie PS1
do środowiska z .profile
to powrót do lat 70. XX wieku, kiedy istniała tylko jedna powłoka, używał go (powłoka Bournea) i nie miał pliku konfiguracyjnego. Nadal działa, jeśli zawsze używasz tej samej powłoki i nigdy nie konfigurujesz jej inaczej. Ale wszystkie nowoczesne powłoki, które nie są przeznaczone wyłącznie do obsługi skryptów (csh, ksh , bash, zsh,…) czytać plik konfiguracyjny podczas uruchamiania interaktywnie (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), więc metoda z lat 70. nie jest już potrzebna. Ustawienie PS1
i innych ustawień specyficznych dla powłoki w pliku specyficznym dla powłoki i nie eksportowanie go do środowiska pozwala uniknąć zepsucia rzeczy, gdy używasz innej konfiguracji powłoki lub innej powłoki lub inny terminal, który nie „nie jest w stanie pokazać twoich zwykłych wskazówek. Ustawienie PS1
w pliku specyficznym dla powłoki działa przez cały czas, natomiast ustawienie go w .profile
i eksportowanie działa tylko w „prostych” przypadkach, więc nie ma powodu, aby nie robić tego we właściwy sposób, ale w sieci jest wiele złych tutoriali, a nawet złe konfiguracje domyślne w dystrybucjach. C „est la vie .
Komentarze
- Jak działa eksportowanie
PS1
z.profile
działają dla powłok bash bez logowania, ponieważ nie ' t źródłowych? Chcesz powiedzieć, że to zadziała, ponieważ nie powłoka logowania byłaby rozwidlona z powłoki logowania, więc dziedziczyłabyPS1
poprzez środowisko? - @MikeSweeney tak, że ' dlaczego jest ' s wyeksportowane .
- Jednym ze sposobów rozpowszechniania się błędnego pomysłu na temat eksportu PS1 jest zobaczenie
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– które często pojawia się u ludzi ' s .bashrc, aby ładować tylko takie rzeczy, jak uzupełnianie poleceń, jeśli jest to użytkownik ' to interaktywna powłoka terminala. Widząc, że tam działa, ta sama logika pojawia się w skryptach powłoki, stąd " potrzeba " aby go wyeksportować. Zamiast tego powinniśmy sprawdzić teractive / użytkownicy terminali ztty -s
lubtest -t 0
. - @DouglasDD Rzeczywiście. Test
PS1
był na przykład w Debianie ' s/etc/profile
od wieków. Nie ' nie wiem, gdzie pojawiła się ta zła praktyka. Podejrzewam, że pochodzi z jednego konkretnego przypadku użycia (może wykrycia logowania rlogin lub ssh?), W którym to się udało. Niestety w wielu innych przypadkach nie udaje się, stąd wiele pytań na ten temat tutaj i gdzie indziej. - @Gilles nie powinniśmy eksportować
CLICOLOR
iLS_COLORS
? @DouglasDD czy to oznacza, żeif [[-z $p1]];then return fi
czek w moim.bashrc
jest uszkodzony?