< p >
#! /usr/bin/env ruby
和 #! ruby
有什么区别?
(我发现很多其他问题讨论了#! /usr/bin/env ruby
和#! /usr/bin/ruby
之间的区别,但这不是我的问题。)
#! ruby
这个功能不能保证在类UNIX系统上正常工作(我所知道的任何系统都不行);一个有效的shebang必须有一个完全限定的路径。告诉你的编辑器你正在使用哪种编程语言可能足够了,但这并不意味着内核将成功使用它选择解释器来运行程序。
内核的execve
系统调用不执行PATH查找——这是由C标准库包装器(如execlp
和execvp
)添加的,但是解析shebang是直接由内核完成的,因此你的C库细节在那里不会发生。
#!/usr/bin/env ruby
...使用PATH查找ruby
可执行文件的位置。因为env
可执行文件的路径已经完全指定,所以这是有效的shebang行(而#! ruby
不是)。
env
还有其他用途--例如,您可以运行env -i someprog
以使用完全空的环境运行someprog
,或者运行env FOO=bar someprog
以使用环境变量FOO
设置为值bar
运行someprog
(如果通过shell运行,则FOO=bar someprog
也会这样做,但是env
方法也可以在没有涉及shell的情况下工作)。
然而,在此情况下相关的用例是强制进行PATH查找。
#! ruby
必须在您的路径中。因此,根据您的路径,#! ruby
和#!/usr/bin/ruby
可能是相同的东西。 - Jonny Henly#! ruby
导致“ruby: bad interpreter: No such file or directory”...所以出于某种原因,ruby并不自然地存在于root环境中,但是/usr/bin/env可以找到它。但我认为/user/bin/env本来应该使用用户的路径... - John Bachir#! ruby
必须是特例,因为#! python
不起作用,因为解释器必须是可执行文件的有效路径名 - 请参见[有关shebang的其他信息;为什么#!python不起作用?] (http://askubuntu.com/a/716281/272194)。 - Jonny Henly#! ruby
失败与 ruby 是否在 root 的 PATH 中无关。在评估 shebang 时根本不会进行 PATH 查找。 - Charles Duffy