当前位置: 首页 > 知识库问答 >
问题:

macos - MacOS为什么默认没有用zsh执行脚本?

滕学义
2023-08-01

脚本内容如下,没有写Shebang行

arr=(x y z)echo ${arr[1]}
  1. 执行 ./xxx.sh,得到输出结果 y
  2. 执行 bash ./xxx.sh,得到输出结果 y
  3. 执行 zsh ./xxx.sh,得到输出结果 x

zsh数组下标是从1开始的,所以zsh的结果应该是输出y
MacOS默认的Shell是zsh,但是执行./xxx.sh结果却不是y

共有1个答案

司马高明
2023-08-01

在 macOS 上,默认情况下,执行脚本时使用的是 bash 而不是 zsh,即使系统默认的 shell 是 zsh。这是因为 macOS 采用了 Bash 作为默认的 shell,以确保兼容性。这样做是为了避免一些脚本在不同系统上可能因为 shell 不同而导致的问题。

当你在终端中直接执行 ./xxx.sh 或者使用 bash ./xxx.sh 时,实际上是使用了 Bash 解释器来执行脚本。在 Bash 中,数组的下标是从0开始的,因此 echo ${arr[1]} 输出的是数组 arr 中的第二个元素,即 y。

而当你使用 zsh ./xxx.sh 来执行脚本时,使用的是 zsh 解释器来执行。在 zsh 中,默认情况下,数组的下标是从1开始的,所以 echo ${arr[1]} 输出的是数组 arr 中的第一个元素,即 x。

因此,脚本的输出结果在 bash 和 zsh 中会有所不同,这取决于解释器的不同以及数组下标的起始值。如果想在 zsh 中也输出 y,可以将数组下标设置为0,即 arr=(x y z) 改为 arr=(0 x y z)。这样在 zsh 中也能得到与 bash 相同的输出结果。

 类似资料:
  • Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的

  • 我在pyenv环境中使用python和pip,但是当我尝试使用pip安装numpy时: 我犯了以下错误,有人知道我哪里会出错吗? 使用缓存的numpy-1.21收集numpy。0.zip(10.3 MB) 正在安装生成依赖项。。。完成了创建轮子的要求。。。完成错误:异常:回溯(最近一次调用): 文件“/Users/xxx/.pyenv/versions/3.7.11/lib/python3.7/s

  • 问题内容: 我刚刚在中编写了一些测试python代码,并按如下方式启动它: 一段时间后,我意识到自己的错误。我之所以说“一段时间”,是因为Python代码实际上已正确执行,就像在Python解释器中一样! 为什么我的Perl解释我的Python?看起来像这样: 有趣的是,如果我做相反的事情(即call ),则会遇到很多语法错误。 问题答案: 从perlrun, 如果该行既不包含单词“ perl”也

  • 如果我有一个struct Foo和一个struct Bar: 如果我初始化一个条并打印正确得到的值: 但是现在如果我声明这样的构造函数: 我失去了Bar::foo的默认构造,程序输出了32764 0 5! 为什么我不得不像这样无声地初始化每个成员变量: 只要我声明一个构造函数?在这种情况下,为什么默认构造不起作用?

  • 在MACBOOK上安装PYGAME时,尽管我在MAC上安装了Xcode,但还是出现了以下错误。我试图用pip命令安装pygame。 蟒蛇版本是3.7.3 pip和蟒蛇都在同一个文件夹中 用于安装的命令是:pip install pygame 收集pygame使用缓存 https://files.pythonhosted.org/packages/0f/9c/78626be04e193c062484

  • macOS 安装 Docker Desktop CE 系统要求 Docker Desktop for Mac 要求系统最低为 macOS Sierra 10.12。 安装 使用 Homebrew 安装 Homebrew 的 Cask 已经支持 Docker Desktop for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装: $ brew cask install doc