Also dachte ich, ich hätte ein gutes Verständnis dafür, führte aber nur einen Test durch (als Reaktion auf ein Gespräch, bei dem ich mit jemandem nicht einverstanden war) und stellte fest, dass mein Verständnis fehlerhaft ist ...
So detailliert wie möglich , was genau passiert , wenn ich eine Datei in meinem Shell ausführen? Was ich meine ist, wenn ich Folgendes eintippe : ./somefile some arguments
in meine Shell und somefile
die Eingabetaste drücke (und in der CWD vorhanden ist und ich über Lese- und Ausführungsberechtigungen verfüge somefile
), was passiert dann unter der Haube?
Ich dachte die Antwort wäre:
- Die Shell ruft syscall an
exec
und leitet den Pfad ansomefile
- Der Kernel überprüft
somefile
und überprüft die magische Nummer der Datei, um festzustellen, ob es sich um ein Format handelt, das der Prozessor verarbeiten kann - Wenn die magische Zahl angibt, dass die Datei ein Format hat, das der Prozessor ausführen kann, dann
- ein neuer Prozess wird angelegt (mit einem Eintrag in der Prozesstabelle)
somefile
wird gelesen / in den Speicher abgebildet. Ein Stack wird erstellt und die Ausführung springt zum Einstiegspunkt des Codes vonsomefile
, wobeiARGV
ein Array der Parameter (achar**
,["some","arguments"]
) initialisiert wird.
- Wenn die magische Zahl ein Shebang ist, wird
exec()
ein neuer Prozess wie oben beschrieben erzeugt. Als ausführbare Datei wird jedoch der Interpreter verwendet, auf den der Shebang (z. B./bin/bash
oder/bin/perl
) verweist, undsomefile
an den er weitergeleitet wirdSTDIN
- Wenn die Datei keine gültige magische Nummer hat, tritt ein Fehler wie "Ungültige Datei (falsche magische Nummer): Exec-Formatfehler" auf
Allerdings hat mir jemand gesagt, dass die Shell versucht, die Befehle auszuführen, wenn es sich bei der Datei um reinen Text handelt (als hätte ich etwas eingegeben) bash somefile
). Ich habe das nicht geglaubt, aber ich habe es einfach versucht, und es war richtig. Ich habe also offensichtlich einige Missverständnisse darüber, was hier tatsächlich passiert, und möchte die Mechanik verstehen.
Was genau passiert, wenn ich eine Datei in meiner Shell ausführe? (Soweit Detail zumutbar ist ...)
source somefile
unterscheidet sich jedoch stark von einem neuen Prozess, der von einem anderen gespalten wird ./somefile
.
./somefile
dies dazu führen würde, dass Bash die Befehle ausführt, somefile
wenn die Datei keine magische Nummer hätte. Ich dachte, es würde nur einen Fehler anzeigen, und stattdessen scheint es effektivsource somefile
somefile
es sich um eine Textdatei handelt, eine neue Shell erstellt wird, wenn ich versuche, sie auszuführen. Eine Datei echo $$
verhält sich anders, wenn ich sie im Vergleich zur Quelle ausführe.