it-swarm.com.de

Unterschied zwischen .bashrc und .bash_profile

Was ist der Unterschied zwischen .bashrc und .bash_profile und welchen soll ich verwenden?

434
cfischer

Wenn Sie sich in ein Unix-System einloggen, startet das System normalerweise ein Programm für Sie. Dieses Programm ist eine Shell, d. H. Ein Programm zum Starten anderer Programme. Es ist eine Kommandozeilen-Shell: Sie starten ein anderes Programm, indem Sie dessen Namen eingeben. Die Standard-Shell, eine Bourne-Shell, liest Befehle aus ~/.profile, wenn sie als Anmeldeshell aufgerufen wird.

Bash ist eine Bourne-ähnliche Shell. Es liest Befehle aus ~/.bash_profile, wenn es als Anmeldeshell aufgerufen wird, und wenn diese Datei nicht existiert¹, versucht es stattdessen, ~/.profile zu lesen.

Sie können eine Shell jederzeit direkt aufrufen, indem Sie beispielsweise einen Terminalemulator in einer GUI-Umgebung starten. Wenn die Shell keine Login-Shell ist, liest sie keinen ~/.profile. Wenn Sie bash als interaktive Shell starten (d. H. Kein Skript ausführen), liest es ~/.bashrc (außer wenn es als Anmeldeshell aufgerufen wird, liest es nur ~/.bash_profile oder ~/.profile).

Deshalb:

  • ~/.profile ist der Ort, an dem Sie Inhalte ablegen können, die für Ihre gesamte Sitzung gelten, z. B. Programme, die Sie beim Anmelden starten möchten (jedoch keine grafischen Programme, die in eine andere Datei verschoben werden), und Umgebungsvariablendefinitionen.

  • ~/.bashrc ist der Ort, an dem Inhalte abgelegt werden, die nur für das Bashing selbst gelten, z. B. Alias- und Funktionsdefinitionen, Shell-Optionen und Einstellungen für Eingabeaufforderungen. (Sie können dort auch Tastenkombinationen einfügen, aber für Bash gehen sie normalerweise in ~/.inputrc.)

  • ~/.bash_profile kann anstelle von ~/.profile verwendet werden, wird jedoch nur von bash und nicht von einer anderen Shell gelesen. (Dies ist hauptsächlich dann von Belang, wenn Sie möchten, dass Ihre Initialisierungsdateien auf mehreren Computern funktionieren und Ihre Anmeldeshell nicht alle von ihnen unterstützt.) Dies ist ein logischer Ort, um ~/.bashrc einzuschließen, wenn die Shell interaktiv ist. Ich empfehle folgende Inhalte in ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

Bei modernen Unices gibt es eine zusätzliche Komplikation im Zusammenhang mit ~/.profile. Wenn Sie sich in einer grafischen Umgebung anmelden (d. H., Wenn das Programm, in das Sie Ihr Kennwort eingeben, im Grafikmodus ausgeführt wird), wird nicht automatisch eine Anmeldeshell mit dem Namen ~/.profile angezeigt. Abhängig von dem grafischen Anmeldeprogramm, dem Windows-Manager oder der Desktop-Umgebung, die Sie anschließend ausführen, und der Konfiguration dieser Programme durch Ihre Distribution kann Ihr ~/.profile gelesen werden oder auch nicht. Wenn dies nicht der Fall ist, gibt es normalerweise einen anderen Ort, an dem Sie Umgebungsvariablen und Programme definieren können, die beim Anmelden gestartet werden sollen. Leider gibt es keinen Standardspeicherort.

Beachten Sie, dass hier und da Empfehlungen angezeigt werden, entweder Definitionen von Umgebungsvariablen in ~/.bashrc aufzunehmen oder Anmelde-Shells in Terminals immer zu starten. Beides sind schlechte Ideen. Das häufigste Problem bei diesen beiden Ideen ist, dass Ihre Umgebungsvariablen nur in Programmen festgelegt werden, die über das Terminal gestartet werden, nicht in Programmen, die direkt mit einem Symbol oder einem Menü oder einer Tastenkombination gestartet werden.

¹ Der Vollständigkeit halber auf Anfrage: Wenn .bash_profile nicht existiert, versucht bash auch .bash_login, bevor auf .profile zurückgegriffen wird. Fühlen Sie sich frei zu vergessen, dass es existiert.

503
Gilles

Aus diesem kurzen Artikel

Der Bash-Manpage zufolge wird .bash_profile für Anmeldeshells ausgeführt, während .bashrc für interaktive Shells ohne Anmeldung ausgeführt wird.

