Shell /usr/bin/env有什么影响?

Shell /usr/bin/env有什么影响?,shell,shebang,Shell,Shebang,#之间有什么区别/usr/bin/env ruby和#!ruby (我发现许多其他问题都在讨论#!/usr/bin/env ruby和#!/usr/bin/ruby之间的区别,但这不是我的问题。) …根本不能保证在UNIXlike系统上工作(也不能在我个人知道的任何系统上工作);有效的shebang必须具有完全限定的路径。告诉编辑器您正在使用哪种编程语言可能就足够了,但这并不意味着内核将成功地使用它来选择一个用于运行程序的解释器 内核的execvesyscall不进行路径查找——这是由C-sta

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

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

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

内核的
execve
syscall不进行路径查找——这是由C-standard-library包装器(如
execlp
execvp
)添加的,但是解析shebang是由内核直接完成的,因此您的C-library nicity不会在那里发生


…使用路径查找
ruby
可执行文件的位置。由于
env
可执行文件的路径已完全指定,因此这是一个有效的shebang行(而
#!ruby
不是)


env
还有其他用途——例如,您可以运行
env-i someprog
以在完全空的环境中运行
someprog
,或者
env FOO=bar someprog
以在环境变量
FOO
设置为
bar
的情况下运行
someprog
(如果在shell中运行,也可以使用
FOO=bar someprog
,但是
env
方法也可以在不涉及shell的情况下工作)


然而,在这个上下文中相关的用例是强制进行路径查找。

#!ruby
必须在您的路径中。因此
#!ruby
#!/usr/bin/ruby
可能是相同的事情,这取决于您的路径。实际上,我刚刚做了一个根测试,其中
!ruby
导致ruby:错误的解释器:没有这样的文件或目录"…因此,由于某些原因,ruby不自然地位于根环境中,但是/usr/bin/env可以找到它。但是我认为/user/bin/env应该使用用户的路径……嗯,实际上它看起来像是
#!ruby
必须是一个特例,因为
#!python
无法工作,因为解释器必须是可执行文件的有效路径名-请参阅@JohnBachir,
#!ruby
失败与ruby是否在root路径中无关。在计算shebang时根本没有进行路径查找……至少,在内核完成shebang计算时没有。我见过shell试图将其掌握在自己手中的场景,但如果您尝试在没有涉及到shell解释器(例如,使用
find.-maxdepth 1-exec./somescript{}+
),那么您可以保证看到的行为是内核的行为,从而避免混淆因素。
#! ruby
#!/usr/bin/env ruby