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 execzastępuje bieżącą powłokę procesem wynikającym z uruchomienia db2 -txf "$0", który byłby taki sam, jak użycie db2 -txfnazwy ścieżki skryptu z wiersza poleceń.
Ta sztuczka prawdopodobnie nie działałaby niezawodnie w systemach, w których dashlub ashpowłoki oparte na innych powłokach, yashpowłoka Bourne'a ksh88lub ksh93jest 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"; }; --