脚本使用与默认 shell 不同的 shebang 行是否值得关注?

Is scripts' use of a shebang line differing from the default shell cause for concern?

我的脚本是使用 shebang 行开发的,如“#!/bin/ksh”,默认 shell 是 $ echo $SHELL /bin/ksh

我正在移动所有这些脚本而不将 shebang 行更改为默认 shell 的新机器 $ echo $SHELL /bin/bash

我应该担心这个吗?

我猜应该没有任何问题,因为 shebang 行将覆盖解释器并使用脚本中定义的 ksh,正如我希望的那样。

请分享您的想法..

给出的假设是正确的:shebang 行在任何 execve() 调用中都被接受。仅当您的脚本是来源(. yourscriptsource yourscript)或缺少有效的 shebang 时,您才需要关心它们是从哪个解释器调用的。

如果这不是真的,非shell 语言的脚本将无法按预期工作(例如,Python 解释器 never一个系统默认shell).

当脚本以默认方式执行时,内核将使用 shebang 行 select 使用适当的解释器,无论是 shbashkshexpectpython 或其他。唯一需要警惕的真正问题是在 sh 是一个特定的 shell(例如 bash)的系统上编写的脚本,然后将其移动到另一个系统,其中 sh 是不同的 shell(例如破折号),因为它们可能会使用 shell 在前者中发现而在后者中不存在的特征。

默认 shell 不会影响脚本的执行方式(除非您使用的 shell 会做一些非常奇怪的事情)。

没有 #! 行的可执行脚本将以 /bin/sh 执行。 实际上这似乎不正确,但无论如何你不用担心这个。

只要你的脚本以#!/bin/ksh 开头你正常执行它们,系统会通过将它们传递给/bin/ksh来执行它们。

可能 需要担心的一件事是 /bin/ksh 是否存在,如果存在,它究竟是什么。在我的系统 (Linux Mint 17) 上,/bin/ksh 是指向 /etc/alternatives/ksh 的符号链接,后者又是指向 /bin/ksh93.

的符号链接

带有 #!/bin/ksh 的脚本可能很常见,几乎所有类 UNIX 系统都会满足它们的需求,并且会在该位置安装 一些行为类似于 ksh 的东西

请注意,由 $SHELL 指定的 "default shell" 并不是系统范围的默认值。它只是特定环境变量的值。根据 /etc/passwd 中指定的 shell 或等效项,在登录时为每个用户 设置该变量 ;因此不同的用户可以有不同的默认 shells。您可以在登录后更改 $SHELL 的值。 /etc/passwd 中的条目或等效项在创建帐户时设置,以后可以更改。如果未指定 shell,大多数系统都有一个默认用户 shell,这是为新帐户设置的(例如,大多数 Linux 系统用户 /bin/bash)。