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 wieulimit
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.]
- Führen Sie dies direkt im Terminal oder in einem Skript aus?
- 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.