Shebang在Ubuntu中解析问题

Rob*_*yre 5 java ubuntu shebang

什么是在shebang线中包含解释器选项的可接受的,可移植的方式,即.我该怎么办呢

#!/usr/bin/env  python -c 
Run Code Online (Sandbox Code Playgroud)

或者(更重要的是)类似的东西

#!/usr/bin/env java -cp "./jars/*:./src" -Xmn1G -Xms1G -server
Run Code Online (Sandbox Code Playgroud)

并让它正确解析?现在ubuntu似乎只是将整个事情放在一起,尽管其他系统会解析这个问题没有问题.

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

描述了问题,但没有解决方案.

Gil*_*il' 5

没有好的解决方案,因为不同的 unices 处理多字 #! 线路不同。便携的 #!use 限制您最多只能为 #! 上的解释器提供一个参数。行,并且解释器或参数中没有空格。

如果语言允许,您可以使脚本成为一个 shell 脚本,它负责使用它喜欢的任何命令行加载解释器。例如,在 Perl 中,来自 perl 手册:

#!/bin/sh -- # -*- perl -*- -p
eval 'exec perl -wS "$0" ${1+"$@"}'
if $running_under_some_shell;
Run Code Online (Sandbox Code Playgroud)

shell 在第二行之后停止处理,Perl 将第 2-3 行视为什么都不做的指令。一些 lisp/scheme 方言使#!...!#注释,允许你写

#!/bin/sh
exec guile -s "$0" "$@"
!# ;; scheme code starts here
Run Code Online (Sandbox Code Playgroud)

一般来说,唯一的解决方案涉及两个文件。你可以写#!/usr/bin/env mywrapper在那里mywrapper是一个程序(它可以是一个脚本)调用它想要的任何参数的实际解释。或者,您可以使可执行文件本身成为包装脚本,并将解释的文件分开。第二种解决方案的优点是即使解释器不接受引导#!线也能工作。

  • 那太糟糕了......我真的认为shebang线不会比它更重要,因为它有多么重要。感谢您的建议 :) (2认同)