/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 查找——这是由 execlp
和 execvp
等 C 标准库包装器添加的,但解析 shebang 是直接完成的由内核,所以你的 C 库细节不会在那里发生。
#!/usr/bin/env ruby
...使用 PATH 查找 ruby
可执行文件的位置。因为 env
可执行文件的路径已完全指定,所以这是一个有效的 shebang 行(#! ruby
不是)。
env
也有其他用途——你可以 运行,例如,env -i someprog
到 运行 someprog
完全空的环境,或 env FOO=bar someprog
到 运行 someprog
,环境变量 FOO
设置为值 bar
(FOO=bar someprog
也可以,如果 运行通过 shell,但 env
方法也可以在不涉及 shell 的情况下工作)。
但是,此上下文中的相关用例强制执行 PATH 查找。
#! /usr/bin/env ruby
和#! ruby
有什么区别?
(我发现很多其他问题讨论 #! /usr/bin/env ruby
和 #! /usr/bin/ruby
之间的区别,但这不是我的问题。)
#! ruby
...完全不能保证在 UNIXlike 系统上工作(并且 不能 在我个人知道的任何系统上工作);有效的 shebang 必须具有 完全限定的 路径。告诉您的编辑器您正在使用哪种编程语言可能就足够了,但这并不意味着内核将成功地将它用于 select 一个解释器 运行 一个程序。
内核的 execve
系统调用不执行 PATH 查找——这是由 execlp
和 execvp
等 C 标准库包装器添加的,但解析 shebang 是直接完成的由内核,所以你的 C 库细节不会在那里发生。
#!/usr/bin/env ruby
...使用 PATH 查找 ruby
可执行文件的位置。因为 env
可执行文件的路径已完全指定,所以这是一个有效的 shebang 行(#! ruby
不是)。
env
也有其他用途——你可以 运行,例如,env -i someprog
到 运行 someprog
完全空的环境,或 env FOO=bar someprog
到 运行 someprog
,环境变量 FOO
设置为值 bar
(FOO=bar someprog
也可以,如果 运行通过 shell,但 env
方法也可以在不涉及 shell 的情况下工作)。
但是,此上下文中的相关用例强制执行 PATH 查找。