Хорошего решения не существует, так как разные юниты обрабатывают несколько слов #!линии по-разному.Портативный #!Использование ограничивает вас не более чем одним аргументом интерпретатора на #!в строке и без пробелов в интерпретаторе или аргументе.
Если язык позволяет, вы можете сделать скрипт сценарием оболочки, который заботится о загрузке интерпретатора любой командной строкой, которая ему нравится.Например, в Perl из руководства по perl:
#!/bin/sh -- # -*- perl -*- -p
eval 'exec perl -wS "$0" ${1+"$@"}'
if $running_under_some_shell;
Оболочка прекращает обработку после второй строки, и Perl видит строки 2–3 как инструкцию, которая ничего не делает.Некоторые диалекты lisp / schema делают #!
... !#
комментарием, позволяющим написать
#!/bin/sh
exec guile -s "$0" "$@"
!# ;; scheme code starts here
В общем случае единственные решения включают два файла.Вы можете написать #!/usr/bin/env mywrapper
, где mywrapper
- это программа (это может быть скрипт), которая вызывает фактического интерпретатора с любым аргументом, который он хочет.Или вы можете сделать исполняемый файл самим скриптом-оберткой и хранить интерпретируемый файл отдельно.Второе решение имеет преимущество в работе, даже если переводчик не принимает начальную #!
строку.