it-swarm.com.de

Warum funktioniert mein ~ / .bash_profile nicht?

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

Nachdem ich meine grafische Desktop-Umgebung gestartet und einen Terminalemulator ausgeführt habe, kann ich sehen, dass .bash_profile wird nicht bezogen (Umgebungsvariablen, die export enthalten sind, sind nicht festgelegt). Aber wenn ich mich über eine Textkonsole anmelde (ctrl+alt+F1) oder manuell ausführen bash -l vom Terminalemulator, .bash_profile funktioniert gut.

Liege 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?

P.S. Alles in .bashrc und Beschaffung von .bash_profile ist keine gute Idee ( https://stackoverflow.com/questions/902946/ ): Umgebungsmaterial sollte nur einmal bezogen werden.

36
AntonioK

Die Datei ~/.bash_profile Wird von bash gelesen, wenn es sich um eine Login-Shell handelt. Das bekommen 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 ist /bin/shdash , nicht bash. Dash und Bash haben beide die gleichen Kernfunktionen, aber Dash bleibt bei diesen Kernfunktionen, um schnell und klein zu sein, 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 zshhat viele schönere Funktionen ).

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

Also, was solltest du wo hinstellen?

  • Ein guter .bash_profile Lädt .profile Und lädt .bashrc, Wenn die Shell interaktiv ist.

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

  • Fügen Sie in .bashrc Interaktive Bash-Einstellungen wie Aliase, Funktionen, Vervollständigung, Tastenkombinationen (die nicht in .inputrc Enthalten sind),…

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

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

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

Debian verwendet, um .profile bei grafischer Anmeldung ( Wiki-Seite ab 201 ) jetzt nicht ( Wiki-Seite ab 2016 ).

Bogenquellen .xprofile bei grafischer Anmeldung ( Wiki-Seite ab 201 ).

Ubuntu hat früher davon abgeraten, .profile ( Wiki-Seite ab 201 ) Jetzt entmutigt es nicht mehr ( Wiki-Seite ab 2016 ).


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

Kurz gesagt, das Verhalten ist wie folgt:

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

Weitere Einzelheiten 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

16
lesmana

Beim Versuch, die Datei/source ~/.profile neu zu laden, treten einige Probleme auf. [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 führt man 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.

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

sh myscript.sh 

oder

. myscript.sh

Im ersten Fall wird eine Unterschale erstellt, die die Umgebungsvariablen Ihres Systems nicht beeinflusst und nur für den Unterschalenprozess sichtbar ist. Nach Abschluss des Unterschalenbefehls wird keiner der Exporte usw. angewendet. DIESES IS EIN GEMEINSAMER FEHLER UND VERURSACHT VIELE ENTWICKLER, VIEL ZEIT ZU VERLIEREN.

Damit Ihre in Ihrem Skript vorgenommenen Änderungen Auswirkungen auf die globale Umgebung haben, muss das Skript ausgeführt werden

.myscript.sh

befehl.

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

3
twboc

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

  • Fügen Sie 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
  • 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 bei mir unter Linux Mint nicht funktioniert. Verwenden von .bashrc hat gut funktioniert.

2
serv-inc

Die einfache Lösung besteht darin, das Terminal zu einem Login-Terminal zu machen. Für das Gnome-Terminal unter "Kachel und Befehl" des Standardprofils können Sie das Kontrollkästchen "Befehl als Anmeldeshell ausführen" aktivieren. This Artikel erklärt den Unterschied zwischen einer Login-Shell und einer nicht.

0