Was ist eine Login- oder Nicht-Login-Shell?

Wenn Sie sich über die Konsole anmelden (z. B. Benutzername und Kennwort eingeben), entweder während des Startvorgangs direkt am Computer oder remote über ssh: .bash_profile, werden die Einstellungen vor der ersten Eingabeaufforderung vorgenommen.

Wenn Sie sich jedoch bereits bei Ihrem Computer angemeldet haben und ein neues Terminalfenster (xterm) in Gnome oder KDE öffnen, wird .bashrc vor dem Fensterbefehl Eingabeaufforderung ausgeführt. .bashrc wird auch ausgeführt, wenn Sie eine neue Bash-Instanz durch Eingabe von/bin/bash in einem Terminal starten.

52
Jarvin

Früher, als Pseudo-Tty nicht pseudo und tatsächlich gut getippt waren und Modems so langsam auf UNIXes zugegriffen haben, dass Sie jeden Buchstaben auf Ihrem Bildschirm sehen konnten, war Effizienz von höchster Wichtigkeit. Um die Effizienz zu verbessern, hatten Sie das Konzept eines Hauptanmeldefensters und aller anderen Fenster, die Sie früher verwendet haben. In Ihrem Hauptfenster möchten Sie Benachrichtigungen zu neuen E-Mails erhalten und möglicherweise andere Programme im Hintergrund ausführen.

Um dies zu unterstützen, haben Shells eine Datei .profile speziell für 'Login-Shells' bereitgestellt. Dies würde das Besondere tun, einmal eine Sitzung einzurichten. Bash hat dies etwas erweitert, um zuerst nach .bash_profile und dann nach .profile zu schauen. Auf diese Weise können Sie nur Bash-Elemente einfügen (damit Bourne Shell usw., die auch nach .profile schauen, nicht durcheinander gebracht werden). Andere Shells, die sich nicht anmelden, geben nur die RC-Datei .bashrc (oder .kshrc usw.) aus.

Das ist jetzt ein bisschen wie ein Anachronismus. Sie melden sich nicht so oft bei einer Haupt-Shell an wie bei einem GUI-Fenstermanager. Es gibt kein anderes Hauptfenster als jedes andere.

Mein Vorschlag - mach dir keine Sorgen um diesen Unterschied, er basiert auf einem älteren Unix-Stil. Beseitigen Sie den Unterschied in Ihren Dateien. Der gesamte Inhalt von .bash_profile sollte sein:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

Und setzen Sie alles, was Sie wirklich wollen, in .bashrc

Denken Sie daran, dass .bashrc für alle Shells (interaktiv und nicht interaktiv) bereitgestellt wird. Sie können das Sourcing für nicht interaktive Shells kurzschließen, indem Sie diesen Code oben in .bashrc einfügen:

[[ $- != *i* ]] && return

35
Rich Homolka

Schauen Sie sich diesen ausgezeichneten Blog-Beitrag von ShreevatsaR an . Hier ist ein Auszug, aber gehen Sie zum Blog-Beitrag, der eine Erklärung für Begriffe wie "Login-Shell", ein Flussdiagramm und eine ähnliche Tabelle für Zsh enthält.

Für Bash funktionieren sie wie folgt. Lesen Sie die entsprechende Spalte. Führt A, dann B, dann C usw. aus. B1, B2, B3 bedeutet, dass nur die erste der gefundenen Dateien ausgeführt wird.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+
17
Flimm

EIN BESSERER KOMMENTAR FÜR DAS HEAD VON/ETC/PROFILE

Aufbauend auf der großartigen Antwort von Flimm oben habe ich diesen neuen Kommentar an der Spitze meines Debian/etc/profile eingefügt, (Sie müssen ihn möglicherweise für Ihre Distribution anpassen.) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

Und dieser Hinweis am Kopf jeder der anderen Setup-Dateien, um darauf zu verweisen:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

Bemerkenswert finde ich, dass Debians/etc/profile standardmäßig /etc/bash.bashrc (also /etc/bash.bashrc) enthält. So lesen Anmeldeskripte beide/etc-Dateien, während Nicht-Anmeldeskripte nur bash.bashrc lesen.

Zu beachten ist auch, dass /etc/bash.bashrc so eingestellt ist, dass es nichts tut, wenn es nicht interaktiv ausgeführt wird. Diese beiden Dateien sind also nur für interaktive Skripte gedacht.

4
Elliptical view