Warum löscht sich das folgende Skript von selbst?

84

Wenn Sie eine ausführbare Datei mit dem folgenden Inhalt erstellen und ausführen, wird sie selbst gelöscht.
Wie funktioniert das?

#!/bin/rm
immibis
quelle
4
Related
Digital Trauma
@DigitalTrauma Heh, das war mein erster Gedanke, als ich das sah.
Katze
es geht nicht um rm, es geht um die #!. Die Frage könnte umformuliert werden, wie ein ausführbares Skript mit einem #!funktioniert.
njzk2
1
Wie haben Sie es geschafft, darauf zu stoßen?
user1717828
1
Das ist definitiv eine epische Frage. Ich bedaure, dass ich es nur einmal stimmen kann.
Danila Kiver

Antworten:

112

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 Laufen

/bin/rm scriptname

Dadurch wird das Skript gelöscht. (Wie Stéphane Chazelas weist darauf hin , scriptnamehier 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 wurde PATHvorangestellt wird, einschließlich möglicherweise die emptry Zeichenfolge , wenn Du PATHenthalten 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 rmSkript ist, kein bashSkript - 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.

Stephen Kitt
quelle
9
Andere Namen für "#!" Sie könnten hören, sind "Pound Bang" und "Hash Bang". Siehe en.wikipedia.org/wiki/Shebang_(Unix) für Details.
jlp
@jlp Pfundknall? Ist das wie "Bang for your Buck"? Heh ...
Katze
Erinnert mich an ol‘ Crunchbang
Xen2050
1
Technisch gesehen ist das Argument to rmder Pfad zum Skript, dh das erste Argument für den Systemaufruf execve (), den der Prozess ausführt. Wenn Sie das Skript ausgeführt ./scriptnamehaben, ist dies in der Regel der Ort, an dem das Skript gefunden wurde, ./scriptnameund wenn Sie es aufgerufen haben scriptname, der Ort, an /path/to/scriptnamedem /path/tosich der Eintrag befindet $PATH. Typischerweise wird es nur , scriptnamewenn Sie die leere Zeichenfolge in $PATHund Sie haben das Skript aufgerufen , wie scriptnameund scriptnamein dem aktuellen Verzeichnis ist.
Stéphane Chazelas