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

3
如果我在主脚本中包含了一个配置文件(shell脚本中定义的变量)或库文件(具有常见函数定义),那么该配置shell脚本是否也需要shebang呢?
编辑: 我使用“.”或“source”来包含配置文件 主文件包含#!/bin/sh shebang。
2个回答

7
取决于您是如何调用它的。如果使用source.命令,则不需要,如果只使用脚本名称作为子进程调用它们,则需要。
从您的描述来看,您正在“引用”这些文件,因此#!只是一个注释。还可以明智地从这些文件中删除执行访问权限,以免意外将它们称为子进程。
(如果它们没有被“引用”,那么定义只会发生在子进程中,没有用处)
根据@triplee的评论进行编辑:
它们可以使用(例如)sh filenamebash filename或甚至(打颤)csh filename等方式调用为子进程。所有这些 shell 都有差异,因此 #! 行的一个好处是作为一条注释,指示代码编写为哪种 shell 类型。虽然我不会因此而使用它,因为它还意味着它可以作为子进程运行。我相信您已经充分注释了代码,但可能值得添加注释以指示 shell。

2
如果你总是使用sh script或者bash script来显式地调用脚本,那么shebang显然会被忽略。此外,也许需要指出这两者是不同的;即使shbash的符号链接,它们的行为也是不同的。 - tripleee
使用符号链接不应该有任何影响,这是文件系统的一个特性,而不是 shell。符号链接在这里有什么相关性? - cdarke
1
@123现在我明白你的意思sh -> bash。这是UNIX系统上非常常见的设备,例如(ls -l /bin)我们有一个程序具有另一个程序特性的超集。它减少了代码维护的工作量。例如,在Linux上,经常看到awk -> gawk。这也允许向后兼容性,几乎没有人使用原始的awk代码,通常使用nawkgawk,但删除awk将破坏成千上万个脚本。特别是当调用awk时,gawk具有许多有用的扩展功能是不可用的。 - cdarke
1
@cdarke 意识到我在提问之后立即明白了,但为了确认,我还是留下了评论。谢谢你的回复。关于 awk 的问题,即使在使用 compat 或 posix 时,gawk 并不能完美地模拟 posix awk。不幸的是,我(如你肯定会问的那样)无法记起具体的问题是什么,但我记得在 gawk compat 中接受了一些在常规 awk 中无法工作的东西。 - 123
1
好吧,您在Bash中与“sh”遇到了相同的问题。即使名义上处于POSIX模式下,它也提供许多非POSIX功能。 - tripleee
显示剩余4条评论

0

#! 不应该与解释器(如bash)一起使用:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接