#! /usr/bin/env ruby
和#! ruby
有什么区别?/usr/bin/env有什么影响?
(我发现很多讨论#! /usr/bin/env ruby
和#! /usr/bin/ruby
之间的区别的其他问题,但是这不是我的问题。)
#! /usr/bin/env ruby
和#! ruby
有什么区别?/usr/bin/env有什么影响?
(我发现很多讨论#! /usr/bin/env ruby
和#! /usr/bin/ruby
之间的区别的其他问题,但是这不是我的问题。)
#! ruby
...不能保证在类UNIX系统系统的工作(和不工作根据我个人所知);一个有效的shebang必须有一个完全合格的路径。告诉你的编辑器你正在使用哪种编程语言可能就足够了,但这并不意味着内核会成功地使用它来选择一个运行程序的解释器。
内核的系统调用execve
不做PATH查找 - 这是由C-标准库的包装,如execlp
和execvp
添加,但解析shebangs由内核直接完成,所以你的C库nicities不发生在那里。
#!/usr/bin/env ruby
...使用路径来查找ruby
可执行文件的位置。因为完整指定env
可执行文件的路径,所以这是一个有效的shebang行(不是#! ruby
)。
env
有其他目的 - 你可以运行,例如,env -i someprog
与一个完全空的环境中运行someprog
,或env FOO=bar someprog
与环境变量运行someprog
FOO
设置为值bar
(其中FOO=bar someprog
如果通过shell运行也可以,但env
方法也可以在不涉及shell的情况下运行)。
但是,在这种情况下的相关用例强制PATH查找。
'#!红宝石必须在你的道路上。所以'#! ruby和'#!/ usr/bin/ruby'可能是同一件事情,具体取决于你的路径。 –
实际上,我只是做了一个测试,作为根在哪里'#! ruby'导致了“ruby:糟糕的解释器:没有这样的文件或目录”......所以出于某种原因,ruby并不是自然而然地存在于根环境中,但是/ usr/bin/env可以找到它。但我认为/ user/bin/env应该使用用户的路径... –
嗯实际上它看起来像'#!红宝石必须是一个特例,因为'#! python'将不起作用,因为*解释器必须是可执行文件的有效路径名* - 请参阅[关于shebang的更多信息;为什么不##python工作?](http://askubuntu.com/a/716281/272194) –