Связанный: Какой интерпретатор оболочки выполняет сценарий без Шебанга?
Скрипт не имеет #!строки shebang / hashbang / , просто потому что двойной тире нет #!.
Однако сценарий будет выполняться оболочкой (см. Выше связанный вопрос и ответы), и в этой оболочке, если -допустимый символ в имени функции, строка объявляет вызываемую функцию оболочки --, которая ничего не делает (хорошо, она запускается :, который ничего не делает ) и который никогда не называется.
Функция в более распространенной многострочной нотации (просто чтобы сделать ее более очевидной, как она выглядит, так как ее нечетное имя как бы скрывает тот факт, что это на самом деле функция):
-- () {
:
}
Единственная цель определения функции - иметь строку, которая действительна в сценарии оболочки и в то же время является допустимой командой SQL (комментарий). Этот вид кода называется полиглотом .
После объявления фиктивной функции оболочки сценарий при выполнении интерпретатором сценария оболочки использует execдля замены текущей оболочки процесс, полученный в результате выполненияdb2 -txf "$0" , который будет аналогичен использованию db2 -txfв имени пути сценария из командной строки.
Этот трюк, вероятно, не будет надежно работать в системах, где используются dashили другие ashоболочки на основе, оболочка yashБорна ksh88или ksh93используется как/bin/sh , поскольку эти оболочки не принимают функции, имя которых содержит тире.
Также связано:
Я полагаю, что следующее также будет работать (не проверено):
--() { exec db2 -txf "$0"; }; --