Dlaczego .profile (a nie .bashrc) dołącza ~ / bin do ścieżki?

9

Skoro .bashrcjest bardziej „ogólny” (w tym sensie, że .profilepochodzi), dlaczego procedura „dołącz ~/bindo ścieżki” nie jest w środku .bashrc? Dlaczego użytkownik nie chce tego w powłoce niezalogowanej? (Zwłaszcza w dzisiejszych czasach, w których powłoki niezalogowane są bardziej powszechne *.)

Wiem, że mogę ręcznie wprowadzić taką zmianę, ale chcę wiedzieć, czy jest jakiś powód.

* nie mogę tego udowodnić, ale myślę, że tak jest.

Borges
źródło

Odpowiedzi:

13

~/.bashrci /etc/bash.bashrcsą uruchamiane przy każdym uruchomieniu interaktywnej bashpowłoki.

W przeciwieństwie do tego, ~/.profilei /etc/profilesą uruchamiane za każdym razem, każdy logowanie shell jest uruchamiany. Więc nie musi to być bashpowłoka, ale musi to być powłoka logowania (a wiele bashinstancji powłoki nie jest powłokami logowania ).

  • bashPowłoka jest powłoką gdzie program powłoka zapewniająca Jest bashraczej niż jakiś inny program, np dash.
  • Powłoka logowania to powłoka, która jest uruchamiana automatycznie w wyniku logowania, aby zapewnić interfejs użytkownika (graficzny lub wiersz poleceń) do logowania. Po wyjściu z powłoki logowania logowanie się kończy.

Dlatego umieszczenie polecenia, do którego dołączane są wpisy PATHw bashrcpliku:

  1. Nie rób nic, gdy skorupa nie jest bash, co często ma miejsce. Na przykład PATHniezmodyfikowany byłby podczas graficznej sesji logowania. Pamiętaj, że PATHnie jest używany tylko przez programy wiersza polecenia.

  2. Dołączaj go w kółko w obecności zagnieżdżonych bashmuszli. Tak więc, jeśli uruchomisz powłokę w powłoce - co jest bardzo powszechne z różnych powodów - będziesz mieć na sobie wiele ~/binwpisów PATH. Powoduje to, że PATHzmienna środowiskowa jest trudna do odczytania, a czasem również zmniejsza wydajność.

To byłoby niepożądane. Dlatego błędem byłoby umieszczenie tego w bashrcpliku; to naprawdę należy do ~/.profile. ~/.profilejest właściwym miejscem dla:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Powłoki bez logowania mają powłoki nadrzędne (lub coś, co zachowuje się jak powłoka logowania) jako ich rodzic i dziedziczą większość zmiennych środowiskowych, w tym PATHz tej powłoki logowania. Dlatego wprowadzenie komend modyfikujących ścieżkę ~/.profilewymaga wylogowania i ponownego zalogowania, aby były skuteczne, ale wpływa to również na środowisko powłok innych niż logowanie (a także środowisko programów, które nie są powłokami, ponieważ każdy program otrzymuje swoją własny zestaw zmiennych środowiskowych - zwany „środowiskiem” - odziedziczony po procesie nadrzędnym).

Eliah Kagan
źródło
Rozumiem. Ale ta decyzja wciąż nie ma dla mnie sensu. Jeśli teraz otwarty terminal ładuje tylko .bashrc, to nie będę mógł zobaczyć mojego prywatnego bin.
Borros
@borges Jeśli domyślna konfiguracja nie działa dobrze, możesz ją zmienić. (W końcu to twój komputer. A przynajmniej twoje konto.) Ale to brzmi jak jednorazowa sprawa. To znaczy, wygląda na to, że twój prywatny binkatalog nie istniał po zalogowaniu i że utworzyłeś go podczas tej sesji logowania. Jeśli się wylogujesz i wrócisz, będzie w twoim PATH. Ponieważ utworzenie prywatnego binkatalogu jest czymś, co należy zrobić tylko raz, jest to jednorazowa niedogodność.
Eliah Kagan
3

Jest tak, ponieważ tradycyjnie zmienne środowiskowe są wprowadzane tylko w /etc/profilelub .profile. bashrcPlik jest na takie rzeczy jak aliasy, ustawienia polecenia, opcji powłoki i tak dalej (czyli rzeczy, które odnoszą się bezpośrednio do zbiornika).

teppic
źródło