7

在 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

描述了问题,但没有提供解决方案。

4

1 回答 1

5

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

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

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

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

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

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

于 2010-07-15T21:28:56.610 回答