2016-09-06 140 views
1

#! /usr/bin/env ruby#! ruby有什么区别?/usr/bin/env有什么影响?

(我发现很多讨论#! /usr/bin/env ruby#! /usr/bin/ruby之间的区别的其他问题,但是这不是我的问题。)

+0

'#!红宝石必须在你的道路上。所以'#! ruby和'#!/ usr/bin/ruby​​'可能是同一件事情,具体取决于你的路径。 –

+0

实际上,我只是做了一个测试,作为根在哪里'#! ruby'导致了“ruby:糟糕的解释器:没有这样的文件或目录”......所以出于某种原因,ruby并不是自然而然地存在于根环境中,但是/ usr/bin/env可以找到它。但我认为/ user/bin/env应该使用用户的路径... –

+1

嗯实际上它看起来像'#!红宝石必须是一个特例,因为'#! python'将不起作用,因为*解释器必须是可执行文件的有效路径名* - 请参阅[关于shebang的更多信息;为什么不##python工作?](http://askubuntu.com/a/716281/272194) –

回答

2
#! ruby 

...不能保证在类UNIX系统系统的工作(和工作根据我个人所知);一个有效的shebang必须有一个完全合格的路径。告诉你的编辑器你正在使用哪种编程语言可能就足够了,但这并不意味着内核会成功地使用它来选择一个运行程序的解释器。

内核的系统调用execve不做PATH查找 - 这是由C-标准库的包装,如execlpexecvp添加,但解析shebangs由内核直接完成,所以你的C库nicities不发生在那里。


#!/usr/bin/env ruby 

...使用路径来查找ruby可执行文件的位置。因为完整指定env可执行文件的路径,所以这是一个有效的shebang行(不是#! ruby)。


env有其他目的 - 你可以运行,例如,env -i someprog与一个完全空的环境中运行someprog,或env FOO=bar someprog与环境变量运行someprogFOO设置为值bar(其中FOO=bar someprog如果通过shell运行也可以,但env方法也可以在不涉及shell的情况下运行)。

但是,在这种情况下的相关用例强制PATH查找。