Проблемы разбора линии Shebang в Ubuntu - PullRequest
5 голосов
/ 16 июля 2010

Что является приемлемым, переносимым способом включения опций интерпретатора в строку shebang, т.е.как я могу сделать что-то вроде

#!/usr/bin/env  python -c 

или (что более важно) что-то вроде

#!/usr/bin/env java -cp "./jars/*:./src" -Xmn1G -Xms1G -server

и получить его для правильного анализа?Прямо сейчас Ubuntu, кажется, просто делает все вместе, хотя другие системы проанализируют это без проблем.

http://en.wikipedia.org/wiki/Shebang_%28Unix%29

описывает проблему, но не предлагает решения.

1 Ответ

4 голосов
/ 16 июля 2010

Хорошего решения не существует, так как разные юниты обрабатывают несколько слов #!линии по-разному.Портативный #!Использование ограничивает вас не более чем одним аргументом интерпретатора на #!в строке и без пробелов в интерпретаторе или аргументе.

Если язык позволяет, вы можете сделать скрипт сценарием оболочки, который заботится о загрузке интерпретатора любой командной строкой, которая ему нравится.Например, в 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 - это программа (это может быть скрипт), которая вызывает фактического интерпретатора с любым аргументом, который он хочет.Или вы можете сделать исполняемый файл самим скриптом-оберткой и хранить интерпретируемый файл отдельно.Второе решение имеет преимущество в работе, даже если переводчик не принимает начальную #! строку.

...