/usr/bin/env有什么作用?

What effect does /usr/bin/env have?

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

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

#! ruby

...完全不能保证在 UNIXlike 系统上工作(并且 不能 在我个人知道的任何系统上工作);有效的 shebang 必须具有 完全限定的 路径。告诉您的编辑器您正在使用哪种编程语言可能就足够了,但这并不意味着内核将成功地将它用于 select 一个解释器 运行 一个程序。

内核的 execve 系统调用不执行 PATH 查找——这是由 execlpexecvp 等 C 标准库包装器添加的,但解析 shebang 是直接完成的由内核,所以你的 C 库细节不会在那里发生。


#!/usr/bin/env ruby

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


env 也有其他用途——你可以 运行,例如,env -i someprog 到 运行 someprog 完全空的环境,或 env FOO=bar someprog 到 运行 someprog,环境变量 FOO 设置为值 barFOO=bar someprog 也可以,如果 运行通过 shell,但 env 方法也可以在不涉及 shell 的情况下工作)。

但是,此上下文中的相关用例强制执行 PATH 查找。