Warum hängt .profile (und nicht .bashrc) ~ / bin an den Pfad an?

9

Da die Prozedur "Include to Path" nicht .bashrc"generisch" ist (in dem Sinne, aus dem .profilesie stammt), ~/binist sie nicht enthalten .bashrc. Warum möchte der Benutzer es nicht in einer Nicht-Login-Shell? (Besonders heutzutage, wo Nicht-Login-Shells häufiger vorkommen *.)

Ich weiß, dass ich solche Änderungen manuell vornehmen kann, aber ich möchte wissen, ob es einen Grund gibt.

* kann es nicht beweisen, aber ich denke, das ist der Fall.

Borges
quelle

Antworten:

13

~/.bashrcund /etc/bash.bashrcwerden jedes Mal ausgeführt, wenn eine interaktive bashShell gestartet wird.

Im Gegensatz dazu ~/.profileund /etc/profilewerden jedes Mal ausgeführt, wenn eine Anmeldeshell gestartet wird. Es muss also keine bashShell sein, aber es muss eine Login-Shell sein (und viele bashShell-Instanzen sind keine Login-Shells ).

  • Eine bashShell ist eine Shell, in der sich das Shell-Programm, das sie bereitstellt, befindet bash, und nicht irgendein anderes Programm, wie z dash.
  • Eine Anmeldeshell ist eine Shell, die als Folge der Anmeldung automatisch gestartet wird, um die Benutzeroberfläche (grafisch oder über die Befehlszeile) für die Anmeldung bereitzustellen. Wenn eine Anmeldeshell beendet wird, wird die Anmeldung beendet.

Das Einfügen eines Empfehlens, an das Einträge PATHin eine bashrcDatei angehängt werden, würde daher Folgendes bewirken :

  1. Tun Sie nichts, wenn die Shell nicht ist bash, was häufig der Fall ist. Wird beispielsweise PATHnicht geändert, wenn Sie sich in einer grafischen Anmeldesitzung befinden. Denken Sie daran, PATHwird nicht nur von Befehlszeilenprogrammen verwendet.

  2. Hängen Sie es in Gegenwart verschachtelter bashMuscheln immer wieder an. Wenn Sie also eine Shell innerhalb einer Shell starten - was aus verschiedenen Gründen sehr häufig vorkommt -, sind mehrere ~/binEinträge auf Ihrer Shell gestapelt PATH. Dies macht das PATHLesen der Umgebungsvariablen schwierig und verringert manchmal auch die Leistung.

Diese wären unerwünscht. Daher wäre es falsch , dies in eine bashrcDatei zu schreiben; es gehört wirklich in ~/.profile. ~/.profileist der richtige Ort für:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Nicht-Login-Shells haben Login-Shells (oder etwas, das sich wie eine Login-Shell verhält) als übergeordnetes Element und erben die meisten ihrer Umgebungsvariablen, einschließlich PATHdieser Login-Shell. Wenn Sie Befehle zum Ändern von Pfaden eingeben ~/.profile, müssen Sie sich abmelden und wieder anmelden, damit sie wirksam sind. Dies wirkt sich jedoch auch auf die Umgebung von Nicht-Login-Shells aus (sowie auf die Umgebung für Programme, die keine Shells sind, da jedes Programm seine Befehle erhält eigene Gruppe von Umgebungsvariablen - als "Umgebung" bezeichnet - vom übergeordneten Prozess geerbt).

Eliah Kagan
quelle
Ich verstehe. Aber diese Entscheidung macht für mich immer noch keinen Sinn. Wenn ein geöffnetes Terminal gerade nur .bashrc lädt, kann ich meinen privaten Papierkorb nicht sehen.
Borges
@borges Wenn die Standardkonfiguration für Sie nicht gut funktioniert, können Sie sie jederzeit ändern. (Immerhin ist es Ihr Computer. Oder zumindest Ihr Konto.) Aber das klingt nach einer einmaligen Sache. Das heißt, es klingt so, als ob Ihr privates binVerzeichnis bei der Anmeldung nicht vorhanden war und Sie es während dieser Anmeldesitzung erstellt haben. Wenn Sie sich abmelden und wieder anmelden, befindet es sich in Ihrem PATH. Da das Erstellen Ihres privaten binVerzeichnisses nur einmal durchgeführt werden muss, ist dies eine einmalige Unannehmlichkeit.
Eliah Kagan
3

Dies liegt daran, dass Umgebungsvariablen traditionell nur in /etc/profileoder gehen .profile. Die bashrcDatei ist für Dinge wie Aliase, Eingabeaufforderungseinstellungen, Shell-Optionen usw. (dh Dinge, die sich direkt auf die Shell beziehen).

teppic
quelle