【问题标题】:Is shebang required for configuration or library shell scripts?配置或库 shell 脚本是否需要 shebang?
【发布时间】:2016-05-11 06:48:23
【问题描述】:

如果我在我的主脚本(有 shebang)中包含了一个配置文件(变量在 shell 脚本中定义)或库文件(有公共函数定义),那么我是否还需要一个用于该配置 shell 脚本的 shebang?

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

【问题讨论】:

  • 你是如何从主脚本调用 conf 脚本的?
  • @heemayl 检查编辑

标签: bash shell shebang


【解决方案1】:

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

根据您的描述,您正在“采购”文件,所以不,#! 只是一个评论。从这些文件中删除执行访问权限也是谨慎的做法,以免无意中将它们称为子进程。

(如果它们不是“来源”,那么这些定义只会发生在子进程中并且没有用)

在@triplee 评论之后编辑:

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

【讨论】:

  • 另外,如果您总是使用sh scriptbash script 显式调用脚本,那么显然会忽略shebang。也许还指出两者是不同的; sh 具有不同的行为,即使它是指向 bash 的符号链接。
  • @tripleee 在符号链接时有什么不同的行为?
  • @123 现在我明白你的意思了sh -> bash。这是 UNIX 系统 (ls -l /bin) 上非常常见的设备,我们有一个程序具有另一个程序的超集功能。它减少了代码维护量。例如,在 Linux 上,awk -> gawk 也很常见。它还允许向后兼容,几乎没有人使用原始的awk 代码,通常使用nawkgawk,但删除awk 会破坏数千个脚本。 gawk 特别是有许多有用的扩展在调用 awk 时不可用。
  • @cdarke 在询问后立即意识到,将评论留在那里进行确认,所以感谢您的回复。不过,关于 awk,即使您使用 compat 或 posix,gawk 也不能完美地模拟 posix awk。不幸的是,我(我相信你会问)我不记得到底是什么问题,但我记得它接受了 gawk compat 中无法在常规 awk 中工作的东西。
  • 好吧,你在使用 Bash 时遇到了与 sh 相同的问题。即使名义上处于 POSIX 模式,它也提供了许多非 POSIX 功能。
【解决方案2】:

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

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

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

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

【讨论】: