像可执行文件一样运行脚本与通过 shell 显式运行它有何不同?

像可执行文件一样运行脚本与通过 shell 显式运行它有何不同?
  1. Linux 命令、编辑器和 Shell 编程实用指南 作者:Mark G. Sobell

    虽然您可以使用 bash 来执行 shell 脚本,但这种技术会导致脚本运行速度比授予自己执行权限并直接调用脚本更慢。

    这是为什么?

  2. 像可执行文件一样运行脚本与通过 shell 显式运行它有何不同?
  3. 两者都遵循以下相同的步骤:

    命令行上的命令会导致 shell 分叉一个新进程,从而创建 shell 进程的副本(子 shell)。新进程尝试执行(execute)命令。与 fork 一样,exec 例程由操作系统执行(系统调用)。由于该命令是 shell 脚本,因此 exec 失败。当 exec 失败时,该命令被假定为 shell 脚本,子 shell 运行脚本中的命令。与需要从命令行输入的登录 shell 不同,子 shell 从文件(即 shell 脚本)获取输入。

答案1

假设该脚本是一个 Bash 脚本(即以 开头#!/bin/bash),那么作者在这一点上是错误的。当您直接运行 shell 脚本时,内核会#!/bin/bash在开头看到该行,然后使用脚本的文件名作为参数(即/bin/bash myscript.sh.换句话说,内核所做的正是您将其显式传递给 shell 所做的事情。

现在,如果脚本以#!/bin/sh而不是开头#!/bin/bash,那么还有另一种可能性。 Bash 可以提供/bin/sh,但不是必须的。它还优先考虑功能而不是尺寸或速度。如果您使用的是更小、更快的 shell /bin/sh,那么直接运行脚本将使用更快的 shell,并且脚本将比在 Bash 下运行得更快。

这在基于 Debian 的发行版(例如 Debian、Ubuntu、Mint)的实践中会发生。他们倾向于使用名为dash提供的shell/bin/sh来代替 Bash,以便使引导脚本运行得更快。

要查看您的发行版的功能,ls -l /bin/sh.它可能是到/bin/bash/bin/dash或另一个 shell 的符号链接。

相关内容