所以我有一个简单的 shell 脚本。这两个命令在执行时有什么区别?有优选的方式吗?
$sh -x foobar.sh
或者
$ ./foobar.sh
我发现与第二个命令一起使用时脚本执行速度较慢。
答案1
该./foobar.sh
文件通过运行#!
第一行后面的任何内容来启动。如果这一行读取,#!/bin/sh -x
那么它将与情况相同sh -x foobar.sh
(假设 sh 解析为/bin/sh
来自 PATH)。也许它不是由sh
但是开始的bash
?
该-x
标志打印调试信息,即执行之前的每个命令。
答案2
这取决于shell脚本的内容和使用的shell。 shell 脚本可能包含样板代码,称为 shebang,如下所示:
#!/usr/bin/env bash
特殊序列“#!”指示 exec() 内核系统调用使用紧随其后定义的程序作为解释器。这意味着如果您使用第二种执行方式,您必须查看该文件以查看将使用什么程序来执行它。
另外,来自 bash 手册(bash -c“帮助集”)
-x Print commands and their arguments as they are executed.
你的命令应该做什么 - 如果你使用 bash,请参阅下面的注释 - 打印出脚本中的每一行并执行它。奇怪的是,这应该会导致您的第一个命令比第二个命令慢,而不是相反(同样:如果两种情况下使用的解释器相同)。更常见的是在不使用 -x 的情况下运行 shell,当然,除非您想要进行调试。
底线:出于所述原因这里将 shebang 与 env 程序一起使用(按照推荐这里)并使用第二种执行方式。这是最独立于平台的做事方式,也是首选方式。
注意:另一件让事情变得复杂的事情是 /bin/sh 背后的实际解释器因系统而异。在许多情况下,这实际上是 bash,这就是我的假设。
答案3
第一个版本,显式调用sh
将使用 sh 运行脚本(根据 的要求显示跟踪语句-x
)。第二个没有指定显式解释器,将尊重 shebang 行(如果有),或者默认为您当前正在运行的 shell。
例如,如果您的脚本有一个 shebang 行#! /bin/bash
,或者您的 shell 是 bash,那么第二种形式./script
将导致执行运行 bash 而不是 sh。由于 bash 是比 sh 功能更齐全的 shell,因此它可能具有不同的性能特征。