Warum funktioniert mein ~ / .bash_profile nicht?

35

Ich benutze Linux Mint. Meine Login-Shell ( cat /etc/passwd | grep myUserName) ist bash.

Nachdem ich meine grafische Desktop-Umgebung gestartet und einen Terminal-Emulator ausgeführt habe, kann ich feststellen, dass .bash_profilekeine Quellen vorhanden sind (die darin enthaltenen Umgebungsvariablen exportsind nicht festgelegt). Aber wenn ich mich von einer Textkonsole aus anmelde ( ctrl+ alt+ F1) oder manuell bash -lvom Terminalemulator aus starte, .bash_profilefunktioniert das einwandfrei.

Liege ich falsch, wenn ich der Meinung bin, dass .bash_profilediese Quelle beim exportStart von X bereitgestellt werden sollte und alle Ed-Vars im Terminal verfügbar sein sollten, die von X ausgeführt werden?

PS .bashrcEs .bash_profileist keine gute Idee, alles einzulegen und von dort zu beziehen ( https://stackoverflow.com/questions/902946/ ): Umgebungsthemen sollten nur einmal bezogen werden.

AntonioK
quelle

Antworten:

38

Die Datei ~/.bash_profilewird von der Bash gelesen, wenn es sich um eine Login-Shell handelt. Das bekommen Sie, wenn Sie sich im Textmodus einloggen.

Wenn Sie sich unter X anmelden, werden die Startskripte von ausgeführt /bin/sh. Auf Ubuntu und Mint /bin/shist Dash , nicht Bash. Dash und Bash haben beide die gleichen Kernfunktionen, aber Dash hält an diesen Kernfunktionen fest, um schnell und klein zu sein, wohingegen Bash viele Funktionen hinzufügt, die mehr Ressourcen erfordern. Es ist üblich, Bindestrich für Skripte zu verwenden, für die keine zusätzlichen Funktionen erforderlich sind, und Bash für die interaktive Verwendung zu verwenden (obwohl zsh viele bessere Funktionen bietet ).

Die meisten Kombinationen von Display - Manager (das Programm , in dem Sie Ihre Benutzername und Kennwort eingeben) und Desktop - Umgebung lasen ~/.profileaus der Anmeldeskripts in /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionoder vorzuweisen. Fügen Sie also Ihre Umgebungsvariablendefinitionen ein ~/.profile. Stellen Sie sicher, dass Sie nur die von dash unterstützte Syntax verwenden.

Also, was solltest du wo setzen?

  • Eine gute .bash_profilelädt .profileund lädt, .bashrcwenn die Shell interaktiv ist.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • In .profile, Put - Umgebungsvariable Definitionen und anderen Sitzungseinstellungen wie ulimit.

  • In .bashrclegte bash interaktiven Einstellungen wie Aliase, Funktionen, Abschluss, Tastenbelegungen (die nicht in sind .inputrc), ...

Siehe auch Unterschied zwischen Login-Shell und Nicht-Login-Shell? und Alternative zu .bashrc .

Gilles 'SO - hör auf böse zu sein'
quelle
Viele Dinge aus einer einzigen Antwort gelernt :)
MTK
16

.bash_profileist das Start-Konfigurationsskript von bash. Es gibt kein Standard-Mandat X zur Quelle .bash_profile.

Was Sie denken, ist eher .profile. Ursprünglich war es die Startkonfigurationsdatei der Borowski-Shell (sh). Heutzutage haben viele Distributionen ihre Desktop-Umgebung als Quelle eingerichtet .profile. Beachten Sie, dass dies ebenfalls kein Standard ist, aber es scheint eine Konvention zu sein.

Debian, das .profilebei der grafischen Anmeldung als Quelle verwendet wurde ( Wiki-Seite ab 2013 ), tut dies jetzt nicht mehr ( Wiki-Seite ab 2016 ).

Arch-Quellen .xprofilebeim grafischen Login ( Wiki-Seite ab 2013 ).

Ubuntu hat früher davon abgeraten .profile( Wiki-Seite ab 2013 ), jetzt wird davon nicht mehr abgeraten ( Wiki-Seite ab 2016 ).


Zu Ihrer anderen Frage: Warum funktioniert mein ~ / .bash_profile nicht? Das ist das erwartete Verhalten.

Das Verhalten ist, kurz gesagt, wie folgt:

  • bash startete als interaktive Login-Shell: liest ~/.profile
  • bash wurde als interaktive Shell ohne Anmeldung gestartet: reads ~/.bashrc

Weitere Details finden Sie in meiner Antwort auf eine ähnliche Frage in askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319

