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

标签 shell shebang

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

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

最佳答案

#! ruby

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

内核的execve syscall 不执行 PATH 查找——这是由 C 标准库包装器添加的,例如 execlpexecvp ,但解析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/

相关文章:

python - Windows 上这 4 种不同类型的 Python shebangs 有什么区别?

Python shebang 和换行符

linux - "#!/usr/bin/env bash"和 "#!/usr/bin/bash"有什么区别?

ruby - ruby 程序开始时 "#!/usr/local/bin/ruby -w"的用途是什么

linux - Shell脚本执行失败

git - 是否有针对全功能跨平台 shebang 系列的 hack?

linux - Bash:一个 IF 语句返回了意想不到的值,你能找到原因吗?

java - shell命令未执行

shell - 使用 Docker Compose 的交互式 shell

bash - 如何在 bash 中编写看门狗守护进程?