【问题标题】:Different result from bash and source commandsbash 和 source 命令的不同结果
【发布时间】:2021-12-29 10:57:25
【问题描述】:

我有一个非常简单的脚本名称 tt.sh,如下所示:

listFile=("A" "B" "C" "D")
echo ${listFile[1]} ${listFile[2]}

我尝试使用 source 和 bash 测试此脚本,但得到不同的结果:

./tt.sh 
B C
source tt.sh
A B

为什么 source 命令从 1 而不是 0 获取数组的开头? 我正在使用 MacOS

【问题讨论】:

  • 无法在 Linux bash 4.4.20(1)-release 上重现。
  • @nhthai,您使用的是哪个版本的 MacOS?
  • 作为我接受的答案,问题来自 bash 和 zsh 的不同行为。谢谢大家的检查!
  • 你为什么用“linux”来标记它?为什么使用“zsh”?为什么是“壳”?
  • @user1934428。我不是最初的提问者,我只是编辑了问题。但你是对的,nhthai 是从 zsh 采购的。如果您检查 6 天前接受的答案,您会发现问题已经解决。 nhthai 已经承认从 zsh 采购是已接受答案的第一条评论中的问题。 -- 最好的问候 -- 鲁迪

标签: linux bash macos shell zsh


【解决方案1】:

我没有 Mac,但我可以在 Arch Linux (2021) 上重现以下内容:

$ cat >tt.sh 
listFile=("A" "B" "C" "D")
echo ${listFile[1]} ${listFile[2]}
^D

$ bash tt.sh 
B C

$ zsh tt.sh 
A B

当我使用 bash 运行脚本时,它显示 B C。当我使用 zsh 运行时,它显示 A B

您真的在要采购的终端上使用 bash 吗?您可以仔细检查:

$ echo $0
bash

如果上面显示 bash,则表示您是。如果它显示 zsh,则表示您正在使用 zsh,因此您在获取时看到 zsh 行为。

Starting with macOS Catalina, the default is zsh。如果您真的喜欢 bash 行为,可以尝试在 Mac 设置上切换默认 shell。

【讨论】:

  • 知道了。我正在使用zsh,似乎“源”属于它。感谢您的帮助@Rudy。
  • 乐于助人! :-) @nhthai,顺便说一句,要从 zsh 获得快速 bash 会话,只需键入 bash。然后,您的来源将按照您的意愿行事。 :-)
  • 您可以使zsh 数组的行为更像bash 数组和setopt KSH_ARRAYS
  • @nhthai source 是内置的 shell,而不是外部命令。
【解决方案2】:

当你 source 它时使用当前的 shell,当你执行 shebang 中提到的可执行文件时使用。

bash 索引从 0 开始,其他一些 shell 的数组索引从 1 开始。

您当前的 shell 很可能不是 bash。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多