Warum gibt es unter Mac OS X keine Quelle ~ / .bashrc? [Duplikat]

95

Diese Frage hat hier bereits eine Antwort:

Ich habe viele Leute gefunden, die herausgefunden haben, warum eine Anweisung ähnlich der folgenden ist:

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

arbeite nicht

Es stellt sich immer heraus, dass die Startdateien von Mac OS X (oder Macs Bash selbst) keine ~ / .bashrc-Datei enthalten, weder in der Anmeldeshell noch in einer Shell, die vom Windows-System stammt (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 herausgefunden, was Bash selbst über Startdateien sagt (was hilfreich sein könnte):

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

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

Paul Brewczynski
quelle
Mir ist auch aufgefallen, dass ~/.bash_profiledas aber nicht ausgeführt wird ~/.bashrc. Komisch.
Igaurav

Antworten:

90

In OSX startet das Terminal standardmäßig eine Anmeldesitzung mit dem Namen .bash_profile usw. (Der GUI-Anmeldevorgang, bei dem Sie nach Ihrem Namen und Kennwort gefragt werden, verwendet keine Shell-Skripte und startet keine Shell. Alles wird über launchd und den Arbeitsbereich ausgeführt.)

Auf anderen Unices führt xterm standardmäßig eine Nicht-Login-Shell aus, so dass sie .bashrc als die Skripte lesen, die Ihnen bei der Anmeldung Ihr Passwort usw. vorlegen. Rufen Sie die Anmeldesitzung auf, und alle Terminals sind Teilprozess dieses Prozesses und erben die Shell-Umgebung.

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 Anmeldeshell ist, liest Bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist. Dies kann mit der Option --norc verhindert werden. Die Option --rcfile file erzwingt, dass Bash anstelle von ~ / .bashrc Befehle aus der Datei liest und ausführt.

Normalerweise enthält Ihr ~ / .bash_profile die Zeile

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

nach (oder vor) Login-spezifischen Initialisierungen.

user151019
quelle
7
Unicies = Unixes?
Paul Brewczynski
8
Nun, Unices, die ich meinte - ich habe Latein in der Schule
gelernt, also entferne
8
... und 3. Form "Unixen" (obwohl ich Unices bevorzuge)
earcam
7
und vierte "Einhörner" ...
tink
8
vergessen wir nicht die null-form, dh "
eunuchs
19

bashLiest nur .bashrcfür nicht angemeldete Shells:

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist. Dies kann mit der Option --norc verhindert werden. Die Option --rcfile file erzwingt, dass Bash anstelle von ~ / .bashrc Befehle aus der Datei liest und ausführt.

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

Nohillside
quelle
Der Punkt ist also, dass die Termina-App unter Mac OS X immer eine "Login" -Instanz von bash erstellt. Warum ? Wenn Sie sich wirklich nicht einloggen. (Sie haben sich früher von der GUI aus
angemeldet
Warum lesen andere Unix-Systeme ~ / .bashrc?
Paul Brewczynski
3
Niemand hier ist in der Lage, Designentscheidungen von Apple zu erklären. Ich könnte leicht beide Seiten streiten, aber das hilft auch nicht. Also
nimm
Nun, es ist das erste Mal, dass Sie die Shell ausführen, während Sie sich anmelden. In X11-basierten Unices starten Sie, indem Sie die Shell ausführen, die dann X
ausführt,
@PaulBrewczynski Nun, Linux hat einen Aufruf von .bash_profile in .bashrc.
Paul Stelian