Warum funktioniert ' mein ~ / .bash_profile nicht?

Ich verwende 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 sehen, dass .bash_profile nicht bezogen wird (Umgebungsvariablen, die export ed darin sind nicht gesetzt). Aber wenn ich mich über eine Textkonsole anmelde ( Strg + alt + F1 ) oder manuell ausführe bash -l vom Terminalemulator, .bash_profile funktioniert einwandfrei.

Bin ich falsch, wenn ich denke, dass .bash_profile sollte beim Start von X bezogen werden und alle export „ed-Variablen sollten im Terminal verfügbar sein und von X?

PS ausgeführt werden Es ist keine gute Idee, alles in .bashrc zu platzieren und es von .bash_profile zu beziehen ( https://stackoverflow.com/questions/902946/ ): Umgebungsmaterial sollte nur einmal bezogen werden.

Antwort

Die Datei ~/.bash_profile wird von bash gelesen, wenn es sich um eine Anmeldeshell handelt. Das erhalten Sie, wenn Sie sich im Textmodus anmelden.

Wenn Sie sich unter X anmelden, werden die Startskripte von /bin/sh ausgeführt. Unter Ubuntu und Mint, /bin/sh ist dash , nicht bash. Dash und bash haben beide die gleichen Kernfunktionen, aber Dash bleibt dabei Diese Kernfunktionen sind schnell und klein, während bash viele Funktionen hinzufügt, die mehr Ressourcen erfordern. Es ist üblich, Dash für Skripte zu verwenden, die keine zusätzlichen Funktionen benötigen, und bash für die interaktive Verwendung (obwohl zsh bietet viele schönere Funktionen ).

Die meisten Anzeigekombinationen Manager (das Programm, in dem Sie Ihren Benutzernamen und Ihr Kennwort eingeben) und die Desktop-Umgebung lesen ~/.profile aus den Anmeldeskripten in /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession oder je nachdem, was anwendbar ist. Fügen Sie daher Ihre Umgebungsvariablendefinitionen in ~/.profile ein. Stellen Sie sicher, dass Sie nur die vom Dash unterstützte Syntax verwenden.

Was sollten Sie also wo ablegen?

  • Eine gute .bash_profile lädt .profile und lädt .bashrc, wenn die Shell interaktiv ist.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • Geben Sie in .profile Umgebungsvariablendefinitionen und andere Sitzungseinstellungen wie ulimit ein.

  • Fügen Sie in .bashrc interaktive Bash-Einstellungen wie Aliase, Funktionen, Vervollständigung und Tastenkombinationen ein (die nicht in ),…

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

Kommentare

  • Viele Dinge, die aus einer einzigen Antwort gelernt wurden: )
  • sogar .profile funktioniert nicht ‚ funktioniert in Debian 10 “ Buster „, nur .bashrc wor ks

Antwort

.bash_profile ist das Startkonfigurationsskript von Bash. Es gibt kein Standardmandat X für die Quelle .bash_profile.

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

Debian wird verwendet, um .profile bei der grafischen Anmeldung als Quelle zu verwenden ( Wiki-Seite ab 2013 ) jetzt nicht mehr ( Wiki-Seite ab 2016 ).

Arch-Quellen .xprofile bei der grafischen Anmeldung ( Wiki-Seite ab 2013 ).

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


Zu Ihrer anderen Frage: Warum funktioniert mein ~ / .bash_profile nicht? erwartetes Verhalten.

Kurz gesagt lautet das Verhalten wie folgt:

  • bash wurde als interaktive Anmeldeshell gestartet: liest ~/.profile
  • Bash wurde als interaktive Nicht-Login-Shell gestartet: lautet ~/.bashrc

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

