Powiązane: Który interpreter powłoki uruchamia skrypt bez shebang?
Skrypt nie ma #!
linii shebang / hashbang / line, po prostu dlatego, że nie ma podwójnego myślnika #!
.
Jednak skrypt zostanie wykonany przez powłokę (patrz wyżej powiązane pytanie i odpowiedzi), aw tej powłoce, jeśli -
jest poprawnym znakiem w nazwie funkcji, linia deklaruje wywołaną funkcję powłoki --
, która nic nie robi (cóż, działa :
, który nic nie robi ) i który nigdy nie jest nazywany.
Funkcja, w bardziej powszechnej notacji wieloliniowej (aby po prostu pokazać, jak to wygląda, ponieważ jej dziwna nazwa niejasno tłumi fakt, że w rzeczywistości jest funkcją):
-- () {
:
}
Jedynym celem definicji funkcji jest posiadanie wiersza, który jest poprawny w skrypcie powłoki, a jednocześnie poprawne polecenie SQL (komentarz). Ten rodzaj kodu nazywa się poliglotą .
Po zadeklarowaniu fałszywej funkcji powłoki skrypt wykonywany przez interpreter skryptu powłoki exec
zastępuje bieżącą powłokę procesem wynikającym z uruchomienia db2 -txf "$0"
, który byłby taki sam, jak użycie db2 -txf
nazwy ścieżki skryptu z wiersza poleceń.
Ta sztuczka prawdopodobnie nie działałaby niezawodnie w systemach, w których dash
lub ash
powłoki oparte na innych powłokach, yash
powłoka Bourne'a ksh88
lub ksh93
jest używana jako /bin/sh
, ponieważ powłoki te nie akceptują funkcji, których nazwa zawiera myślniki.
Powiązane również:
Przypuszczam, że następujące elementy również by działały (nie tak naprawdę przetestowane):
--() { exec db2 -txf "$0"; }; --