为何MacOS下使用./和source执行shell脚本得到不同运行结果
差异原因说明
- 根本原因是两种执行方式使用的shell解释器规则不同:MacOS 10.15 Catalina及之后版本的默认登录shell为zsh,而系统默认的
/bin/sh为bash兼容模式。 - 执行
./tt.sh时,会启动独立的子shell运行脚本:如果你没有在脚本头部指定shebang,系统默认调用
/bin/sh(bash兼容模式)执行。bash的数组默认从0开始计数,因此${listFile[1]}对应数组第二个元素B,${listFile[2]}对应第三个元素C,输出结果为B C。 - 执行
source tt.sh时,不会启动子shell,直接在当前登录的shell环境中加载运行脚本:你当前的登录shell默认是zsh,zsh的数组默认从1开始计数,因此
${listFile[1]}对应数组第一个元素A,${listFile[2]}对应第二个元素B,输出结果为A B。
统一行为的方案
- 方案1:在脚本头部指定固定解释器
要对齐bash规则,脚本第一行加#!/bin/bash,用source执行时可切换到bash环境再操作;要对齐zsh规则,脚本第一行加#!/bin/zsh即可。 - 方案2:在脚本头部强制数组下标规则
zsh环境下可添加配置强制对齐bash规则:setopt ksh_arrays,也可以添加setopt array_subscript_from_one强制下标从1开始。
内容的提问来源于stack exchange,提问作者nhthai
相关产品推荐
相关产品推荐