Kommentare

  • Einiges davon ist korrekt, aber“ immer ~/.bashrc lesen „ist ein schlechter Rat: Sie sollten nur .bashrc aus einer interaktiven Shell .Sie ‚ haben hier das Kernproblem übersehen, nämlich, dass beim Anmelden unter X keine Anmeldeinstanz von bash vorhanden ist (unter den meisten Kombinationen aus Display Manager und Desktop-Umgebung, einschließlich offensichtlich AntonioK ‚ s).
  • Vielen Dank für Ihr Feedback. Ich hoffe, ich habe meine Antwort gut genug aktualisiert, um Ihre Beschwerden zu lösen. In Bezug auf meinen Rat an “ lautete immer .bashrc „, ich meinte immer eine interaktive Shell . Ich habe diesen Teil geklärt. Ich hoffe, es ist nicht mehr irreführend.
  • Ubuntu rät ausdrücklich davon ab, .profile ( link ) “ Das Wiki hat dies einmal (absurd) entmutigt; dass ‚ behoben wurde. (Hinweis: /etc/profile wird für systemweite Zuweisungen nicht empfohlen, da Skripte zu /etc/profile.d hinzugefügt werden.) Pro Benutzer .profile -Dateien werden jetzt als eine der empfohlenen Methoden zum Festlegen von Umgebungsvariablen pro Benutzer dargestellt: “ Geeignete Dateien für Einstellungen von Umgebungsvariablen, die nur einen bestimmten Benutzer betreffen sollten ( und nicht das gesamte System) sind ~ / .pam_environment und ~ / .profile . “
  • Die verlinkte Seite über Debian gibt an, dass Debian nicht
    ~/.profile für die grafische Anmeldung liest und ~/.xsessionrc sein sollte stattdessen verwendet.

  • danke fürs bemerken. Die Wiki-Seite wurde aktualisiert. Ich habe die Versionen zum Zeitpunkt der Antwort verlinkt.

Antwort

Einige Probleme treten auf, wenn versucht, die Datei / source ~ / .profile neu zu laden. [Dies bezieht sich auf Ubuntu Linux – in einigen Fällen sind die Details der Befehle unterschiedlich.]

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

Anzeige. 1)

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

source ~/.bash_profile 

oder

. ~/.bash_profile 

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

Anzeige 2) Sie können jedes Bash-Skript starten, indem Sie

sh myscript.sh 
oder

. myscript.sh 

Im ersten Fall wird eine Unterschale erstellt, die die Umgebungsvariablen von nicht beeinflusst Ihr System und sie sind nur für den Subshell-Prozess sichtbar. Nach Beendigung des Unterschalenbefehls wird keiner der Exporte usw. angewendet. Dies ist ein häufiger Fehler und führt dazu, dass viele Entwickler viel Zeit verlieren.

Damit Ihre Änderungen in Ihrem Skript wirksam werden In der globalen Umgebung muss das Skript mit dem Befehl

.myscript.sh 

ausgeführt werden.

Um sicherzustellen, dass Ihr Skript nicht ausgeführt wird Als Subshel können Sie diese Funktion verwenden. (Wieder ein Beispiel für die 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!

Antwort

In Ihrer Frage beziehen Sie sich auf https://stackoverflow.com/questions/902946/ empfiehlt, keine Quelle zu verwenden, wenn die akzeptierte Antwort

  • Füge mein PATH-Setup in eine .profile-Datei ein (weil ich manchmal andere Shells verwende)
  • Lege meine Bash-Aliase und -Funktionen in meine. bashrc-Datei
  • Verwenden Sie dann diese [BEARBEITET: Snip-Code-Kommentare]:

    .bash_profile:

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

Alles in .profile hat es getan funktioniert bei mir nicht unter Linux Mint. Die Verwendung von .bashrc hat gut funktioniert.

Antwort

Die einfache Lösung besteht darin, die Terminal ein Login-Terminal. Für das Gnome-Terminal unter „Kachel und Befehl“ des Standardprofils können Sie das Kontrollkästchen „Befehl als Anmeldeshell ausführen“ aktivieren. In diesem Artikel wird der Unterschied zwischen einer Anmeldeshell und einer anderen nicht erläutert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.