Что является принятым, портативным способом включать опции интерпретатора в строку хижины, т.е. как может я делать что-то как
#!/usr/bin/env python -c
или (что еще более важно) что-то как
#!/usr/bin/env java -cp "./jars/*:./src" -Xmn1G -Xms1G -server
и заставьте это быть проанализированным правильно? Прямо сейчас человечность кажется просто glom все это вместе, хотя другие системы проанализируют это без проблемы.
http://en.wikipedia.org/wiki/Shebang_%28Unix%29
описывает проблему, но не предлагает решения.
Хорошего решения нет, так как разные юнисы по-разному относятся к многословным #! строкам. Использование переносимого #! ограничивает вас максимум одним аргументом интерпретатора в #! строке, и никаких пробелов в интерпретаторе или аргументе.
Если язык позволяет, вы можете сделать сценарий сценарием оболочки, который берет на себя загрузку интерпретатора с любой командной строкой. Например, в Perl, из руководства perl:
#!/bin/sh -- # -*- perl -*- -p
eval 'exec perl -wS "$0" ${1+"$@"}'
if $running_under_some_shell;
Оболочка прекращает обработку после второй строки, и Perl воспринимает строки 2-3 как инструкцию, которая ничего не делает. Некоторые диалекты lisp/scheme делают #!
... !#
комментарием, позволяя вам писать
#!/bin/sh
exec guile -s "$0" "$@"
!# ;; scheme code starts here
В общем, единственное решение - это два файла. Вы можете написать #!/usr/bin/env mywrapper
, где mywrapper
- это программа (это может быть скрипт), которая вызывает настоящий интерпретатор с любым аргументом. Или вы можете сделать сам исполняемый файл скриптом-оберткой и держать интерпретируемый файл отдельно. Преимущество второго решения в том, что оно работает, даже если интерпретатор не принимает ведущую строку #!
строку.