【问题标题】:What is the difference between `./example.sh` and `sh example.sh``./example.sh` 和 `sh example.sh` 有什么区别
【发布时间】:2015-06-18 06:29:03
【问题描述】:

我正在尝试使用 bash 和数组。但是执行示例脚本时,我收到了意外的语法错误消息:example.sh: 3: example.sh: Syntax error: "(" unexpected。这是脚本

#!/bin/bash
array=( one two three )

如果我使用 ./example.sh 运行脚本,它可以工作并且不会显示任何错误。但是如果我运行 sh example.sh 我会收到错误消息。

我以为这两个命令是一样的:

  • sh example.sh
  • ./example.sh

那么……这两者有什么区别?

【问题讨论】:

  • sh example.sh 调用 /bin/sh 可执行文件,它可能与您系统上的 /bin/bash 相同也可能不同。比较 sh --version 和 bash --version 的输出以了解更多详细信息。
  • 无论哪种情况,我都不确定它是否应该有所作为。引用你的字符串值有影响吗?
  • 我只是一个“初级” bash 开发人员。没想到shbash有不同的含义o_0

标签: linux bash shell


【解决方案1】:

当您通过./example.sh 启动它时,脚本第一行中指定的命令将用于解释内容。因此,您的脚本在 bash 中执行,其中数组允许使用这种语法。

当您通过sh example.sh 启动它时,sh 是用于解释文件内容的命令。 sh 是原始的 Unix shell(又名 Bourne shell),这个 shell 比 bash(Bourne again shell)稍微粗鲁一点。你没有这样的数组。请注意,在sh 中,脚本的第一行仅被解释为注释。

【讨论】:

    【解决方案2】:

    通过使用 sh example.sh - 您正在指定用于该脚本的 shell 解释器。示例是“bash example.sh”而不是“sh example.sh”等。

    以这种方式运行脚本会忽略您在脚本中指定的“shebang (#!/bin/bash)”。由于您编写了一个 bash 脚本,但试图将它作为“sh”运行,这就是它失败的原因

    通过使用 ./example.sh, - 您指定从当前目录运行脚本。这将尝试在您当前所在的任何 shell 中运行脚本,除非指定了 shebang。由于您指定了一个“shebang”来在 bash 中运行脚本......这就是它工作的原因。

    【讨论】:

      【解决方案3】:
      array_name=(value1 ... valuen)
      

      这只是在bash 中初始化数组的方法。当你执行./example.sh时,shebang行#!/bin/bash告诉系统使用bash来执行。

      但是,当你执行sh example.sh时,sh是用来执行的。在许多 Unix 系统(如 Linux)中,sh 等价于 bashsh 似乎是您系统上的不同外壳。

      【讨论】:

      • sh 与 bash 不同(但我没有)。非常感谢您。嗯,你能给我推荐一个研究所有这些东西的好资源吗?我想我无法单独找到好的信息来源:我不知道答案。有什么书吗?
      猜你喜欢
      • 2014-04-30
      • 2012-11-27
      • 1970-01-01
      • 2011-01-28
      • 2016-11-28
      • 2011-08-09
      相关资源
      最近更新 更多