配置或库 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 filename
、bash filename
甚至(不寒而栗)csh filename
调用。所有这些 shell 都有差异,因此 #!
行的一个优点是作为注释指示代码是为哪种 shell 类型编写的。不过我不会为此使用它,因为它也意味着它可以 运行 作为 child。我确定您已经充分评论了您的代码,但可能值得添加评论以表明 shell.
#! 带有解释器,比如 bash,不应使用 :
- 当您希望使用现有的环境变量而不导出它时。
- 当您希望将配置文件包含到父脚本时(请改用
source
或 .
)
shebang 使解释器执行包含 shebang 本身的脚本(bootstrap 机制),在此执行期间,带有 shebang 的行仅被视为注释。
由于在这种情况下产生了一个新的 shell(子),旧环境被遗忘,未导出的变量将被遗忘在新的 shell.
如果我在我的主脚本(有 shebang)中包含一个配置文件(变量在 shell 脚本中定义)或库文件(具有通用函数定义),那么我需要一个 shebang 吗?配置 shell 脚本也 ?
编辑: 我包括使用 .或来源 主文件包含#!/bin/sh shebang.
取决于你如何称呼它。使用 source
或 .
命令则否,如果仅使用脚本名称将它们作为 child 进程调用,则可以。
根据您的描述,您是 "sourcing" 文件,所以不,#!
只是评论。从这些文件中删除执行权限可能也是谨慎的做法,这样它们就不会无意中被称为 child 个进程。
(如果它们不是 "sourced",那么定义只会发生在 child 过程中,并且没有用)
编辑@triplee 评论:
它们可以作为 child 进程使用(例如)sh filename
、bash filename
甚至(不寒而栗)csh filename
调用。所有这些 shell 都有差异,因此 #!
行的一个优点是作为注释指示代码是为哪种 shell 类型编写的。不过我不会为此使用它,因为它也意味着它可以 运行 作为 child。我确定您已经充分评论了您的代码,但可能值得添加评论以表明 shell.
#! 带有解释器,比如 bash,不应使用 :
- 当您希望使用现有的环境变量而不导出它时。
- 当您希望将配置文件包含到父脚本时(请改用
source
或.
)
shebang 使解释器执行包含 shebang 本身的脚本(bootstrap 机制),在此执行期间,带有 shebang 的行仅被视为注释。
由于在这种情况下产生了一个新的 shell(子),旧环境被遗忘,未导出的变量将被遗忘在新的 shell.