Was ist der Unterschied zwischen .bashrc, .bash_profile und .environment?

130

Ich habe eine Reihe verschiedener * nix-basierter Systeme der Jahre verwendet, und es scheint, dass jede von mir verwendete Bash-Variante einen anderen Algorithmus hat, um zu entscheiden, welche Startskripte ausgeführt werden sollen. Welches Startskript ist für Aufgaben wie das Einrichten von Umgebungsvariablen und Aliasnamen und das Drucken von Startnachrichten (z. B. MOTDs) der geeignete Ort, um diese auszuführen?

Was ist der Unterschied zwischen den Dingen bei der Umsetzung .bashrc, .bash_profileund .environment? Ich habe auch andere Dateien wie gesehen .login, .bash_loginund .profile; sind diese jemals relevant? Was sind die Unterschiede, in denen ausgeführt wird, wenn Sie sich physisch anmelden, sich remote über ssh anmelden und ein neues Terminalfenster öffnen? Gibt es signifikante Unterschiede zwischen Plattformen (einschließlich Mac OS X (und dessen Terminal.app) und Cygwin Bash)?

Adam Rosenfield
quelle

Antworten:

73

Der Hauptunterschied zu Shell-Konfigurationsdateien besteht darin, dass einige nur von "Login" -Shells gelesen werden (z. B. wenn Sie sich von einem anderen Host aus anmelden oder sich an der Textkonsole eines lokalen Unix-Computers anmelden). Dies sind diejenigen, die beispielsweise .loginoder .profileoder genannt werden .zlogin(je nachdem, welche Shell Sie verwenden).

Dann haben Sie Konfigurationsdateien, die von "interaktiven" Shells gelesen werden (wie in solchen, die mit einem Terminal verbunden sind (oder Pseudo-Terminal im Fall eines Terminalemulators, der unter einem Fenstersystem ausgeführt wird). Dies sind diejenigen mit Namen wie .bashrc, .tcshrc, .zshrcusw.

bashdadurch verkompliziert dies .bashrcist nur durch eine Schale lesen , die beide sind interaktiv und nicht-Login , so dass Sie die meisten Leute ihnen sagen , am Ende finden werden .bash_profileauch zu lesen , .bashrcmit so etwas wie

[[ -r ~/.bashrc ]] && . ~/.bashrc

Andere Shells verhalten sich anders - zum Beispiel mit zsh, .zshrcist immer für eine interaktive Shell zu lesen, ob es sich um ein Login ist oder nicht ist.

Die Handbuchseite für Bash erklärt die Umstände, unter denen jede Datei gelesen wird. Ja, das Verhalten zwischen Maschinen ist im Allgemeinen konsistent.

.profileist einfach der Dateiname des Anmeldeskripts, der ursprünglich von verwendet wurde /bin/sh. bashDa es im Allgemeinen abwärtskompatibel ist /bin/sh, wird gelesen, .profileob eines vorhanden ist.

Cos
quelle
48

Das ist einfach. Es wird erklärt in man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Login-Shells sind diejenigen, die beim Anmelden gelesen werden (sie werden also beispielsweise nicht ausgeführt, wenn Sie beispielsweise nur xterm starten). Es gibt andere Möglichkeiten, sich anzumelden. Zum Beispiel mit einem X Display Manager. Diese haben andere Möglichkeiten, Umgebungsvariablen beim Anmelden zu lesen und zu exportieren.

Lesen Sie auch das INVOCATIONKapitel im Handbuch. Es heißt "Die folgenden Absätze beschreiben, wie bash seine Startdateien ausführt." Ich denke, das ist genau richtig :) Es erklärt, was eine "interaktive" Shell auch ist.

Bash weiß nichts davon .environment. Ich vermute, dass dies eine Datei Ihrer Distribution ist, um Umgebungsvariablen unabhängig von der von Ihnen betriebenen Shell festzulegen.

Johannes Schaub - litb
quelle
1
Könnten Sie hinzufügen, /etc/bashrcum die Antwort zu erfüllen?
Nemoden
9

