#! /usr/bin/env ruby
和#! ruby
之间有什么区别?
(我发现很多其他问题正在讨论#! /usr/bin/env ruby
和#! /usr/bin/ruby
之间的区别,但这不是我的问题。)
答案 0 :(得分:4)
#! ruby
...不保证可以在类UNIX系统上运行(并且根本不会在我个人所知的任何工作上工作);有效的shebang必须具有完全限定的路径。告诉编辑您使用哪种编程语言可能就足够了,但这并不意味着内核会成功地使用它来选择运行程序的解释器。
内核的execve
系统调用不进行PATH查找 - 由execlp
和{{1}等C标准库包装器添加但是,解析shebangs是由内核直接完成的,因此你的C-library隐私不会发生在那里。
execvp
...使用PATH查找#!/usr/bin/env ruby
可执行文件的位置。因为完全指定了ruby
可执行文件的路径,所以这是一个有效的shebang行(env
不是)。
#! ruby
还有其他用途 - 例如,您可以运行env
以使用完全空的环境运行env -i someprog
,或someprog
运行env FOO=bar someprog
1}}将环境变量someprog
设置为值FOO
(bar
在运行shell时也会执行此操作,但FOO=bar someprog
方法也适用于没有shell的情况参与)。
但是,此上下文中的相关用例是强制进行PATH查找。