Проблемы с синтаксическим анализом строки Shebang в Ubuntu

Каков приемлемый переносимый способ включения параметров интерпретатора в строку 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

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


person Robert McIntyre    schedule 15.07.2010    source источник
comment
зачем тебе это для java? Вы не можете поместить его ни в класс, ни в файл jar, и ничто другое не может быть выполнено с помощью java. Предлагаю вам описать всю проблему, могут быть решения получше   -  person unbeli    schedule 16.07.2010
comment
Существуют и другие языки, помимо java, которые используют виртуальную машину java. Я пытаюсь писать сценарии в Clojure, где это имеет смысл.   -  person Robert McIntyre    schedule 16.07.2010
comment
Что ты хочешь делать? Может быть, когда вы сделаете ./Main.java, он скомпилирует и выполнит исходный файл java? Если это так, то, конечно, для начала отсутствует javac. Или вы хотите вставить shebang поверх .class файла и выполнить `./Main.class? Если это так, stackoverflow .com / questions / 1667830 / - вот ответ. См. Также: stackoverflow.com/questions/4303128/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 22.05.2015


Ответы (1)


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

Если язык позволяет, вы можете сделать сценарий сценарием оболочки, который позаботится о загрузке интерпретатора с любой командной строкой, которая ему нравится. Например, в Perl из руководства perl:

#!/bin/sh -- # -*- perl -*- -p
eval 'exec perl -wS "$0" ${1+"$@"}'
if $running_under_some_shell;

Оболочка прекращает обработку после второй строки, и Perl воспринимает строки 2–3 как инструкцию, которая ничего не делает. Некоторые диалекты lisp / scheme делают _2 _..._ 3_ комментарий, что позволяет вам писать

#!/bin/sh
exec guile -s "$0" "$@"
!# ;; scheme code starts here

В общем, единственные решения включают два файла. Вы можете написать #!/usr/bin/env mywrapper, где mywrapper - программа (это может быть сценарий), которая вызывает фактический интерпретатор с любым аргументом, который он хочет. Или вы можете сделать сам исполняемый файл сценарием-оболочкой и хранить интерпретируемый файл отдельно. Второе решение имеет то преимущество, что оно работает, даже если интерпретатор не принимает начальную #! строку.

person Gilles 'SO- stop being evil'    schedule 15.07.2010
comment
Это очень плохо ... Я действительно думал, что линия shebang будет менее испорчена, чем эта, учитывая, насколько она важна. Спасибо за совет :) - person Robert McIntyre; 16.07.2010