Frage Warum wird ~ / .bash_profile beim Öffnen eines Terminals nicht bezogen?


Problem

Ich habe eine Ubuntu 11.04 Virtual Machine und wollte meine Java-Entwicklungsumgebung einrichten. Ich habe es wie folgt gemacht

  1. sudo apt-get install openjdk-6-jdk
  2. Folgende Einträge hinzugefügt zu ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Speichern Sie die Änderungen und beenden Sie sie

  4. Öffnen Sie erneut ein Terminal und geben Sie Folgendes ein

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. Es ist nichts passiert, so als ob der Export von JAVA_HOME und dessen Ergänzung zum PATH nie gemacht worden wäre.

Lösung

Ich musste gehen ~ / .bashrc und fügen Sie am Ende der Datei den folgenden Eintrag hinzu

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Fragen

  1. Warum musste ich das tun? Ich dachte bash_profile, bash_login oder Profil in Abwesenheit dieser beiden werden zuerst vor bashrc ausgeführt.
  2. War in diesem Fall mein Terminal a Nicht einloggen Schale?
  3. Wenn ja, warum, wenn su nach dem Terminal gemacht und das Passwort eingegeben wurde, führte es kein Profil aus, wo ich auch die oben erwähnten Exporte gesetzt hatte?

138
2018-04-11 16:27


Ursprung


Nette Lösung. Habe gerade mein Problem gelöst! - Atlas7


Antworten:


~/.bash_profile wird nur von bash bezogen, wenn es im interaktiven Anmeldemodus gestartet wird. Dies ist normalerweise nur der Fall, wenn Sie sich an der Konsole anmelden (Strg+Alt+F1..F6) oder über ssh verbinden.

Wenn Sie sich grafisch anmelden, ~/.profile wird speziell von dem Skript bezogen, das gnome-session startet (oder die von Ihnen verwendete Desktop-Umgebung). Damit ~/.bash_profile wird überhaupt nicht bezogen, wenn Sie sich grafisch anmelden.

Wenn Sie ein Terminal öffnen, startet das Terminal den Bash-Modus (Nicht-Login-Modus) ~/.bashrc.

Der richtige Platz für diese Umgebungsvariablen ist in ~/.profileund der Effekt sollte beim nächsten Einloggen offensichtlich sein.

Beschaffung ~/.bash_profile von ~/.bashrc ist die falsche Lösung. Es soll umgekehrt sein; ~/.bash_profile sollte Quelle sein ~/.bashrc.

Sehen DotFiles für eine gründlichere Erklärung, einschließlich einiger Geschichte, warum es so ist wie es ist.

(Nebenbei, bei der Installation von openjdk über apt sollten Symlinks vom Paket eingerichtet werden, so dass Sie nicht wirklich festlegen müssen JAVA_HOME oder ändern PATH)


183
2018-04-11 16:41



Ich habe festgestellt, dass beim Öffnen eines Terminals aus der Seitenleiste in Ubuntu 12 die Datei ~ / .profile nicht geladen wird. - jcollum
@jcollum Das ist gut. .profile sollte nur bei der Anmeldung bezogen werden. - geirha
Oh, das Öffnen eines Terminals ist nicht das selbe wie das Anmelden ... Ich dachte, ich loggte mich ein zum Terminal. - jcollum
Ich weiß, deshalb habe ich dort meinen zusätzlichen Code hinzugefügt. Was ich tun wollte, war, Optionen für das Terminal zu konfigurieren (z. B. die Eingabeaufforderung), aber diese wurden nicht geladen, wenn ich sie einstelle .profile, auch nach einem vollständigen Neustart. - Juan A. Navarro
@terdon, ja, aber bash ist nicht beteiligt, wenn man sich grafisch anmeldet, darum geht es gerade weiter .profile. - geirha


Sie können überprüfen, ob Ihre Bash-Shell als Login-Shell gestartet wurde:

shopt login_shell

Wenn die Antwort ist off Sie führen keine Login-Shell aus.

Lesen Sie das Bash-Handbuch Aufruf Abschnitt, in dem Bash unterschiedliche Konfigurationsdateien liest (oder nicht liest).

Ausschnitt aus man bash:

Wenn bash als interaktive Login-Shell oder als   nicht interaktive Shell mit dem --login  Option liest es zuerst   und führt Befehle aus der Datei aus /etc/profile, wenn diese Datei   existiert. Nach dem Lesen dieser Datei wird gesucht ~/.bash_profile,    ~/.bash_login, und ~/.profile, in dieser Reihenfolge, und liest und   führt Befehle von der ersten aus, die existiert und lesbar ist.

su Auf der anderen Seite startet auch keine Login - Shell standardmäßig, Sie müssen es dazu sagen, indem Sie die --login Möglichkeit.


40
2018-04-11 16:59



Vielen Dank für die shotp login_shell Befehl. Genial!! - Viriato
Bitte! Übrigens. Im Gegenzug habe ich eine Menge davon gelernt, während ich auf der Bash-Man-Seite nach deiner Antwort gesucht habe. :) - lgarzo


Ich denke, es ist erwähnenswert, dass Sie den Standard von gnome-terminal ändern können, um eine Login-Shell (dh. Bash -l) zu verwenden, indem Sie die Profileinstellungen bearbeiten.

Gehe zu Bearbeiten -> Profileinstellungen -> Titel und Befehl Registerkarte Aktivieren Sie die Option "Befehl als Login-Shell ausführen"


22
2018-06-22 00:23



