Пов'язані: Який інтерпретатор оболонки виконує сценарій без шебанга?
У сценарії немає шебанг / хешбанг /#!
рядок, просто тому, що подвійний тире - ні #!
.
Однак сценарій буде виконаний оболонкою (див. Вище пов'язане питання та відповіді), і в цій оболонці, якщо -
є дійсним символом у назві функції, рядок оголошує функцію оболонки, яка називається, --
що нічого не робить (ну, вона працює :
, який нічого не робить ) і який ніколи не називається.
Функція, у більш поширених багаторядкових позначеннях (лише для того, щоб зробити більш очевидним, як вона виглядає, оскільки її незвичайна назва ніби затьмарює той факт, що вона насправді є функцією):
-- () {
:
}
Єдиною метою визначення функції є наявність рядка, що є дійсним у сценарії оболонки, і в той же час дійсна команда SQL (коментар). Цей вид коду називається a поліглотом .
Після оголошення функції фальшивої оболонки сценарій, коли виконується інтерпретатором сценарію оболонки, використовує exec
для заміни поточної оболонки процесом, що виникає в результаті запускуdb2 -txf "$0"
, який би був таким самим, як і використання db2 -txf
в імені шляху скрипту з командного рядка.
Цей трюк, ймовірно, не працює надійно в системах, де dash
або інші ash
оболонки на основі, оболонки yash
Борна, ksh88
або ksh93
використовуються як/bin/sh
, оскільки ці оболонки не приймають функції, назва яких містить тире.
Також пов'язані:
Я припускаю, що також працює (не дуже перевірено):
--() { exec db2 -txf "$0"; }; --