Wird klassisch ~/.profilevon Bourne Shell verwendet und wahrscheinlich von Bash als Legacy-Maßnahme unterstützt. Wieder ~/.loginund ~/.cshrcwurden von C Shell verwendet - ich bin nicht sicher, ob Bash sie überhaupt verwendet.

Das ~/.bash_profilewürde einmal beim Login verwendet werden. Das ~/.bashrcSkript wird jedes Mal gelesen, wenn eine Shell gestartet wird. Dies ist analog zu /.cshrcC Shell.

Eine Konsequenz ist, dass die Inhalte ~/.bashrcso leicht (minimal) wie möglich sein sollten, um den Overhead beim Starten einer Shell ohne Anmeldung zu verringern.

Ich glaube, die ~/.environmentDatei ist eine Kompatibilitätsdatei für Korn Shell.

Jonathan Leffler
quelle
7

Ich habe hier Informationen zu .bashrc und .bash_profile gefunden, um es zusammenzufassen:

.bash_profile wird beim Anmelden ausgeführt. Dinge, die Sie dort eingeben, sind möglicherweise Ihr PFAD und andere wichtige Umgebungsvariablen.

.bashrc wird für Nicht-Login-Shells verwendet. Ich bin mir nicht sicher, was das bedeutet. Ich weiß, dass RedHat es jedes Mal ausführt, wenn Sie eine andere Shell starten (su für diesen Benutzer oder einfach erneut bash aufrufen). Vielleicht möchten Sie dort Aliase einfügen, aber ich bin mir nicht sicher, was das bedeutet. Ich ignoriere es einfach selbst.

.profile ist das Äquivalent von .bash_profile für die Wurzel. Ich denke, der Name wurde geändert, damit andere Shells (csh, sh, tcsh) ihn auch verwenden können. (Sie brauchen keinen als Benutzer)

Es gibt auch .bash_logout, das bei ausgeführt wird. Vielleicht möchten Sie Deamons stoppen oder sogar ein wenig Haushalt führen. Sie können dort auch "Löschen" hinzufügen, wenn Sie den Bildschirm beim Abmelden löschen möchten.

Auch gibt es ein vollständiges Follow - up auf jedem der Konfigurationsdateien hier

Diese sind wahrscheinlich sogar von der Distribution abhängig, nicht alle Distributionen entscheiden sich für jede Konfiguration und einige haben sogar noch mehr. Wenn sie jedoch denselben Namen haben, enthalten sie normalerweise denselben Inhalt.

Filip Ekberg
quelle
4

Laut Josh Staiger führt Terminal.app von Mac OS X standardmäßig eine Anmeldeshell anstelle einer Nicht-Anmeldeshell für jedes neue Terminalfenster aus und ruft statt .bashrc .bash_profile auf.

Er empfiehlt:

Meistens möchten Sie nicht zwei separate Konfigurationsdateien für Login- und Nicht-Login-Shells verwalten. Wenn Sie einen PATH festlegen, soll dieser auf beide angewendet werden. Sie können dies beheben, indem Sie .bashrc aus Ihrer .bash_profile-Datei beziehen und dann PATH und allgemeine Einstellungen in .bashrc einfügen.

Fügen Sie dazu .bash_profile die folgenden Zeilen hinzu:

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

Wenn Sie sich jetzt von einer Konsole aus bei Ihrem Computer anmelden, wird .bashrc aufgerufen.

Rose Perrone
quelle
2

Ein guter Ort zum Anschauen ist die Manpage von Bash. Hier ist eine Online-Version. Suchen Sie nach dem Abschnitt "INVOCATION".

PolyThinker
quelle
0

Ich habe Distributionen der Debian-Familie verwendet, die anscheinend ausgeführt werden .profile, aber nicht .bash_profile, während RHEL-Derivate .bash_profilezuvor ausgeführt wurden .profile.

Es scheint ein Chaos zu sein, wenn Sie Umgebungsvariablen einrichten müssen, um unter jedem Linux-Betriebssystem zu funktionieren.

Seismick
quelle