Tak, takie jest oczekiwane zachowanie.
Krótko mówiąc, zachowanie jest następujące:
- bash zaczął jako interaktywna powłoka logowania: czyta
~/.profile
- bash zaczął jako interaktywna powłoka niezalogowana: czyta
~/.bashrc
Aby uzyskać więcej informacji, przeczytaj instrukcję bash dotyczącą plików startowych .
Osobiście uważam, że takie zachowanie jest dziwne i nie znalazłem jeszcze uzasadnienia dla tej decyzji projektowej.
Niektóre wyjaśnienia terminologii:
- Interaktywna powłoka jest powłoką, z którymi można wchodzić w interakcje, co oznacza, że można wpisywać komendy w nim. Większość używanych powłok to powłoki interaktywne.
- Nieinteraktywny powłoka jest powłoką, z którą nie może wchodzić w interakcje. Skrypty powłoki działają w nieinteraktywnych powłokach.
- Logowanie powłoki jest powłoka, która jest uruchamiana podczas logowania do systemu.
- Non-login powłoka jest powłoką, która rozpoczyna się po zakończeniu procesu logowania.
Większość powłok, które widzisz, to interaktywne powłoki niezalogowane . Jest to szczególnie prawdziwe, jeśli używasz środowiska graficznego takiego jak gnome, ponieważ wtedy gnome jest „powłoką logowania”. Każda sesja bash rozpoczęta w gnome jest powłoką niezalogowaną. Jeśli chcesz zobaczyć prawdziwą interaktywną powłokę logowania, przejdź do wirtualnej konsoli (za pomocą Ctrl+Alt+F1
), a następnie zaloguj się, używając swojej nazwy użytkownika i hasła. To jest prawdziwa interaktywna powłoka bash. Możesz wrócić do powłoki graficznej za pomocą Ctrl+Alt+F7
.
Istnieje opcja, --login
która sprawi, że bash będzie zachowywał się tak, jakby był powłoką logowania, nawet jeśli został uruchomiony po zalogowaniu. Skonfigurowanie terminala gnome do uruchamiania basha jako powłoki logowania oznacza, że zacznie bash przy użyciu tej --login
opcji.
Zwykle chcesz, aby bash zawsze czytał ~/.bashrc
w interaktywnej powłoce. Oto jak polecam to zrobić:
Utwórz ~/.bash_profile
plik. Jeśli bash jest uruchamiany jako powłoka logowania, najpierw go szuka, ~/.bash_profile
zanim zacznie szukać ~/.profile
. Jeśli bash znajdzie, ~/.bash_profile
to nie będzie czytać ~/.profile
.
Umieść następujące wiersze ~/.bash_profile
:
[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"
Teraz, jeśli bash zostanie uruchomiony jako interaktywna powłoka logowania, odczyta następujące pliki:
~/.bash_profile
~/.profile
~/.bashrc
a jeśli bash zostanie uruchomiony jako interaktywna powłoka niezalogowana:
~/.bashrc
Powinieneś umieścić rzeczy, które są specyficzne dla basha ~/.bashrc
i rzeczy, które nie są specyficzne dla basha ~/.profile
. Na przykład PATH
wchodzi ~/.profile
i HISTCONTROL
wchodzi ~/.bashrc
.
Zauważ, że ~/.profile
nie jest to specyficzne dla bash. Odczytywane są również inne powłoki tekstowe (na przykład sh lub ksh) i powłoki graficzne (gnome) ~/.profile
. Dlatego nie powinieneś umieszczać specyficznych rzeczy do bash ~/.profile
.