#! /usr/bin/env ruby
有什么区别和 #! ruby
?
(我发现许多其他问题讨论了 #! /usr/bin/env ruby
和 #! /usr/bin/ruby
之间的区别,但这不是我的问题。)
最佳答案
#! ruby
...根本不能保证在类 UNIX 系统上工作(并且不能在我个人知道的任何系统上工作);一个有效的 shebang 必须有一个完全合格的路径。告诉您的编辑器您正在使用哪种编程语言可能就足够了,但这并不意味着内核会成功地使用它来选择一个解释器来运行程序。
内核的
execve
syscall 不执行 PATH 查找——这是由 C 标准库包装器添加的,例如 execlp
和 execvp
,但解析shebangs 是由内核直接完成的,因此您的C 库功能不会在那里发生。#!/usr/bin/env ruby
...使用 PATH 查找
ruby
的位置可执行。因为路径是env
可执行文件是完全指定的,这是一个有效的shebang行(#! ruby
不是)。env
也有其他用途——例如,您可以运行 env -i someprog
运行 someprog
使用完全空的环境,或 env FOO=bar someprog
运行 someprog
与环境变量 FOO
设置为值 bar
(如果通过 shell 运行,FOO=bar someprog
也可以,但 env
方法也适用于不涉及 shell)。但是,此上下文中的相关用例是强制进行 PATH 查找。
关于shell -/usr/bin/env 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39356694/