我可以在 shell 脚本的第一行省略"shebang"的完整路径吗?



我经常在shell脚本的第一行看到#!/usr/bin/env bash

在macos:上省略/usr/bin/部分似乎效果不错

#!env bash
echo Yo

我能在所有其他类似Unix的平台上做到这一点吗?

不支持在任何地方使用没有完整路径的解释器。在许多情况下,内核进行shebang处理,而内核通常不知道环境变量,包括PATH。因此,它需要一个完整的路径来找到解释器。

这就是使用#!/usr/bin/env bash的原因——bashenv定位并执行,因此它允许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

最新更新