Einfacher Vorschlag, um das Problem zu beheben. Genau das, was ich gesucht habe, danke. - Jose Torres
Was sind die Nachteile beim Aktivieren dieser Einstellung? - chrish
@chris Sie laden gerade Code ein wenig mehr Code als notwendig in vieler Gelegenheit. Es ist wahrscheinlich egal, ob du es bist ~/.bash_profile bewertet sehr schnell, was wahrscheinlich der Fall ist. Eine gute Sache zu prüfen ist, Anrufe zu anderen Prozessen, die in der Regel sehr teuer sind, zu jagen. - vaab


Wenn Sie ein Terminal öffnen oder ausführen su Die Shell wird nicht als Login-Shell, sondern als normale interaktive Shell ausgeführt. So heißt es ~/.bashrc aber nicht ~/.bash_profile. Du kannst rennen su mit dem -l Option, damit Ihre Shell als Login-Shell ausgeführt wird.

Wenn Sie mit einer GUI arbeiten, wird die Shell normalerweise nie als Login-Shell ausgeführt, daher ist es normalerweise in Ordnung, all Ihre Sachen hineinzulegen ~/.bashrc.


13
2018-04-11 16:43



Das war, was ich getan hatte und es funktionierte, aber überprüfen Sie, was der Typ in der Unterseite sagt, er schlägt vor, ist eine schlechte Idee, es in bashrc zu setzen und es stattdessen auf das Profil zu setzen. .... Hey beide Wege arbeiten, vielen Dank. - Viriato


TL; DR

Im klassischen empfohlenen ubuntu-Setup, ~/.bash_profile wird nur zu bestimmten Anlässen ausgewertet. Und es macht Sinn.

Leg deine Sachen rein ~/.bashrc, es wird jedes Mal ausgewertet werden.

Ok, ich möchte verstehen, warum macht das Sinn?

Schlüsselpunkte, um zu verstehen, was vor sich geht:

  • alle Prozesse auf Linux haben und verwendet Umgebung Variablen
  • Umgebungsvariablen sind vererbt
  • also sie setzen einmal auf den Vater von all deinen Prozessen ist genug (vor allem, wenn es etwas Rechenzeit benötigt.)
  • Der Vater all Ihrer Prozesse wird normalerweise nach Ihnen gestartet Einloggen auf deinem Gerät (gib deine Zugangsdaten an).
  • Es gibt Dinge, die Sie vielleicht nur einmal machen möchten, wenn Sie sich einloggen Ihr Computer (prüfen Sie zum Beispiel auf neue Mail ...).

So ist die "Login" -Zeit typischerweise:

  • Im Konsolenmodus, wenn Sie sich anmelden (mit Strg-Alt F1) oder durch ssh, Da die Shell der Vater aller Prozesse sein wird, wird es Ihre laden ~/.bash_profile.
  • Im Grafikmodus, wenn Sie Ihre Sitzung öffnen, der erste Prozess (gnome-session für klassische ubuntu) wird verantwortlich sein zu lesen
    .profile.

Ok, wo soll ich meine Sachen hinstellen?

Es ist ziemlich komplex, das Die ganze Geschichte ist hier. Aber hier ist ein Rundown das ist ziemlich üblich für Ubuntu-Benutzer. Also in Anbetracht dessen:

  • Sie nutzen bash Schale,
  • du hast ein ~/.bash_profile und folge dem Empfehlung hinzufügen das Laden von ~/.bashrc in deinem ~/.bash_profile um zu bekommen mindestens eine Datei, die ausgewertet wird, was auch immer der Aufruf ist Mechanismus.

Dies ist ein schneller Vorschlag, wo man Dinge hinstellen soll.

  • ~ / .bashrc  (Erhält in allen Fällen ausgewertet, sofern Sie der Empfehlung folgen

    Zum schnelle Auswertung Umgebungsvariable und Code für Ihre Nur Benutzer und Nur Bash Befehlszeilennutzung (Aliase für Beispiel). Bashismus sind willkommen.

    Es wird auf sich geladen auf:

    • Erstellen Sie ein neues Shell-Fenster / Fenster in grafischen Sitzungen.
    • Berufung bash
    • screen neues Fenster oder Tab (nicht tmux !)
    • Eine beliebige Bash-Instanz in einem grafischen Konsolenclient (terminator/gnome-terminal...) wenn du Zecke nicht  Option "Befehl als Login-Shell ausführen".

    Und es wird bei all den anderen Gelegenheiten dank der vorherigen Empfehlung geladen.

  • ~ / .bash_profile  (Erhält nur zu bestimmten Anlässen ausgewertet)

    Zum langsame Auswertung Umgebungsvariable und Code für Ihre Nur Benutzer und Konsolensitzung Prozesse. Bashismus sind willkommen. Es wird geladen auf:

    • Konsolenanmeldung (Strg-Alt F1),
    • ssh Logins zu dieser Maschine,
    • tmux neue Fenster oder Fenster (Standardeinstellungen), (nicht screen !)
    • explizite Aufrufe von bash -l,
    • Eine beliebige Bash-Instanz in einem grafischen Konsolenclient (terminator/gnome-terminal...) nur wenn Sie kreuzen Option "Befehl als Login-Shell ausführen".
  • ~ / .profil  (Wird nur in der grafischen Sitzung ausgewertet)

    Zum langsame Auswertung Umgebungsvariablen und mit Nein-Bashismus für dein Nur Benutzer und alles grafische Sitzung Prozesse. Es wird geladen bei der Anmeldung in Ihrer grafischen Benutzeroberfläche.


1
2018-03-08 03:58



Wenn bash eine Profildatei lädt, wird sie geladen .profile ob .bash_profile ist nicht vorhanden. - muru