/ etc / profile wird nicht bezogen

45

Für den 11.04 habe ich eine Neuinstallation meines Systems durchgeführt. Ein Teil dieser Installation war die Installation von rvm , das ein rvm.shIn steckt /etc/profile.d/. Dies funktioniert nicht, da /etc/profile(die jeweils + r in lädt /etc/profile.d/*.sh) nicht geladen wird. Laut Dokumentation wird das Profil nur bezogen, wenn Bash in Login ausgeführt wird. Um dies zu überprüfen, habe ich aufgerufen bash --login, wonach rvmverfügbar war.

Dies hat bei mir in früheren Versionen von Ubuntu ohne Konfiguration funktioniert. Das heißt, bei einer Neuinstallation von 10.10 wird profile / .d korrekt als Quelle verwendet.

Meine Frage ist: Gibt es etwas, was ich falsch mache, oder gibt es neue Annahmen in Natty, die dies gebrochen haben? Meine aktuelle Problemumgehung ist source /etc/profilein ~/.bashrc(was schrecklich ist, da das Profil vor bashrc geladen werden soll, aber den Trick macht).

Marc
quelle

Antworten:

52

Standardmäßig startet gnome-terminal bash nicht als Login-Shell (ich nehme an, Sie meinen, bash wurde in einem gnome-terminal gestartet). Das heißt, Bash wird nicht lesen /etc/profileoder ~/.profile. Wie Sie richtig gesehen haben, liest bash diese Dateien, wenn es als Login-Shell gestartet wird.

Die schnelle Lösung für Ihr Problem besteht darin, gnome-terminal so zu konfigurieren, dass bash als Anmeldeshell gestartet wird, damit es liest /etc/profile. Dazu müssen Sie "Befehl als Anmeldeshell ausführen" im Gnome-Terminal "Profileinstellungen" aktivieren, das über das Menü "Bearbeiten" erreichbar ist.

Ich empfehle dies nicht, weil es die Unterscheidung zwischen ~/.profileund durcheinander bringt ~/.bashrc. Im Idealfall ~/.profilesollten Sie ~/.bashrcDinge tun, die nur einmal während der Anmeldung erforderlich sind, während Sie Dinge tun sollten, die bei jedem Start von bash erforderlich sind.

Beim Superuser gibt es eine Frage und Antwort, die den Unterschied zwischen bashrc und profile beschreibt . Lesen Sie dort für weitere Informationen.

Aus Ihrer Problembeschreibung geht hervor, dass das rvm-Skript beim Anmelden nur einmal geladen werden muss. Soweit ich weiß, hat Ubuntu die grafische Anmeldung zum Lesen /etc/profile/und Löschen konfiguriert ~/.profile. Das heißt, nach dem Abmelden und einem einmaligen Anmelden sollte das rvm-Skript aktiv sein. Wenn es immer noch nicht funktioniert, muss das rvm-Skript möglicherweise für jede Bash-Sitzung geladen werden. Wenn dies der Fall ist, bashrcist der geeignetere Ort für das Skript.

Lesmana
quelle
Das Setzen von 'run command as a login shell' wurde tatsächlich geladen /etc/profile(und damit die .d's). Vielen Dank für die Erklärung - es scheint so, als müsste das rvm-Volk nachverfolgt werden.
Marc
7
Ubuntu 11.04 scheint nicht zu lesen /etc/profileund ~/.profilewährend der Anmeldung. Es ist seltsam, weil es immer mit älteren Versionen funktioniert hat. Ich denke, dies ist keine Lösung, sondern eine Umgehung.
Luca
2
@lesmana Gibt es eine Möglichkeit, "Befehl als Anmeldeshell ausführen" über die CLI anstelle der GUI zu aktivieren? Ich sshed in einen Remote-Server und kann X lokal nicht weiterleiten.
Waseem
5

Es gibt jedoch eine Datei /etc/bash.bashrc , die von gnome-terminal gelesen wird und die "systemweite .bashrc-Datei für interaktive bash (1) -Shells" ist.

Mein Aufruf an die rvm-Funktion [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"ging dort rein und funktioniert einwandfrei für die paar Benutzer auf diesem System.

Dmitri
quelle
gnome-terminal macht nichts dergleichen. gnome-terminal führt bash (oder was auch immer Ihre Login-Shell in der passwd-Datenbank eingestellt ist) im interaktiven Modus aus und bash startete interaktive Lesevorgänge /etc/bash.bashrc. Nun, zumindest unter Debian / Ubuntu. Bash liest normalerweise keinen systemweiten bashrc; debian hat es dazu gepatcht.
Geirha
@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Di 14 Feb 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Systemweite .bashrc-Datei für interaktive bash (1) -Shells. # Um die Einstellungen / Befehle in dieser Datei auch für Login-Shells zu aktivieren, # muss diese Datei in / etc / profile erstellt werden. # Wenn Sie nicht interaktiv ausgeführt werden, tun Sie nichts [-z "$ PS1"] && return .....
Dmitri
2
Ja, offensichtlich ruft gnome-terminal bash auf, um diese Datei zu lesen: Wenn Ihre Shell ksh ist, würde gnome-terminal diese Datei nicht lesen, oder? Darf ich vorschlagen, das Wort "pedant" im Wörterbuch nachzuschlagen, bevor Sie weiterhin provokative Ausdrücke wie "tut nichts dergleichen" verwenden.
Dmitri
4

Für die Installation von RVM als Mehrbenutzer muss der Benutzer den folgenden Befehl ausführen:

(weil Ubuntu bei der Anmeldung nicht /etc/profile.d bezieht)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc
user50486
quelle
3
Ubuntu bezieht die Dateien /etc/profile.d/während der Anmeldung /etc/profileals Quelle, da die Standardeinstellung die Dateien in einer Schleife durchläuft und als Quelle verwendet /etc/profile.d/. Wenn dies jedoch rvm.shCode für interaktive Shells wie Funktionen oder Aliase enthält, /etc/profileist es sinnlos , sie von beziehen zu lassen. Das Setup für interaktive Bash-Sitzungen muss aktiviert sein .bashrc.
Geirha
0

Wenn Sie ZSH oder OH-MY-ZSH haben, lautet Ihr Profil / etc / zprofile

Hadi Farnoud
quelle
0

Ich habe eigentlich für diejenigen, die ihre Boxen nicht vollständig neu starten möchten, folgendes gefunden, es sei denn, es ist unbedingt erforderlich ...

Sie müssen nicht den gesamten Computer neu starten, damit die Änderungen /etc/profilewirksam werden. Sie müssen lediglich die XWindows Desktop-GUI neu starten, damit die Konfigurationsdaten erneut gelesen werden (so als ob sie im Rahmen eines systemweiten Neustarts gestartet würden).

Für mich verwende ich xUbuntu, das LightDM verwendet, aber Sie können in jeder ausführbaren Datei Ihren aktuellen Desktop eintragen.

Erstens können Sie keinen Terminal-Emulator innerhalb der Desktop-GUI selbst verwenden, um dies zu tun (zumindest nicht bei LightDM). Sie müssen entweder SSH oder eine sekundäre Konsole verwenden (wenn Sie Strg + Alt gedrückt halten und eine F-Taste oder eine Zifferntaste drücken Sie sollten sich von Ihrem grafischen Desktop-Login oder Bildschirm zu einem einfachen Terminal-Fenster zurückziehen. Ich schlage auch vor, dass Sie Remotedesktop-Objekte wie VNC schließen, wenn Sie SSH verwenden (SSH kann natürlich verbunden sein, Sie möchten jedoch nicht, dass ein offenes VNC-Fenster die Anzeige 0 abruft, während es versucht, neu zu starten, da dies den Neustart möglicherweise zum Erliegen bringt Es wartet darauf, dass Sie die VNC-Sitzung beenden.

Ich mache das die ganze Zeit mit SSH und es ist ein großer Lebensretter, besonders wenn Sie nicht physisch an Ihrem Computer sind und nicht auf einen vollständigen Neustart und erneutes Verbinden warten möchten :-D

Jetzt der einfache Teil einmal in einem "sekundären" Terminal oder SSH-Problem: (Ja, dies wird Ihre aktuelle Sitzung beenden, stellen Sie sicher, dass Sie nichts dagegen haben, alle offenen Dokumente oder Arbeiten zu speichern.)

sudo service lightdm restart

Warten Sie eine Minute, bis der Desktop beendet und wieder gestartet wird (dies kann einige Sekunden dauern, da die Dinge angehalten und beim Start erneut ausgeführt werden).

Das war's, wenn Sie jetzt entweder zu Konsole 0 zurückkehren oder VNC verwenden, um erneut eine Verbindung herzustellen, werden Sie von der Anmeldeaufforderung und der normalen Anmeldung begrüßt. Wenn Sie einen Terminalemulator öffnen und Ihren Befehl eingeben, sollten Sie dies jetzt tun Ich habe keine Probleme, da alles neu bezogen wurde, als ob Sie einen vollständigen Neustart der Maschine durchgeführt hätten.

Denken Sie daran, wenn Sie Ausgabe sudo service lightdm restart[oder stop, start, was] aus der Desktop - Umgebung in einen Terminal - Emulator mit dem Befehl wird nur dort hängen und nichts scheint zu geschehen. Dies liegt daran, dass Sie derzeit die Konsole (aka display) 0 verwenden und sie daher nicht vollständig herunter- und wieder hochfahren kann, da sie darauf wartet, dass der Desktop nicht verwendet wird, bevor der Befehl ausgeführt wird.

Letzte Anmerkung: Ich habe nicht versucht, einen Neustart der Umgebung über den Desktop in einem Terminalemulator durchzuführen und dann zu einer anderen Konsole zu wechseln, die möglicherweise neu gestartet wird. Wenn Sie die Konsole jedoch bereits wechseln möchten, führen Sie den Befehl aus von dort aus sollte es sowieso sein?

Paria
quelle
-4

Echo ". .profile" >> ~ / .bashrc

Und dann ein anderes Fenster öffnen. Ich denke, das ist der einfache Ansatz.

chris
quelle
1
Da dies die Standardquellen .profilesind .bashrc, würde dies für die meisten Benutzer zu einer Schleife führen.
muru