lesmana
quelle
1
Einiges davon ist korrekt, aber "Immer lesen ~/.bashrc" ist ein schlechter Rat: Sie sollten nur .bashrcaus einer interaktiven Shell lesen . Sie haben hier das Hauptproblem übersehen: Wenn Sie sich unter X anmelden, gibt es keine Anmeldeinstanz von bash (unter den meisten Display Manager / Desktop-Umgebungskombinationen, offensichtlich auch unter AntonioK).
Gilles 'SO - hör auf böse zu sein'
Danke für deine Rückmeldung. Ich hoffe, ich habe meine Antwort gut genug aktualisiert, um Ihre Beschwerden zu lösen. Bezüglich meines Hinweises "immer lesen .bashrc" meinte ich immer eine interaktive Shell. Ich habe diesen Teil geklärt. Ich hoffe es ist nicht mehr irreführend.
Lesmana
2
" Ubuntu rät ausdrücklich von der Verwendung von .profile( Link ) ab " Das Wiki hat einmal (absurderweise) davon abgeraten; das wurde behoben. (Hinweis: /etc/profileBei systemweiten Zuweisungen wird davon abgeraten, Skripts hinzuzufügen /etc/profile.d.) Benutzerdefinierte .profileDateien werden jetzt als eine der empfohlenen Methoden zum Festlegen von Umgebungsvariablen pro Benutzer angezeigt: "Geeignete Dateien für Einstellungen von Umgebungsvariablen, die sich nur auf a auswirken sollten Bestimmte Benutzer (und nicht das gesamte System) sind ~ / .pam_environment und ~ / .profile . "
Eliah Kagan
Die verlinkte Seite über Debian gibt an, dass Debian nicht~/.profile für die grafische Anmeldung liest und ~/.xsessionrcstattdessen verwendet werden sollte.
Karora
Danke fürs bemerken. Die Wiki-Seite wurde aktualisiert. Ich habe auf die Versionen verlinkt, wie sie zum Zeitpunkt der Antwort waren.
Lesmana
2

Beim Versuch, die Datei / source ~ / .profile neu zu laden, treten einige Probleme auf. [Dies bezieht sich auf Ubuntu Linux - in einigen Fällen unterscheiden sich die Details der Befehle]

  1. Führen Sie dies direkt im Terminal oder in einem Skript aus?
  2. Wie führe ich das in einem Skript aus?

Anzeige. 1)

Wenn Sie dies direkt im Terminal ausführen, wird keine Subshell erstellt. Sie können also zwei Befehle verwenden:

source ~/.bash_profile

oder

. ~/.bash_profile

In beiden Fällen wird die Umgebung mit dem Inhalt der .profile-Datei aktualisiert.

Ad 2) Sie können jedes Bash-Skript entweder durch Aufrufen starten

sh myscript.sh 

oder

. myscript.sh

Im ersten Fall wird eine Subshell erstellt, die die Umgebungsvariablen Ihres Systems nicht beeinflusst und nur für den Subshell-Prozess sichtbar ist. Nach Beendigung des Subshell-Befehls werden keine Exporte usw. angewendet. Dies ist ein häufiger Fehler und führt dazu, dass viele Entwickler viel Zeit verlieren.

Damit Ihre in Ihrem Skript vorgenommenen Änderungen für die globale Umgebung wirksam werden, muss das Skript ausgeführt werden

.myscript.sh

Befehl.

Um sicherzustellen, dass Ihr Skript nicht in einer Subshel ​​ausgeführt wird, können Sie diese Funktion verwenden. (Wieder Beispiel ist für Ubuntu-Shell)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Ich hoffe, dies beseitigt einige der häufigsten Missverständnisse! : D Viel Glück!

twboc
quelle
1

In Ihrer Frage verweisen Sie auf https://stackoverflow.com/questions/902946/ als Empfehlung, keine Quelle anzugeben, wenn die akzeptierte Antwort dies vorschreibt

  • Füge mein PATH-Setup in eine .profile-Datei ein (da ich manchmal andere Shells verwende)
  • Fügen Sie meine Bash-Aliase und -Funktionen in meine .bashrc-Datei ein
  • Dann benutze diesen [EDITED: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Bei .profileLinux Mint hat es bei mir nicht geklappt, alles einzuspielen. Mit hat gut .bashrcfunktioniert.

serv-inc
quelle
0

Die einfache Lösung besteht darin, das Terminal zu einem Login-Terminal zu machen. Für das Gnome-Terminal können Sie unter 'Kacheln und Befehle' des Standardprofils das Kontrollkästchen "Befehl als Anmeldeshell ausführen" aktivieren. Dieser Artikel erläutert den Unterschied zwischen einer Anmeldeshell und einer anderen Shell.

Driftprogrammierer
quelle