Was ist der Unterschied zwischen .bash_profile und .bashrc?

245

Um einen Alias ​​für das Terminal in OS X zu erstellen, können Sie entweder die Aliase in .bash_profileoder einfügen .bashrc. Was ist der Unterschied zwischen den beiden und warum sollte ich Aliase in eines und nicht in das andere einfügen?

Daviesgeek
quelle
5
Um das Unix-Wissen hier nicht zu entmutigen, aber bash ist ein reines UNIX-Biest, sodass Sie möglicherweise besseres Wissen erhalten oder diese Frage auf einer Partnerseite mehrmals beantwortet bekommen. Es gibt weit über 200 bashrc Frage / Antwort-Paare bei Unix
bmike
Es gibt auch .profile ... Siehe diese Frage bei Stack Overflow.
Yaakov Baruch
2
Wenn Sie brew install bashund verwenden Sie iTerm2, können Sie festlegen profile -> command, /usr/local/bin/bashwelche .bashrcstandardmäßig nach geladen wird .bash_profile. Dies gibt Ihnen auch Bash 4 Goodies ...
Ray Foss
Ich habe gehört, dass .bashrc seit Jahren nicht mehr verwendet wird und standardmäßig nicht mehr funktioniert, und .bash_profile ist das Ding in macosx. Und ich habe .bashrc ausprobiert und es hat bei mir nicht funktioniert, aber .bash_profile hat
barlop

Antworten:

247

.bash_profilewird für Anmeldeshells ausgeführt, während .bashrcfür interaktive Shells ohne Anmeldung ausgeführt wird.

Wenn Sie sich über die Konsole anmelden (Benutzername und Kennwort eingeben), entweder am Computer oder remote über ssh: .bash_profilewird ausgeführt, um Ihre Shell vor der ersten Eingabeaufforderung zu konfigurieren.

Wenn Sie sich jedoch bereits bei Ihrem Computer angemeldet haben und ein neues Terminalfenster (xterm) öffnen, .bashrcwird dies vor der Eingabeaufforderung des Fensters ausgeführt. .bashrcwird auch ausgeführt, wenn Sie eine neue Bash-Instanz durch Eingeben /bin/basheines Terminals starten .

Unter OS X führt Terminal standardmäßig jedes Mal eine Anmeldeshell aus. Dies unterscheidet sich also ein wenig von den meisten anderen Systemen. Sie können dies jedoch in den Voreinstellungen konfigurieren.

Alex
quelle
57
On OS X, Terminal by default runs a login shell every time- Ich war schon immer so verwirrt, als ich das nicht merkte. Tolle Infos!
Vaughan
1
@Alex, Warum sollte das OS X-Terminal jedes Mal eine Anmeldeshell ausführen?
Pacerier
17
Weil einige Apple-Entwickler den Unterschied ursprünglich nicht erkannt haben und jetzt in irgendeinem Hokuspokus verankert sind.
Snowcrash
2
Ich arbeite unter OS X und verwende zshell anstelle von bash und iTerm anstelle von Terminal. Trotz der Tatsache, dass ich ein anderes Terminal und eine andere Shell verwende als in der Antwort beschrieben, scheint OS X immer noch alles als Anmeldeshell zu betrachten, da es .zprofilejedes Mal ausgeführt wird.
Adam Zerner
1
Informationen zu
kevinmicke
45

X11 wird sich Ihre ansehen, .bashrcwährend sich ein "normales" Terminal umschaut.bash_profile

