You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:45:08