/ etc / profil nie jest pozyskiwany

45

W dniu 11.04 dokonałem nowej instalacji mojego systemu. Częścią tej instalacji było zainstalowanie rvm , który wbija się rvm.shw /etc/profile.d/. To nie działa, ponieważ /etc/profile(który ładuje każdy + r /etc/profile.d/*.sh) nie jest ładowany. Zgodnie z dokumentacją profil jest pozyskiwany tylko wtedy, gdy bash jest uruchamiany podczas logowania. Aby to sprawdzić, przywołałem bash --login, po czym rvmbyło dostępne.

To działało dla mnie w poprzednich wersjach Ubuntu bez żadnej konfiguracji. Oznacza to, że nowa instalacja 10.10 poprawnie wygeneruje profil / .d.

Moje pytanie brzmi: czy jest coś, co robię źle, czy też są jakieś nowe założenia w Natty, które to złamały? Moje obecne obejście to source /etc/profilein ~/.bashrc(co jest okropne, ponieważ profil ma się ładować przed bashrc, ale załatwia sprawę).

Marc
źródło

Odpowiedzi:

52

Domyślnie gnome-terminal nie uruchamia basha jako powłoki logowania (zakładam, że masz na myśli bash rozpoczęty w terminalu gnome). Oznacza to, że bash nie przeczyta /etc/profilelub ~/.profile. Jak prawidłowo zauważyłeś, bash odczyta te pliki, jeśli zostanie uruchomiony jako powłoka logowania.

Szybkim rozwiązaniem tego problemu jest skonfigurowanie gnome-terminal, aby zaczął bash jako powłokę logowania, aby mógł czytać /etc/profile. Aby to zrobić, musisz włączyć opcję „Uruchom polecenie jako powłokę logowania” w terminalu gnome „Preferencje profilu” dostępnym z menu Edycja.

Nie polecam tego robić, ponieważ zaburza to rozróżnienie między ~/.profilei ~/.bashrc. Najlepiej byłoby ~/.profilerobić rzeczy, które są wymagane tylko raz, podczas logowania, podczas gdy ~/.bashrcpowinny robić rzeczy, które są wymagane przy każdym uruchomieniu bash.

U superużytkownika jest pytanie i odpowiedź na temat różnicy między bashrc a profilem . Przeczytaj tam, aby uzyskać więcej informacji.

Z opisu twojego problemu wydaje się, że skrypt rvm musi zostać załadowany tylko raz, podczas logowania. O ile wiem Ubuntu skonfigurował graficzny login do odczytu /etc/profile/i ~/.profile. Oznacza to, że po wylogowaniu i jednorazowym zalogowaniu skrypt rvm powinien być aktywny. Jeśli nadal nie działa, być może skrypt rvm musi zostać załadowany dla każdej sesji bash. Jeśli tak, to bashrcbardziej odpowiednie miejsce na skrypt.

lesmana
źródło
Ustawienie polecenia „uruchom jako powłoki logowania” rzeczywiście się załadowało /etc/profile(a tym samym .d). Dzięki za wyjaśnienie - wygląda na to, że wymaga to skontaktowania się z ludem RVM.
Marc
7
Ubuntu 11.04 nie wydaje się czytać /etc/profilei ~/.profilepodczas logowania. To dziwne, ponieważ zawsze działało ze starszymi wersjami. Myślę, że to nie jest rozwiązanie, ale obejście.
Luca,
2
@lesmana Czy istnieje sposób, aby włączyć „Uruchom polecenie jako powłokę logowania” z interfejsu CLI zamiast z GUI? Jestem przesyłany do zdalnego serwera i nie mogę lokalnie przesłać X-a.
Waseem
5

Istnieje jednak plik /etc/bash.bashrc odczytywany przez gnome-terminal, który jest „ogólnosystemowym plikiem .bashrc dla interaktywnych powłok bash (1)”.

Moje wywołanie funkcji rvm [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"poszło tam i działa dobrze dla kilku użytkowników tego systemu.

Dmitri
źródło
gnome-terminal nic takiego nie robi. gnome-terminal uruchamia bash (lub cokolwiek, na co ustawiono powłokę logowania w bazie danych passwd) w trybie interaktywnym, a bash zaczął interaktywnie czytać /etc/bash.bashrc. Cóż, przynajmniej na Debian / Ubuntu. Bash zwykle nie odczytuje bashrc całego systemu; debian załatał to, aby to zrobić.
geirha
@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Wt 14 lutego 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Ogólnosystemowy plik .bashrc dla interaktywnych powłok bash (1). # Aby włączyć ustawienia / polecenia w tym pliku również dla powłok logowania, # ten plik musi być pobrany w / etc / profile. # Jeśli nie działa interaktywnie, nie rób nic [-z „$ PS1”] && return .....
Dmitri
2
Tak, oczywiście, gnome-terminal wywołuje bash, aby odczytać ten plik: jeśli twoja powłoka to ksh, to gnome-terminal nie odczytałby tego pliku, prawda? Czy mogę zasugerować odszukanie w słowniku słowa „pedant”, zanim zaczniesz używać prowokujących zwrotów, takich jak „nic nie robi”.
Dmitri
4

Instalacja RVM jako wielu użytkowników wymaga od użytkownika uruchomienia tej komendy:

(ponieważ Ubuntu nie pobiera /etc/profile.d przy logowaniu)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc
użytkownik50486
źródło
3
Ubuntu pobiera pliki /etc/profile.d/podczas logowania, ponieważ domyślne /etc/profilepętle i źródła plików /etc/profile.d/. Jeśli jednak rvm.shzawiera kod dla interaktywnych powłok, takich jak funkcje lub aliasy, ich pozyskiwanie /etc/profilejest bezcelowe. Konfiguracja interaktywnych sesji bash musi być włączona .bashrc.
geirha
0

jeśli masz ZSH lub OH-MY-ZSH, twój profil to / etc / zprofile

Hadi Farnoud
źródło
0

Znalazłem dla tych, którzy nie lubią w pełni ponownie uruchamiać swoich urządzeń, chyba że jest to absolutnie wymagane następujące ...

Nie trzeba ponownie uruchamiać całego komputera, aby zmiany odniosły /etc/profileskutek. Wszystko, czego potrzebujesz, to ponowne uruchomienie graficznego interfejsu graficznego XWindows, aby ponownie odczytał konfiguracje (tak jak gdyby miał zostać uruchomiony w ramach restartu systemowego).

Dla mnie używam xUbuntu, który używa LightDM, ale możesz sub w dowolnym pliku wykonywalnym wywołującym bieżący pulpit.

Po pierwsze, nie możesz użyć emulatora terminala z poziomu samego graficznego interfejsu użytkownika (w tym przypadku nie tylko w LightDM), musisz użyć SSH lub dodatkowej konsoli (jeśli przytrzymasz Ctrl + Alt i naciśniesz klawisz F lub klawisz numeryczny powinieneś odejść od graficznego pulpitu logowania lub ekranu do zwykłego okna terminala). Sugeruję również, abyś zamknął wszelkie zdalne elementy pulpitu, takie jak VNC, jeśli używasz SSH (oczywiście SSH można podłączyć, po prostu nie chcesz, aby otwarte okno VNC wyświetlało 0 podczas próby ponownego uruchomienia, ponieważ może to zawiesić restart podczas czeka na zakończenie sesji VNC).

Robię to cały czas za pomocą SSH i jest to duży ratownik, szczególnie gdy nie jesteś fizycznie przy swoim komputerze i nie masz ochoty czekać na pełne ponowne uruchomienie i ponowne połączenie :-D

Teraz prosta część raz w „dodatkowym” problemie z terminalem lub SSH: (Tak, to zabije twoją bieżącą sesję, upewnij się, że nie masz nic przeciwko, zapisz wszelkie otwarte dokumenty lub pracę)

sudo service lightdm restart

poczekaj minutę, ponieważ zabija pulpit, a następnie uruchamia go ponownie (może to potrwać kilka dobrych sekund, ponieważ rzeczy są zatrzymywane, a następnie uruchamiane ponownie przy uruchomieniu)

To wszystko, teraz, gdy wrócisz do konsoli 0 lub użyjesz VNC do ponownego połączenia, zostaniesz przywitany monitem logowania i zalogowaniem się jak zwykle, a jeśli otworzysz emulator terminala i przejdziesz do wydania polecenia, powinieneś teraz nie ma żadnych problemów, ponieważ wszystko zostało ponownie zakupione, tak jak w przypadku pełnego ponownego uruchomienia komputera.

Wystarczy pamiętać, jeśli wyda sudo service lightdm restart[lub stop, startniezależnie] od wewnątrz samego środowiska graficznego przy użyciu emulatora terminala polecenie po prostu powiesić tam i nic nie wydaje się dzieje. Wynika to z faktu, że obecnie używasz tej konsoli (czyli wyświetlacza) 0, więc nie może ona w pełni zejść i wrócić, ponieważ czeka, aż pulpit nie będzie używany przed uruchomieniem polecenia.

Ostatnia uwaga: nie próbowałem ponownie uruchomić środowiska w środowisku pulpitu w emulatorze terminali, a następnie przełączyć się na inną konsolę, która może go zrestartować, ale jeśli już zamierzasz przełączyć konsolę, dlaczego po prostu nie uruchomić polecenia stamtąd tak jak powinno być?

Parias
źródło
-4

echo ". .profile" >> ~ / .bashrc

A następnie otwórz kolejne okno. Myślę, że to łatwe podejście.

Chris
źródło
1
Ponieważ są to .profileźródła domyślne .bashrc, dla większości użytkowników spowodowałoby to zapętlenie.
mur