Wenn Sie jedoch Folgendes hinzufügen .bash_profile, können Sie alles in Ihre .bashrcDatei verschieben, um alles an einer Stelle statt an zwei zu konsolidieren:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Stich
quelle
Oder du könntest es einfach tun cd ~ ; ln -s .bashrc .bash_profile.
23:52
5
Diese 2 Konfigurationsdateien haben eine klar getrennte Funktion. In einigen Fällen ist es erforderlich, dass die Dinge zu Beginn der Sitzung initialisiert werden und nur dort ( ~/.bash_profile). Oft ist es auch notwendig, Dinge auf jeder Shell-Ebene inkrementell zu definieren ( ~/.bashrc). Es ist nicht die beste Idee, diese Freiheit zu unterdrücken.
Dan
3
@danielAzuelos: Lurch hat diesen Teil weggelassen, aber das OS X-Terminal erzeugt ~/.bash_profilefür jedes neue Fenster / jeden neuen Tab eine Quelle , sodass es für Terminal keine Möglichkeit gibt, die beiden zu trennen.
Mipadi
14
@mipadi Es gibt noch Wert, um sie zu trennen. Zum Beispiel .bash_profilekann nie wieder im untergeordneten Prozess bezogen werden. Jede Ebene von verschachtelten Bash Quellen .bashrc, also wenn Sie so etwas wie setzen export A=a:$Ain .bashrcSie $Abekommt mehr in verschachtelten Bash. Normalerweise belasse ich Umgebungsvariablen im Profil und Aliase in RC.
Franklin Yu
@FranklinYu Für viele Menschen ist das vielleicht keine so große Sache, aber ich stimme vollkommen zu! Es ist ein großartiger technischer Punkt, um die Leute daran zu erinnern und verdient viel mehr Gegenstimmen.
Subfuzion
24

Für macOS muss folgender Code eingegeben werden .bash_profile, um alles zu konsolidieren .bashrc:

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

Dies ist spezifischer für Mac-Terminalbenutzer.

frzhen
quelle
6
Wie unterscheidet sich das von Lurchs Antwort aus dem Jahr 2012 ?
Arjan
0

TLDR; Verwenden Sie .bash_profilefür Ihre Aliase.

Das Zusammenspiel der verschiedenen Initialisierungsdateien ist etwas komplizierter, und in OSX gibt es einige wichtige Sonderfälle. Hier sind die Highlights:

  • Bash führt auf jeder Plattform eine von mehreren verschiedenen Dateien aus, je nachdem, wie sie aufgerufen werden. Die Details sind hier .
  • Die Terminal-App von OSX macht etwas, das nicht dem Standard entspricht: Sie erstellt jede neue Registerkarte oder jedes neue Fenster so, als wäre es eine Anmeldeshell. Das heißt, sie .bash_profilewird aufgerufen. Also der TLDR Hinweis oben.
  • .bashrcDies ist auch eine Option, die jedoch jedes Mal aufgerufen wird, wenn Sie eine Subshell erstellen (dh aufrufen bash). Dies kann zu Ineffizienz führen, wenn Sie eine Variable in der Subshell aktualisieren (z. B. PATH=/bin/foo:$PATH).
  • Andere Apps mit eingebetteten Terminals können die Konvention der Terminal App befolgen oder nicht. Insbesondere Visual Studio Code standardmäßig nicht .
  • Über die GUI aufgerufene Apps werden nicht aus einer Shell erzeugt. Daher gibt es verschiedene konkurrierende Mechanismen zum Festlegen von Umgebungsvariablen, die sich im Laufe der Jahre geändert haben .
  • Snippets, .bashrcvon .bash_profiledenen aus aufgerufen wird, sind weit verbreitet. Ich empfehle das nicht, aber es ist eine Präferenz.
Löwe
quelle
Warum ist die Verwendung .bash_profilevon Aliasen genau so kompliziert? Bei den Elementen, die Sie nur teilweise auflisten, handelt es sich überhaupt um Aliase. Können Sie also anstelle einiger Aufzählungszeichen einen Weg vorschlagen, um es unter diesen Umständen einfacher zu machen , warum es kompliziert zu sein scheint?
Nohillside
Ich verstehe dein Argument. Die Verwendung von .bash_profile ist nicht kompliziert. Es ist kompliziert, wie die Dateien aufgerufen werden. Ich werde aktualisieren.
Leo
Das Aufrufen von .bashrc aus .bash_profile wird im GNU-bash-Handbuch empfohlen. Wie kann man sonst Variablen usw. einstellen, die sowohl in Login-Shells als auch in nicht-interaktiven benötigt werden?
Mark
Jeder Terminal-Emulator, den ich auf verschiedenen Betriebssystemen verwende, bietet die Möglichkeit, neue Fenster als Anmeldeshell auszuführen, xterm und Xfce, um nur zwei zu nennen.
14.