Skonfiguruj gnome-terminal, aby zaczął bash jako powłokę logowania, nie czyta .bashrc

24

Próbuję zintegrować RVM z terminalem gnome .

Domyślnie gnome-terminal nie uruchamia basha jako powłoki logowania. Włączyłem, run command as a login shelljak sugerowano w tej odpowiedzi na ten sam temat konfigurowania RVM, ale kiedy to robię, .bashrcplik nie jest odczytywany.

Na przykład tworzę zmienną środowiskową, .bashrca kiedy uruchamiam nowy terminal gnome, nie mogę jej odczytać. Muszę uruchomić jawnie, source .bashrcaby odczytać plik.

Czy to jest oczekiwane zachowanie?

Arturo Herrero
źródło

Odpowiedzi:

38

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, --loginktó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 --loginopcji.


Zwykle chcesz, aby bash zawsze czytał ~/.bashrcw interaktywnej powłoce. Oto jak polecam to zrobić:

Utwórz ~/.bash_profileplik. Jeśli bash jest uruchamiany jako powłoka logowania, najpierw go szuka, ~/.bash_profilezanim zacznie szukać ~/.profile. Jeśli bash znajdzie, ~/.bash_profileto 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:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

a jeśli bash zostanie uruchomiony jako interaktywna powłoka niezalogowana:

  1. ~/.bashrc

Powinieneś umieścić rzeczy, które są specyficzne dla basha ~/.bashrci rzeczy, które nie są specyficzne dla basha ~/.profile. Na przykład PATHwchodzi ~/.profilei HISTCONTROLwchodzi ~/.bashrc.

Zauważ, że ~/.profilenie 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.

lesmana
źródło
1
+1. Dzięki, doprowadziło mnie to do ściany ... :-)
richsage
1
mywiki.wooledge.org/DotFiles wyjaśnia historię, dlaczego tak jest. Głównym powodem tego problemu z rvm jest jednak to, że rvm umieszcza kod, który powinien znajdować ~/.bashrcsię przede wszystkim w profilu. Błąd dotyczy rvm.
geirha
Zgodnie z @geirha powinni byli użyć~/.profile
sanmai
Uzasadnieniem jest to, że skrypt profilu może kontrolować ocenę .bashrcwzględną względem tego, co musi zrobić. Czy powłoka interaktywna zawsze czyta, czy .bashrcpowinno to być przed czy po .profile? Co jeśli chcesz skonfigurować pewne rzeczy, .bashrcktóre .profilebiorą za pewnik? A jednocześnie chcesz, aby niektóre rzeczy .bashrcpolegały na czymś stworzonym przez .profile? Żadna kolejność ładowania nie spełni obu scenariuszy.
Kaz
11

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ć.

  1. Przejdź do Edycja -> Preferencje profilu .

  2. Wybierz kartę Tytuł i polecenie .

  3. Zauważ, że pole wyboru Uruchom jako powłokę logowania nie jest zaznaczone! Sprawdź to.

to jest to! Jeśli zrobisz to z Defaultprofilem lub dowolnym profilem skonfigurowanym do użycia podczas tworzenia nowych terminali, otrzymasz powłokę logowania.

Zgaduję, że pod maską ta opcja prawdopodobnie powoduje przekazanie -lopcji do powłoki.

Gość
źródło
0

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 :)

Michael Franzl
źródło
0

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:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Rob Prentice
źródło