Bash Manual sagt:
Bash versucht zu bestimmen, wann es mit seiner Standardeingabe ausgeführt wird, die mit einer Netzwerkverbindung verbunden ist, wie es vom Remote-Shell-Dämon rshd oder vom Secure-Shell-Dämon sshd ausgeführt wird. Wenn Bash feststellt, dass es auf diese Weise ausgeführt wird, liest es Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden und lesbar ist.
Diese Bash-Quellen ~/.bashrc
:
ssh user@host :
Aber diese Bash-Quellen ~/.bash_profile
:
ssh user@host
Ich sehe keinen Unterschied in diesen beiden Befehlen gemäß der Spezifikation. Ist stdin nicht in beiden Fällen mit einer Netzwerkverbindung verbunden?
Antworten:
Eine Login-Shell liest zuerst
/etc/profile
und dann~/.bash_profile
.Eine Nicht-Login-Shell liest von
/etc/bash.bashrc
und dann~/.bashrc
.Warum ist das so wichtig?
Wegen dieser Zeile in
man ssh
:Mit anderen Worten, wenn der Befehl ssh nur Optionen enthält (kein Befehl), wie zum Beispiel:
Es wird eine Login-Shell gestartet, eine Login-Shell liest
~/.bash_profile
.Ein ssh-Befehl, der einen Befehl hat , wie:
Wo der Befehl ist
:
(oder nichts tun).Es wird keine Login-Shell gestartet, daher
~/.bashrc
wird gelesen.Remote stdin
Die angegebene tty-Verbindung für / dev / stdin auf dem Remotecomputer ist möglicherweise eine tatsächliche tty oder etwas anderes.
Zum:
Was in einem TTY (keine Netzwerkverbindung) endet, wie die gestartete Bash es sieht.
Für eine SSH-Verbindung mit einem Befehl:
Die Liste der TTYs beginnt gleich, aber beachten Sie, dass / etc / profile nicht bezogen wurde.
Das sagt der Shell, dass die Verbindung eine Pipe ist (keine Netzwerkverbindung).
In beiden Testfällen kann die Shell also nicht wissen, dass die Verbindung von einem Netzwerk stammt, und liest daher nicht
~/.bashrc
(wenn wir nur über die Verbindung zu einem Netzwerk sprechen). Es liest ~ / .bashrc, aber aus einem anderen Grund.quelle
~/.bashrc
gelesen zu werden?stdin
mit einem Netzwerk verbunden ist . Warum nimmst du das an? (Antwort bearbeitet, bitte lesen).Sie fragen nach dem "Warum" und nicht nach dem "Wie", also werde ich versuchen, aus dieser Perspektive zu antworten. Das Folgende ist eine gute Begründung dafür, warum Dinge in der Vergangenheit passiert sind und wie sie heute passieren.
Der Grund für die Verwendung von zwei verschiedenen Startdateien ("profile" und "rc") war, dass in der Vergangenheit die Arbeitsweise auf einem Computer häufig war:
Loggen Sie sich von einem echten Terminal oder einer anderen Workstation aus ein und erhalten Sie eine Login-Shell . Diese Shell ruft die Umgebung für den Benutzer auf
/etc/profile
und~/.profile
richtet sie ein.Rufen Sie die Umgebung auf, in die der Benutzer eintreten möchte. Diese Umgebung könnte Xorg sein, aber in den meisten Fällen handelte es sich um einen Multiplexer wie GNU Screen.
Die Umgebung (zB GNU-Bildschirm) würde dann zusätzliche (Nicht-Login-) Shells aufrufen, die die Umgebung von der übergeordneten Login-Shell erben.
Das war der gemeinsame Weg in einer UNIX - Maschine der Protokollierung während der Zeit,
csh
undbash
entwickelt wurden. Daher wurde es als verschwenderisch~/.profile
empfunden, die die Umwelt vererbenden Muscheln noch einmal zu lesen .bash
dann~/.bashrc
für zusätzliche Konfiguration für diese nicht-Login-Shells hinzugefügt .csh
(undtcsh
) haben niemals irgendeine Art von "rc" -Datei für nicht angemeldete Shells hinzugefügt. Beachten Sie, dasscsh
/tcsh
keine Shells sind, die mit der Bourne-Shell (die Teil von POSIX ist) kompatibel sind, solange sie sich in einem Zustandbash
befindet. Eine andere bourne-kompatible Shellksh
fügte eine Umgebungsvariable (aufgerufenENV
) hinzu, die, falls definiert, als Ausführungsbefehlsdatei ("rc") für nicht angemeldete Benutzer verwendet wirdksh
.Ja, neuere Versionen von bourne-Shells haben die zusätzliche Konfigurationsdatei hinzugefügt, um Aliase und andere schnelle Optionen zu vereinfachen, die in den Shells vorhanden sind, die vom GNU-Bildschirm (oder ähnlichem) gemuxt werden, aber nicht in der Shell enthalten sind, die Sie beim ersten Aufrufen von erhalten Maschine.
Mit der Einführung von Grafik-Display-Managern (GDMs) wurde die Unterscheidung zwischen "profile" -Dateien und "rc" -Dateien bedeutungslos, da das GDM über eigene Initialisierungsdateien (z . B.
~/.xinit
und~/.xsession
) verfügen würde . Dann können Shells, die innerhalb des GDM angegeben werden, Anmelde- oder Nicht-Anmelde-Shells sein, abhängig von den Launen eines Benutzers, und der Fall, in dem eine Nicht-Anmelde-Shell immer ein übergeordnetes Element hat, das eine Anmelde-Shell ist, ist nicht mehr wahr.Extra
Eine meiner Lieblingstabellen zum Vergleich von Shell-Startdateien zeigt, wie bourne-Shell-kompatible Shells die
profile
Dateien verwenden, während andere Shells dies nicht tun . Dies liegt daran, dass in der Vergangenheit die ursprüngliche Shell (diejenige, die den Muxer gestartet hat) eine Borowski-kompatible Shell sein musste.quelle