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
.
~/.bashrc
się przede wszystkim w profilu. Błąd dotyczy rvm.~/.profile
.bashrc
względną względem tego, co musi zrobić. Czy powłoka interaktywna zawsze czyta, czy.bashrc
powinno to być przed czy po.profile
? Co jeśli chcesz skonfigurować pewne rzeczy,.bashrc
które.profile
biorą za pewnik? A jednocześnie chcesz, aby niektóre rzeczy.bashrc
polegały na czymś stworzonym przez.profile
? Żadna kolejność ładowania nie spełni obu scenariuszy.Nie jest to ani zła decyzja projektowa, ani błąd, ani oczekiwane zachowanie powłok i terminali
Jest to po prostu niefortunna wartość domyślna opcji konfiguracji dla poszczególnych profili w Gnome Terminal, którą można łatwo naprawić.
Przejdź do Edycja -> Preferencje profilu .
Wybierz kartę Tytuł i polecenie .
Zauważ, że pole wyboru Uruchom jako powłokę logowania nie jest zaznaczone! Sprawdź to.
to jest to! Jeśli zrobisz to z
Default
profilem lub dowolnym profilem skonfigurowanym do użycia podczas tworzenia nowych terminali, otrzymasz powłokę logowania.Zgaduję, że pod maską ta opcja prawdopodobnie powoduje przekazanie
-l
opcji do powłoki.źródło
Miałem to samo pytanie i znalazłem rozwiązanie: po prostu użyj SSH jako prawdziwej powłoki logowania!
1. Jako superużytkownik utwórz dedykowanego użytkownika systemu rvm dla pełnej izolacji i przypisz hasło:
sudo su
useradd -m rvmuser
passwd rvmuser
2. Zainstaluj zależności, aby rvm mógł budować rubiny bez pytania o hasło administratora:
apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev
3. SSH w localhost dla prawdziwej powłoki logowania (być może trzeba
apt-get install ssh
)ssh rvmuser@localhost
4. Zainstaluj rvm
\curl -sSL https://get.rvm.io | bash -s stable
5. Wyloguj się i zaloguj ponownie, aby załadować wszystkie funkcje RVM
exit
ssh rvmuser@localhost
6. Użyj rvm :)
źródło
Często używa się bash do umieszczania inicjalizacji profilu
.bash_profile
, która jest czytana tylko przez bash podczas logowania, podczas gdy inne powłoki historycznie współdzieliły.profile
. Pozwala to na umieszczanie poleceń specyficznych dla basha.bash_profile
.Poniższe czynności są zwykle wykonywane w celu pobrania aliasów zdefiniowanych w
.bashrc
:źródło