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