配置或库 shell 脚本是否需要 shebang?

Is shebang required for configuration or library shell scripts?

如果我在我的主脚本(有 shebang)中包含一个配置文件(变量在 shell 脚本中定义)或库文件(具有通用函数定义),那么我需要一个 shebang 吗?配置 shell 脚本也 ?

编辑: 我包括使用 .或来源 主文件包含#!/bin/sh shebang.

取决于你如何称呼它。使用 source. 命令则否,如果仅使用脚本名称将它们作为 child 进程调用,则可以。

根据您的描述,您是 "sourcing" 文件,所以不,#! 只是评论。从这些文件中删除执行权限可能也是谨慎的做法,这样它们就不会无意中被称为 child 个进程。

(如果它们不是 "sourced",那么定义只会发生在 child 过程中,并且没有用)

编辑@triplee 评论:

它们可以作为 child 进程使用(例如)sh filenamebash filename 甚至(不寒而栗)csh filename 调用。所有这些 shell 都有差异,因此 #! 行的一个优点是作为注释指示代码是为哪种 shell 类型编写的。不过我不会为此使用它,因为它也意味着它可以 运行 作为 child。我确定您已经充分评论了您的代码,但可能值得添加评论以表明 shell.

#! 带有解释器,比如 bash,不应使用 :

  1. 当您希望使用现有的环境变量而不导出它时。
  2. 当您希望将配置文件包含到父脚本时(请改用 source.

shebang 使解释器执行包含 shebang 本身的脚本(bootstrap 机制),在此执行期间,带有 shebang 的行仅被视为注释。

由于在这种情况下产生了一个新的 shell(子),旧环境被遗忘,未导出的变量将被遗忘在新的 shell.