2009-01-06 5 views
130

Ich habe eine Reihe von verschiedenen * nix-basierten Systemen der Jahre verwendet, und es scheint, dass jeder Geschmack von Bash, den ich verwende, einen anderen Algorithmus hat, um zu entscheiden, welche Startup-Skripte ausgeführt werden sollen. Für Aufgaben wie das Einrichten von Umgebungsvariablen und Aliasen und das Drucken von Startmeldungen (z. B. MOTDs), welches Startskript ist der geeignete Ort, um dies zu tun?Was ist der Unterschied zwischen .bashrc, .bash_profile und .environment?

Was ist der Unterschied zwischen Putting Dinge in .bashrc, .bash_profile und .environment? Ich habe auch andere Dateien wie .login, .bash_login und .profile gesehen; Sind diese immer relevant? Was sind die Unterschiede, wenn man sich physisch anmeldet, sich per ssh anmeldet und ein neues Terminalfenster öffnet? Gibt es signifikante Unterschiede zwischen den Plattformen (einschließlich Mac OS X (und seiner Terminal.app) und Cygwin Bash)?

Antwort

73

Der Hauptunterschied zu Shell-Konfigurationsdateien besteht darin, dass einige nur von "Login" -Shells gelesen werden (zB wenn Sie sich von einem anderen Host anmelden oder sich an der Textkonsole eines lokalen Unix-Rechners anmelden). Dies sind die Namen, sagen wir .login oder .profile oder .zlogin (je nachdem, welche Shell Sie verwenden).

Dann haben Sie Konfigurationsdateien, die von "interaktiven" Shells gelesen werden (wie in denen, die mit einem Terminal verbunden sind (oder Pseudo-Terminal im Falle von zB einem Terminal-Emulator, der unter einem Windowing-System läuft) diejenigen, die mit Namen wie .bashrc, .tcshrc, .zshrc usw.

bash diese .bashrc in diesem verkompliziert wird nur durch eine Schale lesen, die beide interaktive und nicht-Login ist, so dass Sie die meisten Leute finden Am Ende erzählen sie ihre .bash_profile, um auchzu lesen 0 mit so etwas wie

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

Andere Schalen verhalten sich anders - zB mit zsh wird .zshrc für eine interaktive Shell immer 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 ist im Allgemeinen zwischen den Maschinen konsistent.

.profile ist einfach der Dateiname des Login-Skripts, der ursprünglich von /bin/sh verwendet wurde. bash, die im Allgemeinen abwärtskompatibel mit /bin/sh ist, wird .profile lesen, wenn eine existiert.

7

fand ich Informationen über Bashrc und Bash_profile here um es zusammenzufassen:

Bash_profile wird ausgeführt, wenn Sie Login. Sachen, die Sie dort hineinlegen, könnten Ihr PATH und andere wichtige Umgebungsvariablen sein.

.bashrc wird für Nicht-Login-Shells verwendet. Ich bin mir nicht sicher, was das bedeutet. Ich weiß, dass RedHat führt sie jedes Mal wenn Sie eine andere Shell (su an diesen Benutzer oder einfach Aufruf bash wieder) beginnen Sie könnten wollen dort Aliase setzen, aber wieder Ich bin nicht sicher, was das bedeutet. I ignorieren Sie es einfach selbst.

.profile ist das Äquivalent von .bash_profile für den Stamm. Ich denke der Name wird geändert, um andere Shells (csh, sh, tcsh) auch verwenden zu lassen. (Sie brauchen keine als Benutzer)

Es gibt auch .bash_logout, die führt bei, ja gut raten ... abmelden. Sie möchten vielleicht stoppen Deamons oder sogar machen ein wenig Hauswirtschaft. Sie können auch "löschen" dort hinzufügen, wenn Sie den Bildschirm löschen möchten, wenn Sie sich abmelden.

Auch gibt es eine vollständige Follow-up auf jeder der Konfigurationen here Dateien

Diese sind wahrscheinlich sogar distro. abhängig, nicht alle Distros wählen jedes configuraton mit ihnen haben, und einige haben sogar noch mehr. Aber wenn sie den gleichen Namen haben, enthalten sie normalerweise den gleichen Inhalt.

2

Ein guter Ort zum Betrachten ist die Manpage von bash. Here ist eine Online-Version. Suchen Sie nach "INVOCATION" Abschnitt.

9

Klassisch wird ~/.profile von Bourne Shell verwendet und wird wahrscheinlich von Bash als Legacy-Maßnahme unterstützt. Wiederum wurden ~/.login und ~/.cshrc von C Shell benutzt - ich bin mir nicht sicher, ob Bash sie überhaupt benutzt.

Die ~/.bash_profile würde einmal bei der Anmeldung verwendet werden. Das Skript ~/.bashrc wird jedes Mal gelesen, wenn eine Shell gestartet wird. Dies ist analog zu /.cshrc für C Shell.

Eine Konsequenz ist, dass Sachen in ~/.bashrc so leicht (minimal) wie möglich sein sollten, um den Overhead beim Starten einer Nicht-Login-Shell zu reduzieren.

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

48

Das ist einfach. Es 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 man gelesen werden Sie sich einloggen (so werden sie nicht ausgeführt wird, wenn lediglich xterm Anfahren, zum Beispiel). Es gibt andere Möglichkeiten zur Anmeldung. Zum Beispiel mit einem X-Display-Manager. Diese haben andere Möglichkeiten zum Lesen und Exportieren von Umgebungsvariablen zum Zeitpunkt der Anmeldung.

Lesen Sie auch das Kapitel INVOCATION in der Bedienungsanleitung. Es heißt "Die folgenden Abschnitte beschreiben, wie Bash seine Startup-Dateien ausführt.", ich denke, das ist ein Spot-on :) Es erklärt, was eine "interaktive" Shell ist auch.

Bash weiß nicht über .environment. Ich vermute, dass das eine Datei Ihrer Distribution ist, um Umgebungsvariablen unabhängig von der Shell zu setzen, die Sie fahren.

+1

Können Sie '/ etc/bashrc' hinzufügen, um die Antwort zu erfüllen? – Nemoden

4

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

Er empfiehlt:

Die meiste Zeit Sie wollen nicht zwei Dateien separaten Konfigurations für Login und Nicht-Login-Shells halten - wenn Sie einen Pfad festlegen, können Sie es gelten wollen beide. Sie können dies beheben, indem Sie .bashrc aus Ihrer .bash_profile-Datei auswählen und dann PATH und allgemeine Einstellungen in .bashrc einfügen.

Um dies zu tun, fügen Sie die folgenden Zeilen .bash_profile:

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

Wenn Sie jetzt Gerät an dem von einer Konsole anmelden Bashrc aufgerufen werden.

0

ich Debian-Familie distros verwendet haben, die .profile auszuführen erscheinen, aber nicht .bash_profile, während RHEL Derivate ausführen .bash_profile vor .profile.

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