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