开发者

Shebang line parsing problems in Ubuntu

开发者 https://www.devze.com 2023-01-07 18:17 出处:网络
What is the accepted, portable way to include interpreter options in the shebang line, ie. how can I do something like

What is the accepted, portable way to include interpreter options in the shebang line, ie. how can I do something like

#!/usr/bin/env  python -c开发者_开发技巧 

or (more importantly) something like

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

and get it to be parsed correctly? Right now ubuntu seems to just glom the whole thing together, although other systems will parse this with no problem.

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

describes the problem but offers no solution.


There's no good solution, as different unices treat multi-word #! lines differently. Portable #! use limits you to at most one argument to the interpreter on the #! line, and no whitespace in the interpreter or argument.

If the language allows it, you can make the script a shell script which takes care of loading the interpreter with whatever command line it likes. For example, in Perl, from the perl manual:

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

The shell stops processing after the second line, and Perl sees lines 2–3 as an instruction that does nothing. Some lisp/scheme dialects make #!...!# a comment, allowing you to write

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

In general, the only solutions involve two files. You can write #!/usr/bin/env mywrapper where mywrapper is a program (it can be a script) that calls the actual interpreter with whatever argument it wants. Or you can make the executable itself the wrapper script and keep the interpreted file separate. The second solution has the advantage of working even if the interpreter doesn't accept a leading #! line.

0

精彩评论

暂无评论...
验证码 换一张
取 消