Welche Setup-Dateien sollten zum Einrichten von Umgebungsvariablen mit bash verwendet werden?

9

Wie ich hier und hier gefragt und Antworten erhalten habe , hat die PATH-Variable unterschiedliche Pfadnamen, je nachdem, wie die App aktiviert ist.

  • Welche Setup-Dateien (.bashrc, .profile, ...) sollten verwendet werden, um dieselbe PATH-Variable zu haben, unabhängig davon, wie ich die Software mit bash starte?
prosseek
quelle

Antworten:

15

Traditionell ist der Ort, an dem Umgebungsvariablen pro Benutzer auf Unix-Systemen definiert werden ~/.profile. Diese Datei wird von der Anmeldeshell gelesen (dh von dem Programm, das beim Anmelden gestartet wird und in das Sie Befehle eingeben können), sofern die Anmeldeshell eine Bourne-kompatible Shell ist.

Bash ist eine Bourne-kompatible Shell. Wenn es als Login-Shell aufgerufen wird, wird gelesen, ~/.bash_profileob diese Datei vorhanden ist und ~/.profileob ~/.bash_profilesie nicht vorhanden ist.

Als Faustregel gilt: Wenn Sie Ihr Kennwort im Textmodus eingeben (z. B. auf einer Textkonsole oder remote mit ssh), ist die Shell, die Sie erhalten, eine Anmeldeshell.

Wenn Sie jedoch Ihr Kennwort in ein grafisches Programm eingeben und in einer grafischen Umgebung angemeldet werden, wird die normale Anmeldeshell umgangen. Ob .profilein diesem Fall gelesen wird, hängt davon ab, wie die grafische Sitzung eingerichtet ist. Beispielsweise variiert es zwischen Linux-Distributionen, zwischen Display-Managern und zwischen Desktop-Umgebungen. Manchmal ruft eines der Programme in der Kette explizit eine Anmeldeshell auf. manchmal liest eines der Programme explizit ~/.profile; und manchmal passiert nichts davon und ~/.profilewird nicht gelesen.

Um ein Beispiel für die Variabilität zu geben, soweit ich anhand eines kurzen Blicks auf die beteiligten Skripte unter Ubuntu 10.04 erkennen kann: Wenn Sie sich mit kdm oder lxdm anmelden, ~/.bash_profilewird gelesen, ob es existiert, und ~/.profileansonsten; Wenn Sie sich mit gdm anmelden, wird nur ~/.profilegelesen. Wenn Sie sich mit xdm anmelden, ~/.profilewird nicht gelesen.

Alle mir bekannten Systeme bieten eine Möglichkeit, Umgebungsvariablen pro Benutzer festzulegen. Leider gibt es keine allgemeine Antwort.

Beachten Sie, dass manchmal Empfehlungen zum Festlegen von Umgebungsvariablen ~/.bashrcoder zum Starten einer Anmeldeshell in jedem Terminal in einer GUI-Umgebung angezeigt werden. Beides sind schlechte Ideen; Einer der Gründe ist das Problem, das Sie hatten, nämlich dass Ihre Umgebungsvariablen nur in Programmen verfügbar waren, die über ein Terminal gestartet wurden, und nicht in Programmen, die direkt mit einem Symbol, einem Menü oder einer Tastenkombination gestartet wurden.

Gilles 'SO - hör auf böse zu sein'
quelle
Einige Anwendungen rufen interaktive Nicht-Login-Shells auf, was bedeutet, dass .profile und .bash_profile nicht gelesen werden. Wenn Sie env vars für diese Anwendungen festlegen möchten, können Sie sie in .bashrc festlegen, obwohl dies nicht der richtige Ort dafür sein soll. siehe github.com/mobile-shell/mosh/issues/102#issuecomment-12503646
William
@William .profilewird beim Anmelden gelesen. Das Einfügen von Umgebungsvariablen .bashrcfunktioniert nicht, und Ihr Szenario zeigt Folgendes : Die (vermutlich GUI-) Anwendung, die diese Shell .bashrcausführt, sollte Ihre Umgebungsvariablen enthalten, aber wenn Sie sie definieren , funktioniert dies nicht. t.
Gilles 'SO - hör auf böse zu sein'
mosh ist keine grafische Benutzeroberfläche, sondern eine Alternative zu ssh. Ich verteidige sein Verhalten nicht, sondern versuche nur, anderen zu helfen, die auf dasselbe Problem stoßen, das ich und andere hatten, wie in der von mir verlinkten Github-Ausgabe beschrieben.
William
2

Die endgültige Antwort finden Sie im Abschnitt zur Bash- Manpage zu Bash-Startdateien . "Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest Bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist."

Antworten auf Ihre anderen Fragen weisen darauf hin, dass eshell nicht tatsächlich ausgeführt wird bash. Emacs eshellist nicht bash. Angenommen, eshelldas Laden wäre .bashrcgenauso fehlerhaft wie angenommen zshoder cshgeladen .bashrc. Es ist eine andere Hülle.

Ich sehe zwei Möglichkeiten:

  1. Erstellen Sie Ihr eigenes Skript, das eine Liste von Verzeichnissen erstellt und den entsprechenden Bash-Code für bashund Elisp-Code für generiert eshell.
  2. Stellen Sie Ihre ESHELL- oder SHELL-Umgebungsvariable so ein, dass Sie tatsächlich Bash in Emacs ausführen . Das ist, was ich tue. Bash funktioniert gut in Emacs.

Vielleicht interessiert Sie auch die Diskussion über das Hinzufügen eines Verzeichnisses zu einem Pfad ohne Duplikate .

Doug Harris
quelle
1

Das Einstellen Ihres Pfads in Ihrem ~ / .Profil sollte einfach funktionieren. Diese Datei wird beim Anmelden von jeder POSIX-kompatiblen oder Bourne-ähnlichen Shell gelesen, von der ich weiß, dass sie Bash enthält. Wenn Sie Änderungen an dieser Datei vornehmen, müssen Sie sich abmelden und erneut anmelden, damit die Änderungen wirksam werden. Da PATH Teil der Umgebung Ihres Anmeldevorgangs ist, sollte es in jede Shell exportiert werden, die Sie anschließend starten.

Garyjohn
quelle