Warum nicht in .bashrc / .bash_profile?

22

Einfache Abfrage: Ich habe gerade festgestellt, dass ich noch nie einen Shebang über einem .bashrcSkript gesehen habe, was mich zu der Annahme veranlasst, dass das System die Standard-Shell verwendet, um sie beim Anmelden zu entschlüsseln ( ${SHELL}). Ich denke über Gründe nach, warum dies der Fall ist, dh, es wird als schlechte Angewohnheit angesehen, etwas anderes als die Standard-Shell zum Ausführen des Anmeldeskripts zu verwenden.

amphibient
quelle
1
Es gibt einen Grund, warum es bash rc genannt wird ...
Ajedi32

Antworten:

28

.bashrcund .bash_profilesind keine Skripte. Es handelt sich um eine Konfigurationsdatei, die bei jeder bashAusführung auf zwei Arten abgerufen wird:

  • interaktiv
  • Anmeldung

Der Abschnitt INVOCATION auf der bash-Manpage ist relevant.

Eine Login-Shell ist eine Shell, deren erstes Zeichen des Arguments Null ein ist -, oder eine Shell , die mit der --loginOption gestartet wurde .

Eine interaktive Shell wird ohne Nicht-Options-Argumente und ohne die -cOption gestartet, deren Standardeingabe und Fehler beide mit Terminals verbunden sind (wie von festgelegt isatty(3))oder mit der -i Option gestartet) . PS1 wird festgelegt und $-enthält iif bashist interaktiv und ermöglicht ein Shell-Skript oder eine Startdatei, um diesen Status zu testen.

In den folgenden Absätzen wird beschrieben, wie bashdie Startdateien ausgeführt werden. Wenn eine der Dateien existiert, aber nicht gelesen werden kann, meldet bash einen Fehler. Tilden werden in Dateinamen erweitert , wie nachstehend unter Tilde Expansion im EXPANSION Abschnitt.

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der --loginOption aufgerufen wird , werden zuerst Befehle aus der Datei gelesen und ausgeführt /etc/profile, sofern diese Datei vorhanden ist. Nachdem die Datei zu lesen, sucht er nach ~/.bash_profile, ~/.bash_loginund ~/.profilein dieser Reihenfolge, und liest und die Befehle ausführt , von der ersten , die lesbar existiert und ist. Die --noprofileOption kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu unterbinden.

Wenn eine Anmeldeshell beendet wird, liest bash Befehle aus der Datei und führt sie aus ~/.bash_logout, sofern sie vorhanden ist.

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest bash Befehle und führt sie aus ~/.bashrc, sofern diese Datei vorhanden ist. Dies kann durch Verwendung der --norcOption verhindert werden. Die --rcfile file Option erzwingt, dass Bash Befehle aus der Datei liest und ausführt, anstatt ~/.bashrc.

Sie können steuern, wann sie über die Befehlszeilenoptionen --norcund geladen werden --noprofile. Sie können auch die Position überschreiben, an der sie mithilfe des --rcfileSchalters geladen werden .

Wie bereits erwähnt, können Sie nachahmen, wie diese Dateien mithilfe des source <file>Befehls oder mithilfe des . <file>Befehls geladen werden .

Stellen Sie sich diese Funktionalität am besten wie folgt vor:

  1. Bash startet mit einer nackten Umgebung
  2. bash öffnet dann eine dieser Dateien (abhängig davon, wie sie als interaktiv oder als Login aufgerufen wurden) und dann ...
  3. ... Zeile für Zeile führt jeden Befehl in der Datei aus ...
  4. Wenn der Vorgang abgeschlossen ist, wird die Steuerung in Form einer Eingabeaufforderung ausgeführt und auf die Eingabe gewartet

Methoden zum Aufrufen

Dieses Thema scheint von Zeit zu Zeit zu erscheinen. Hier finden Sie eine kurze Übersicht über die verschiedenen Aufrufmöglichkeiten bashund deren Auswirkungen. HINWEIS: Ich habe die Meldungen "sourced $ HOME / .bashrc" und "sourced" hinzugefügt $ HOME / .bash_profile "in die entsprechenden Dateien.

grundlegende Anrufe

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -or- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    HINWEIS: Beachten Sie, dass der -cSwitch keine der Dateien als Quelle hat!

Deaktivieren des Lesens von Konfigurationsdateien

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash - noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -or- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Esoterischere Wege, Bash zu nennen

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash -norc -rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Diese sind gescheitert

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Es gibt wahrscheinlich mehr, aber Sie verstehen es, hoffentlich ....

Was sonst?

