Проблемы парсинга строки хижины в Ubuntu

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

#!/usr/bin/env  python -c 

или (что еще более важно) что-то как

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

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

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

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

5
задан Robert McIntyre 15 July 2010 в 20:55
поделиться

1 ответ

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

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

4
ответ дан 15 December 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: