2012-08-09 58 views
11

是否可以在不知道要执行的程序路径的情况下指定shebang行?shell脚本shebang for unknown路径

也许不指定路径

#!node 

或指定若干选项

#!/usr/local/bin/node 
#!/usr/bin/node 

跨平台解决方案(Linux操作系统,BSD,OSX等......各种口味的)加分

回答

14

/usr/bin/env专门针对跨平台解决方案。

env executes utility after modifying the environment as specified on 
the command line. The option name=value specifies an environmental 
variable, name, with a value of value. The option `-i' causes env 
to completely ignore the environment it inherits. 

If no utility is specified, env prints out the names and values of 
the variables in the environment, with one name=value pair per line. 

所以在东西线:

#!/usr/bin/env node 

将是跨平台和“走正道”。

+0

+1确实是跨平台的。可悲的是,POSIX没有指定'env'的位置,但是我还没有找到一个不在'/ usr/bin'中的系统。任何人都看到一个时髦的操作系统,它不是? – Jens 2012-08-09 19:02:38

+0

是否可以通过在shebang线上连接的多个程序? ('!#/ usr/bin/env cat | nl') – 2012-08-09 19:04:05

+0

不,不可能。如果必须,请使用单独的脚本。 – Jens 2012-08-09 19:05:21

-2

在shebang之后放置一个空间。如果程序在环境变量PATH中,它应该去。

#! perl 

当然,Perl的一个特殊情况是

: 
eval 'exec perl -S $0 ${1+"[email protected]"}' 
    if 0; 

这适用于UNIX OSX,即使没有在/ usr/bin中/ ENV由@Jens

注意
+0

在OSX上不适用于我 - 但是,感谢 – 2012-08-09 18:49:38

-2

不要使用shebang。

node <<eof 
your node program here 
eof 
+0

@这个人为什么这么低估为什么这不是一个好主意? – 2012-08-09 19:02:37

+0

我不是downvoter,但这甚至没有解决你的问题,因此不能解决你的问题。 – Jens 2012-08-09 19:07:15

+1

它适用于所有POSIX兼容系统,您可以添加选项到命令并重定向输出。在linux上,这个#!/usr/bin/env sh -x不起作用。 – hipe 2012-08-09 19:31:10

0

相反的是,人们可能会认为没有对env标准的位置,所以我们只能抢到关于它的位置的一些信息:

  • /usr/bin/env - MacOS的(10.12)
  • /bin/env/usr/bin/env - Fedora的( 25)

我确信其他人可以扩展名单。