Wenn Sie von diesem Thema so begeistert sind, dass Sie mehr darüber lesen / erforschen möchten, empfehle ich Ihnen dringend, sich das Handbuch für Bash-Anfänger anzuschauen, insbesondere Abschnitt 1.2. Vorteile der Bourne Again SHell . Die verschiedenen Unterabschnitte unter "1.2.2.1. Aufruf" bis "1.2.2.3.3. Verhalten der interaktiven Shell" erläutern die geringen Unterschiede zwischen den verschiedenen Möglichkeiten, die Sie aufrufen können bash.

slm
quelle
@amphibient - tut mir leid, dass es ein wenig außer Kontrolle geraten ist, hoffentlich werden die Leute seinen Wert zu schätzen wissen und ihn nicht mit Abstimmungen bestrafen. Mit diesem hier können wir uns jetzt auf eine andere Antwort beziehen. 8-). Ich dachte darüber nach, einen Tisch zu machen, um dies zu zeigen, aber das wäre verrückt gewesen .
SLM
Haben diese tatsächlich getestet? Ich habe einmal versucht zu verfolgen, was meine Bash in Squeeze macht, und es hat sich nicht so verhalten, wie im Handbuch vorgeschlagen
Bananguin
@ Bananguin - jeder dieser Befehle wurde von mir ausgeführt und das ist die Ausgabe, die unter den Befehlen erzeugt wurde. Das einzig mögliche "Ding" bei meinem Setup könnte sein, dass mein .bash_profileeine Zeile enthält, um die Quelle zu bestimmen .bashrc. Aber ich glaube, das ist sehr typisch für Setups.
SLM
Dies könnte subjektiv sein, aber ich würde das nicht sagen .bashrcund es .bash_profilesind keine Skripte . IMHO handelt es sich um spezielle Skripte, die implizit während der Bash-Initialisierung oder explizit bei der Anwendung ihrer Änderungen bereitgestellt werden. Sie konfigurieren nicht nur die Bash-Umgebung (Variablen, Funktionen, Aliase ...) wie von Konfigurationsdateien erwartet. Sie können alle Aktionen ausführen, die in allgemeinen Skripten ausgeführt werden. Zum Beispiel können sie verschiedene Aktionen wie Hintergrundaufgaben starten, Protokolle schreiben, einige Programme initialisieren usw. Trotzdem vielen Dank für die detaillierte Zusammenfassung!
Pabouk
Diese Antwort ist noch besser als alle Antworten hier stackoverflow.com/questions/415403/… !
Jacob Tomlinson
13

.bashrcSkripte werden nur von bashselbst ausgeführt. Sie sind nicht freistehend und nicht dazu gedacht, execvom System unterdrückt zu werden. (Tatsächlich sind sie im Allgemeinen nicht als ausführbar gekennzeichnet und, wie Sie sagen, haben sie keine Shebang-Zeile.)

Solche Skripte sollen sourced sein, da sie im Allgemeinen ( $PATHzum Beispiel) Umgebungsvariablen ändern , von denen erwartet wird, dass sie nach Beendigung des Skripts bestehen bleiben. Es wäre also wirklich sinnlos zu versuchen, eine in einer Subshell auszuführen.

rici
quelle
5

Beachten Sie zusätzlich zu den anderen Antworten, dass Ihnen nichts verbietet, wenn Sie dies wünschen, einen Shebang an den Anfang dieser Konfigurationsdateien zu setzen.

Das würde der Shell-Beschaffung nicht schaden, da der Shebang wie ein regulärer Kommentar verarbeitet, dh ignoriert wird.

Dies kann Editoren helfen, die mithilfe der Syntaxhervorhebung herausfinden, welche Programmiersprache in der Datei verwendet wird.

Beachten Sie, dass einige Editoren wie vimalternative Methoden wie Modelines für letztere bereitstellen. Sie können also immer Modenzeilen an das Ende von ~/.bashrcund ~/.bash_profilewie folgt setzen:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
jlliagre
quelle
1
Die akzeptierte Antwort von @slm oben ist großartig, aber das ist es, wonach ich gesucht habe, um .bash_profileauf Empfehlung von ShellCheck einen Shebang zu Beginn meiner Antwort hinzuzufügen.
jlucktay
1

Ich habe das überall gelesen, weiß nicht wo genau, aber es ist wahr

Das Bash-Handbuch ist in diesem Bereich etwas verwirrend, aber Bash führt ~ / .bash_profile nicht wie ein Shell-Skript aus. Es liest die Datei und führt dann die darin enthaltenen Befehle aus (Sie können etwas Ähnliches tun, indem Sie source ~ / .bash_profile ausführen).

Rahul Patil
quelle