Warum gibt Mac OS X keine ~/.bashrc-Quelle aus? [Duplikat]

Ich habe viele Leute gefunden, die herausgefunden haben, warum Anweisungen ähnlich wie diese sind:

Put X to your ~/.bashrc and you can do Y

funktionieren nicht.

Es stellt sich immer heraus, dass die Startdateien der Bash von Mac OS X (oder die Bash von Mac selbst) keine ~/.bashrc-Datei liefern, weder in der Login-Shell noch in einer Shell, die vom Windows-System erzeugt wird - wie die Terminal-App in Mac OS X)

Warum ist das so, wenn alle anderen Unix-ähnlichen Systeme mit Bash, mit denen ich zuvor gearbeitet habe, dies getan haben?

PS:

Ich habe gefunden, was Bash selbst über Startdateien sagt (was hilfreich sein könnte):

Wenn Bash als interaktive Login-Shell oder als nicht-interaktive Shell mit der Option --login aufgerufen wird, liest es zuerst Befehle aus der Datei /etc/profile und führt sie aus, falls diese Datei existiert. Nach dem Lesen dieser Datei sucht es in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile und liest und führt Befehle von der ersten Datei aus, die existiert und lesbar ist. Die Option --noprofile kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu verhindern.

Quelle: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Mir ist auch aufgefallen, dass ~/.bash_profiledas aber nicht ausgeführt wird ~/.bashrc. Seltsam.

Antworten (2)

In OSX startet das Terminal standardmäßig eine Anmeldesitzung, liest also .bash_profile usw. (Der GUI-Anmeldeprozess, der nach Ihrem Namen und Passwort fragt, verwendet keine Shell-Skripte und startet keine Shell, es wird alles von launchd und dem Arbeitsbereich erledigt)

Auf anderen Unices führt xterm standardmäßig eine Non-Login-Shell aus, sodass sie .bashrc lesen, da die Skripte, die Ihnen bei der Anmeldung Ihr Passwort usw. anzeigen, die Anmeldesitzung aufrufen und alle Terminals Teilprozesse davon sind und die Shell-Umgebung erben.

Aus dem GNU-Dokument, auf das Sie sich bezogen haben

Wird als interaktive Shell ohne Anmeldung aufgerufen

Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, liest Bash Befehle aus ~/.bashrc und führt sie aus, falls diese Datei existiert. Dies kann durch die Verwendung der Option --norc verhindert werden. Die Dateioption --rcfile zwingt Bash dazu, Befehle aus der Datei statt aus ~/.bashrc zu lesen und auszuführen.

Normalerweise enthält Ihr ~/.bash_profile also die Zeile

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

nach (oder vor) Anmelde-spezifischen Initialisierungen.

bashliest nur .bashrcfür Nicht-Login- Shells:

Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, liest und führt bash Befehle aus ~/.bashrc aus, falls diese Datei existiert. Dies kann durch die Verwendung der Option --norc verhindert werden. Die Dateioption --rcfile zwingt Bash, Befehle aus der Datei anstelle von ~/.bashrc zu lesen und auszuführen.

Da Terminal bashals Login-Shell startet (ausführen , um wzu sehen, dass die bashInstanzen als ausgeführt werden -bash), .bashrcwird es nie automatisch gelesen.

Der Punkt ist also, dass die Termina-App unter Mac OS X immer eine "Login" -Instanz von Bash erstellt? Wieso den ? Wenn Sie sich wirklich nicht anmelden. (Sie haben sich früher über die GUI angemeldet)
Nun, es ist das erste Mal, dass Sie die Shell so ausführen, wie Sie es sind, also ist es ein Login. In X11-basierten Unices starten Sie, indem Sie die Shell ausführen, die dann X ausführt, also ist es kein Login