脚本使用与默认 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()
调用中都被接受。仅当您的脚本是来源(. yourscript
或 source yourscript
)或缺少有效的 shebang 时,您才需要关心它们是从哪个解释器调用的。
如果这不是真的,非shell 语言的脚本将无法按预期工作(例如,Python 解释器 never一个系统默认shell).
当脚本以默认方式执行时,内核将使用 shebang 行 select 使用适当的解释器,无论是 sh
、bash
、ksh
、expect
、python
或其他。唯一需要警惕的真正问题是在 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
)。
我的脚本是使用 shebang 行开发的,如“#!/bin/ksh”,默认 shell 是
$ echo $SHELL
/bin/ksh
我正在移动所有这些脚本而不将 shebang 行更改为默认 shell 的新机器
$ echo $SHELL
/bin/bash
我应该担心这个吗?
我猜应该没有任何问题,因为 shebang 行将覆盖解释器并使用脚本中定义的 ksh,正如我希望的那样。
请分享您的想法..
给出的假设是正确的:shebang 行在任何 execve()
调用中都被接受。仅当您的脚本是来源(. yourscript
或 source yourscript
)或缺少有效的 shebang 时,您才需要关心它们是从哪个解释器调用的。
如果这不是真的,非shell 语言的脚本将无法按预期工作(例如,Python 解释器 never一个系统默认shell).
当脚本以默认方式执行时,内核将使用 shebang 行 select 使用适当的解释器,无论是 sh
、bash
、ksh
、expect
、python
或其他。唯一需要警惕的真正问题是在 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
)。