Wenn Sie eine ausführbare Datei mit dem folgenden Inhalt erstellen und ausführen, wird sie selbst gelöscht.
Wie funktioniert das?
#!/bin/rm
shell-script
files
rm
executable
shebang
immibis
quelle
quelle
rm
, es geht um die#!
. Die Frage könnte umformuliert werden, wie ein ausführbares Skript mit einem#!
funktioniert.Antworten:
Der Kernel interpretiert die Zeile beginnend mit
#!
und verwendet sie zum Ausführen des Skripts. Dabei wird der Name des Skripts übergeben. Das endet also am LaufenDadurch wird das Skript gelöscht. (Wie Stéphane Chazelas weist darauf hin ,
scriptname
hier ist ausreichend , um das Skript zu finden - wenn Sie einen relativen oder absoluten Pfad angegeben, dass übergeben wird in , wie sie ist, sonst was Pfad gefunden wurdePATH
vorangestellt wird, einschließlich möglicherweise die emptry Zeichenfolge , wenn DuPATH
enthalten die und Das Skript befindet sich im aktuellen Verzeichnis. Sie können mit einem Echo-Skript herumspielen -#!/bin/echo
- um zu sehen, wie das funktioniert.)Wie Hobbs betonte, bedeutet dies, dass Ihr Skript tatsächlich ein
rm
Skript ist, keinbash
Skript - das letztere würde mit beginnen#!/bin/bash
.Weitere Informationen zur Funktionsweise unter Linux finden Sie unter Wie Programme ausgeführt werden . Die Kommentare zu diesem Artikel enthalten Details zu anderen Plattformen.
#!
wird Shebang genannt. Wenn Sie nach diesem Begriff suchen, werden Sie viele Informationen finden (danke an Aaron für den Vorschlag). Wie jlp hervorhob , wird es auch als "Pound Bang" oder "Hash Bang" bezeichnet (#
wird allgemein als "Pound" bezeichnet - in Ländern, die es nicht verwenden£
- oder als "Hash" und!
als "Bang"). ). Wikipedia hat mehr Infos.quelle
rm
der Pfad zum Skript, dh das erste Argument für den Systemaufruf execve (), den der Prozess ausführt. Wenn Sie das Skript ausgeführt./scriptname
haben, ist dies in der Regel der Ort, an dem das Skript gefunden wurde,./scriptname
und wenn Sie es aufgerufen habenscriptname
, der Ort, an/path/to/scriptname
dem/path/to
sich der Eintrag befindet$PATH
. Typischerweise wird es nur ,scriptname
wenn Sie die leere Zeichenfolge in$PATH
und Sie haben das Skript aufgerufen , wiescriptname
undscriptname
in dem aktuellen Verzeichnis ist.