2011-04-05 77 views

回答

14

#!<interpreter> <arguments>试图运行<interpreter> <arguments>来读取并运行文件的其余部分。

所以#!/usr/bin/env意味着必须有一个叫做/usr/bin/env的程序;
#!/bin/env表示必须有一个名为/bin/env的程序。

一些系统有一个而不是另一个。

以我的经验,大部分都有/usr/bin/env,所以#!/usr/bin/env比较常见。

Unix系统将尝试使用execve运行<interpreter>,这就是为什么它必须是完整路径,而没有路径的#!env将不起作用。

+1

除此之外,非OSX BSD没有'/ bin/bash',所以推荐'/ usr/bin/env'来实现可移植性。另外,如果你想在'$ PATH'中排队的不同目录中运行更新版本的BASH,'env'会尊重和使用它,而'/ bin/bash'显然是硬编码的。 – kvz 2013-04-19 11:22:07

+3

特别是,OS/X具有'/ usr/bin/env',并且没有'/ bin/env'到'/ usr/bin/env'的符号链接。你会得到一个'-bash:./your_commnd:/ bin/env:坏解释器:没有这样的文件或目录错误。 – 2013-05-22 21:57:22

1

/usr/bin/env是到/bin/env的软链接。从本质上讲,你正在使用/bin/env

+4

取决于系统。 – 2011-04-05 14:43:27

+0

哪个系统具有两个硬文件? – kurumi 2011-04-05 15:49:41

+5

Ubuntu没有/ bin/env。 Solaris 8分别具有两个文件。 – 2011-04-05 16:02:16

2

米克尔的解释是伟大的,它错过只是一个小的事实(这是相当重要的),这只是一个传递包括所有空间的说法:

#!<Interpreter> <argument> 

结果在呼唤:

$ <Interpreter> '<argument>' path_to_calling_script 

因此,例如:

$ cat /tmp/test 
#!/usr/bin/env python 
print "hi" 

$ /tmp/test 

是与调用:

$ /usr/bin/env "python" /tmp/test 

的报价尝试表明,如果你添加任何标志或其他值将是参数的一部分被调用。

#!/bin/bash -c /bin/env python 

将被解释为:

$ /bin/bash "-c /bin/env python" 

这将无法正常工作。