Verwandte: Welcher Shell-Interpreter führt ein Skript ohne Schebang aus?
Das Skript hat kein shebang / hashbang / #!
line, einfach weil ein doppelter Gedankenstrich nicht ist #!
.
Das Skript wird jedoch von einer Shell ausgeführt (siehe oben verlinkte Fragen und Antworten). Wenn in dieser Shell -
ein gültiges Zeichen in einem Funktionsnamen ist, deklariert die Zeile eine Shell-Funktion, die aufgerufen --
wird und nichts tut (nun, sie wird ausgeführt :
, was nix tut ) und was nie aufgerufen wird.
Die Funktion in der gebräuchlicheren mehrzeiligen Notation (nur um zu verdeutlichen, wie sie aussieht, da ihr seltsamer Name die Tatsache verdeckt, dass es sich tatsächlich um eine Funktion handelt):
-- () {
:
}
Der einzige Zweck der Funktionsdefinition besteht darin, eine Zeile zu haben, die in einem Shell-Skript gültig ist und gleichzeitig einen gültigen SQL-Befehl (einen Kommentar) enthält. Diese Art von Code wird als Polyglot bezeichnet .
Nachdem die falsche Shell-Funktion deklariert wurde, ersetzt das Skript, wenn es von einem Shell-Skript-Interpreter ausgeführt wird exec
, die aktuelle Shell durch den aus der Ausführung resultierenden Prozess. Dies entspricht der db2 -txf "$0"
Verwendung db2 -txf
des Pfadnamens des Skripts über die Befehlszeile.
Dieser Trick würde wahrscheinlich nicht zuverlässig auf Systemen funktionieren, auf denen dash
oder auf denen andere ash
Shells, yash
die Bourne-Shell, ksh88
oder ksh93
verwendet werden /bin/sh
, da diese Shell keine Funktionen akzeptiert, deren Name Bindestriche enthält.
Auch verwandt:
Ich nehme an, dass das Folgende auch funktionieren würde (nicht wirklich getestet):
--() { exec db2 -txf "$0"; }; --