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łaby PS1 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 z tty -s lub test -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 i LS_COLORS? @DouglasDD czy to oznacza, że if [[-z $p1]];then return fi czek w moim .bashrc jest uszkodzony?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *