Unterschied zwischen .bashrc und .bash_profile

Sep 02 2010

Was ist der Unterschied zwischen .bashrcund .bash_profileund welchen soll ich verwenden?

Antworten

567 Gilles'SO-stopbeingevil' Sep 03 2010 at 02:23

Wenn Sie sich bei einem Unix-System anmelden, startet das System normalerweise ein Programm für Sie. Dieses Programm ist eine Shell, dh ein Programm zum Starten anderer Programme. Es ist eine Befehlszeilen-Shell: Sie starten ein anderes Programm, indem Sie dessen Namen eingeben. Die Standard-Shell, eine Bourne-Shell, liest Befehle ab dem ~/.profileZeitpunkt, an dem sie als Anmeldeshell aufgerufen wird.

Bash ist eine Bourne-ähnliche Hülle. Es liest Befehle ab dem ~/.bash_profileZeitpunkt, an dem es als Anmeldeshell aufgerufen wird, und wenn diese Datei nicht vorhanden ist¹, versucht es ~/.profilestattdessen 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, wird sie nicht gelesen ~/.profile. Wenn Sie bash als interaktive Shell starten (dh kein Skript ausführen), wird es gelesen ~/.bashrc(außer wenn es als Login-Shell aufgerufen wird, liest es nur ~/.bash_profileoder ~/.profile.

Deshalb:

  • ~/.profile Hier können Sie Dinge ablegen, die für Ihre gesamte Sitzung gelten, z. B. Programme, die Sie beim Anmelden starten möchten (aber keine grafischen Programme, sie werden in eine andere Datei verschoben), und Definitionen von Umgebungsvariablen.

  • ~/.bashrcHier können Sie Inhalte ablegen, die nur für Bash selbst gelten, z. B. Alias- und Funktionsdefinitionen, Shell-Optionen und Einstellungen für Eingabeaufforderungen. (Sie können dort auch Schlüsselbindungen anbringen, aber für Bash werden sie normalerweise verwendet ~/.inputrc.)

  • ~/.bash_profilekann anstelle von verwendet werden ~/.profile, wird jedoch nur von bash gelesen, nicht von einer anderen Shell. (Dies ist vor allem dann ein Problem, wenn Ihre Initialisierungsdateien auf mehreren Computern funktionieren sollen und Ihre Anmeldeshell nicht auf allen Computern basiert.) Dies ist ein logischer Ort, den Sie einbeziehen sollten, ~/.bashrcwenn 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 ~/.profile. Wenn Sie sich in einer grafischen Umgebung anmelden (dh wenn das Programm, in das Sie Ihr Kennwort eingeben, im Grafikmodus ausgeführt wird), wird nicht automatisch eine Anmeldeshell angezeigt, die lautet ~/.profile. Abhängig vom grafischen Anmeldeprogramm, dem Fenstermanager oder der Desktopumgebung, die Sie anschließend ausführen, und davon, wie Ihre Distribution diese Programme konfiguriert hat, können Sie ~/.profilemöglicherweise gelesen werden oder 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 möglicherweise Empfehlungen angezeigt werden, um entweder Umgebungsvariablendefinitionen einzufügen ~/.bashrcoder Anmeldeshells immer in Terminals zu starten. Beides sind schlechte Ideen. Das häufigste Problem bei 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, einem Menü oder einer Tastenkombination gestartet werden.

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

58 Jarvin Sep 02 2010 at 21:54

Aus diesem kurzen Artikel

Laut der Bash-Manpage wird .bash_profile für Login-Shells ausgeführt, während .bashrc für interaktive Nicht-Login-Shells 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 beim Booten physisch am Computer sitzen oder remote über ssh: .bash_profile ausgeführt wird, um die Dinge vor der ersten Eingabeaufforderung zu konfigurieren.

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

40 RichHomolka Sep 03 2010 at 01:10

Früher, als Pseudo-Tty nicht pseudo und tatsächlich gut getippt waren und auf UNIXes von Modems zugegriffen wurde, die so langsam waren, dass jeder Buchstabe auf Ihrem Bildschirm gedruckt werden konnte, war die Effizienz von größter Bedeutung. Um die Effizienz etwas zu verbessern, hatten Sie ein Konzept für ein Hauptanmeldefenster und alle anderen Fenster, mit denen Sie tatsächlich gearbeitet haben. In Ihrem Hauptfenster möchten Sie Benachrichtigungen zu neuen E-Mails erhalten und möglicherweise einige andere Programme im Hintergrund ausführen.

Um dies zu unterstützen, haben Shells eine Datei .profilespeziell für "Login-Shells" bezogen. Dies würde das Besondere tun, sobald eine Sitzung eingerichtet ist. Bash hat dies etwas erweitert, um zuerst .bash_profile vor .profile zu betrachten. Auf diese Weise können Sie nur Bash-Dinge hineinstecken (damit sie die Bourne-Shell usw. nicht vermasseln, die auch .profile betrachtet). Andere Shells, die nicht angemeldet sind, geben nur die RC-Datei .bashrc (oder .kshrc usw.) an.

Dies ist jetzt ein bisschen 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 Fenster.

Mein Vorschlag - mach dir keine Sorgen um diesen Unterschied, er basiert auf einem älteren Stil der Verwendung von Unix. 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 tatsächlich einstellen möchten, in .bashrc

Denken Sie daran, dass .bashrc für alle Shells verwendet wird, interaktiv und nicht interaktiv. Sie können die Beschaffung für nicht interaktive Shells kurzschließen, indem Sie diesen Code oben in .bashrc einfügen:

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

20 Flimm Jul 13 2016 at 15:53

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 durch. 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      |           |      |
+----------------+-----------+-----------+------+
7 Ellipticalview Oct 19 2016 at 01:13

EIN BESSERER KOMMENTAR FÜR DEN KOPF VON / ETC / PROFIL

Aufbauend auf Flimm große Antwort oben, eingefügt ich diesen Kommentar an der Spitze meines Debian /etc/profile, (man könnte es für Ihre Distribution anpassen müssen.) :

# 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 Anfang jeder der anderen Setup-Dateien, um darauf zu verweisen:

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

Bemerkenswert ist meiner Meinung nach, dass Debian /etc/profilestandardmäßig Quellen enthält (enthält) /etc/bash.bashrc(das ist, wenn es /etc/bash.bashrcexistiert). Anmeldeskripte lesen also beide /etcDateien, während Nicht-Anmeldeskripte nur bash.bashrc lesen.

Bemerkenswert ist auch, dass /etc/bash.bashrcnichts getan wird, wenn es nicht interaktiv ausgeführt wird. Diese beiden Dateien sind also nur für interaktive Skripte gedacht.

5 MarcH Jun 25 2019 at 05:55

Die Konfigurationslogik von bash's selbst ist nicht verrückt kompliziert und wird in anderen Antworten auf dieser Seite, bei Serverfehlern und in vielen Blogs erklärt. Das Problem ist jedoch, was die Linux-Distributionen aus Bash machen . Ich meine die komplexen und verschiedenen Arten, wie sie Bash standardmäßig konfigurieren.http://mywiki.wooledge.org/DotFileserwähnt kurz einige dieser Macken. Hier ist ein Beispiel-Trace für Fedora 29, der zeigt, welche Dateien welche anderen Dateien und in welcher Reihenfolge für ein sehr einfaches Szenario beziehen: Remote-Verbindung mit ssh herstellen und dann eine weitere Subshell starten:

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      |    ├─ /etc/profile.d/*.sh
      |    ├─ /etc/profile.d/sh.local
      |    └─ /etc/bashrc
      ├── ~/.bash_profile
      |    └─ ~/.bashrc
      |          └─ /etc/bashrc
      |
      |
      └─ $ bash  # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

Fedoras komplexeste Logik ist in /etc/bashrc. Wie oben zu sehen /etc/bashrcist, weiß eine Datei-Bash selbst nichts davon, ich meine nicht direkt. Fedoras /etc/bashrcTests, ob:

  • Es wird von einer Login-Shell bezogen.
  • es wird von einer interaktiven Shell bezogen,
  • es wurde bereits beschafft

... und macht dann ganz andere Dinge, abhängig davon.

Wenn Sie denken, dass Sie sich an das obige Diagramm erinnern können, ist es schade, weil es bei weitem nicht ausreicht: Dieses Diagramm beschreibt nur ein Szenario. Beim Ausführen nicht interaktiver Skripte oder beim Starten einer grafischen Sitzung passieren etwas andere Dinge. Ich habe weggelassen ~/.profile. Ich habe bash_completionSkripte weggelassen . Aus Gründen der Abwärtskompatibilität ändert das Aufrufen von bash as /bin/shanstelle des /bin/bashVerhaltens. Was ist mit zsh und anderen Muscheln? Und natürlich machen verschiedene Linux-Distributionen die Dinge anders, zum Beispiel Debian und Ubuntu kommen mit einer nicht standardmäßigen Version von bas h, es hat Debian-spezifische Anpassungen. Es sucht insbesondere nach einer ungewöhnlichen Datei : /etc/bash.bashrc. Selbst wenn Sie sich an eine einzelne Linux-Distribution halten, entwickelt sich diese wahrscheinlich im Laufe der Zeit weiter. Warten Sie: Wir haben noch nicht einmal macOS, FreeBSD, ... berührt. Lassen Sie uns abschließend einen Gedanken für Benutzer haben, die sich mit den noch kreativeren Methoden beschäftigen, mit denen ihre Administratoren das System konfiguriert haben, das sie verwenden müssen.

Wie der unendliche Strom von Diskussionen zu diesem Thema zeigt, ist es eine verlorene Sache. Solange Sie nur neue Werte hinzufügen möchten, reicht in der Regel ein gewisser "Versuch und Irrtum" aus. Der wahre Spaß beginnt, wenn Sie in einer (Benutzer-) Datei etwas ändern möchten, das bereits in einer anderen (in / etc) definiert ist. Seien Sie dann bereit, einige Zeit damit zu verbringen, eine Lösung zu entwickeln, die niemals portabel sein wird.

Für ein letztes bisschen Spaß hier das "Quelldiagramm" für dasselbe einfache Szenario unter Clear Linux ab Juni 2019:

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      |    ├─ /usr/share/defaults/etc/profile.d/*
      |    ├─ /etc/profile.d/*
      |    └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─  $ bash   # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           |      ├─ /usr/share/defaults/etc/profile
           |      |    ├─ /usr/share/defaults/etc/profile.d/*
           |      |    ├─ /etc/profile.d/*
           |      |    └─ /etc/profile
           |      └─ /etc/profile
           └─ ~/.bashrc