我经常在shell脚本的第一行看到#!/usr/bin/env bash
。
在macos:上省略/usr/bin/
部分似乎效果不错
#!env bash
echo Yo
我能在所有其他类似Unix的平台上做到这一点吗?
不支持在任何地方使用没有完整路径的解释器。在许多情况下,内核进行shebang处理,而内核通常不知道环境变量,包括PATH。因此,它需要一个完整的路径来找到解释器。
这就是使用#!/usr/bin/env bash
的原因——bash
由env
定位并执行,因此它允许bash
位于PATH中的任何位置,而只要求/usr/bin/env
位于已知位置。您不能只使用#!bash
或#!env bash
,因为内核不知道在哪里可以找到它们。
使用普通解释器有时可能会起作用——这意味着shebang处理是由了解环境的东西完成的,很可能是由活动shell本身完成的,而不是由内核完成的。
关于类似的问题也有很好的答案:
- https://unix.stackexchange.com/questions/77512/why-not-use-pathless-shebangs
- https://unix.stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-of-path-to-name-as-my