Bash脚本执行参数展开时触发段错误的问题排查求助
Bash 5.2.37 在 macOS 15.3.1 下执行
${BASH_SOURCE%/*} 触发段错误 环境信息
- macOS 15.3.1 (aarch64)
- 默认Shell:Zsh 5.9(搭配Oh-my-zsh)
- 使用的Bash版本:Homebrew安装的5.2.37(1)-release(路径:
/Users/my.name/.homebrew/bin/bash),系统自带Bash路径为/bin/bash
问题描述
通过Homebrew安装的pyenv执行任何操作都会触发段错误,排查后定位到Shell参数展开步骤,编写最小复现脚本后发现,执行${BASH_SOURCE%/*}这一行时会直接崩溃。
复现脚本
#!/usr/bin/env bash set -e set -x echo "ONE 1" echo "SOURCE: ${BASH_SOURCE}" echo "${BASH_SOURCE%/*}" echo "FROB"
执行输出
--> ./silly.sh + echo 'ONE 1' ONE 1 + echo 'SOURCE: ./silly.sh' SOURCE: ./silly.sh [1] 49693 segmentation fault ./silly.sh
补充调试信息
在脚本中添加typeset -p BASH_SOURCE、type -a bash和bash --version后,输出如下:
--> ./silly.sh + echo 'ONE 1' ONE 1 + echo 'SOURCE: ./silly.sh' SOURCE: ./silly.sh + typeset -p BASH_SOURCE declare -a BASH_SOURCE=([0]="./silly.sh") + type -a bash bash is /Users/my.name/.homebrew/bin/bash bash is /bin/bash + bash --version GNU bash, version 5.2.37(1)-release (aarch64-apple-darwin24.3.0) Copyright (C) 2022 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [1] 59817 segmentation fault ./silly.sh
可能的原因及验证方向
Homebrew编译的Bash与aarch64 macOS兼容性bug
该问题大概率是Homebrew编译的Bash 5.2.37在Apple Silicon架构的macOS 15上存在底层bug,具体是对数组变量BASH_SOURCE进行参数展开时的内存访问错误。可以尝试:- 使用系统自带的Bash(
/bin/bash,版本3.2)运行脚本,确认是否崩溃; - 重新安装Homebrew的Bash,或升级到最新可用版本;
- 尝试在脚本中显式指定数组索引:将
${BASH_SOURCE%/*}改为${BASH_SOURCE[0]%/*},看是否能避免崩溃。
- 使用系统自带的Bash(
Shell环境变量冲突
虽然默认Shell是Zsh,但执行Bash脚本时可能继承了Zsh或Oh-my-zsh的某些环境变量,干扰了Bash的正常运行。可以尝试在干净环境下运行脚本:env -i ./silly.sh若崩溃消失,则说明是环境变量导致的冲突。
内容的提问来源于stack exchange,提问作者Matt Ford
相关产品推荐
相关产品推荐

