Ich habe aus Versehen ein Bash-Skript mit $!
anstelle von #!
gestartet und ein sehr merkwürdiges Verhalten bekommen. Ich versuche herauszufinden, was passiert ist.
Wenn Sie dieses Skript versuchen:
%Vor%Sie erhalten folgendes Verhalten:
%Vor%Es sieht also so aus:
Was ist los? Wie läuft überhaupt etwas? Ohne #!
, wie weiß die Shell, dass bash
das Skript interpretiert?
Offensichtlich ist dies eine Frage, die "meine Neugier befriedigt" und nicht "mein Problem lösen". Googlen bringt nicht viel, wahrscheinlich weil #!
und $!
in Abfragen den Google-Bot nicht glücklich machen.
$ something ist eine Erweiterung des Parameters ("variable") , aber $!
gibt insbesondere einen Wert zurück, der in Ihrem Skript nicht festgelegt ist, sodass er erweitert wird als Nulllänge Zeichenfolge.
Daher ist Ihr Skript, Sie haben Recht, das Äquivalent von:
%Vor%Die magische Shebang-Nummer ist ein altes Feature von Unix, aber die Shell ist noch älter. Eine Textdatei mit dem Ausführungsbit, das der Kernel nicht ausführen kann (weil es nicht tatsächlich kompiliert wurde), wird von einer Subshell ausgeführt. Das heißt, die Shell führt absichtlich eine andere Shell aus und übergibt den Pfadnamen als Parameter. So wurden Befehle, die als Shell-Skripte geschrieben wurden, ausgeführt, bevor Shebang erfunden wurde, und es ist immer noch im Code vorhanden.
dollar-bang erhält die PID des letzten Hintergrundprozesses.
Ссылка (Suche nach '$!')
Erweitern Sie ein bisschen auf @ DigitalRoss Antwort :.
Ein ausführbares Skript ohne #!
in der ersten Zeile wird von /bin/sh
ausgeführt - auch wenn Sie es von bash
(oder tcsh
) ausführen. Dies ist keine Shell-Funktionalität, es ist im Kernel.
Wenn Sie also Ihr Skript ausgeführt haben, wurde es von /bin/sh
ausgeführt (was bedeutet, dass es auf den meisten Systemen keine bash-spezifischen Funktionen verwenden kann), $!
expanded to nothing (weil diese Shell hat keine Hintergrundprozesse gestartet), und die erste Zeile ruft eine interaktive /bin/bash
-Shell auf. Dann verlassen Sie diese interaktive Shell, und Ihr Skript führt die echo Hello world!
-Zeile aus und wird beendet, wodurch Sie wieder in Ihre ursprüngliche Shell zurückkehren.
Wenn Sie beispielsweise echo Hello world!
in echo $BASH_VERSION
ändern, werden Sie feststellen, dass nichts gedruckt wird. Wenn Sie history
von der aufgerufenen interaktiven Bash-Shell eingeben, wird nichts angezeigt .
Tags und Links bash