`。/ example.sh`和`sh example.sh`有什么区别

时间:2015-06-18 06:29:04

标签: linux bash shell

我正在尝试使用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

所以......两者之间有什么区别?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

array_name=(value1 ... valuen)

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

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