zsh source加载bash脚本出现parse error near `|`报错是什么原因
问题原因及解决方案
核心诱因
- 直接运行脚本时,系统会读取脚本首行的
#!/bin/bash声明,调用bash解释器执行脚本,语法完全兼容,因此不会报错。 - 使用
source命令执行脚本时,脚本内容会直接加载到当前的zsh环境中运行,而zsh和bash的[[ ]]正则匹配语法存在差异:zsh默认解析规则中,=~右侧未用引号包裹的|不会被识别为正则的交替匹配符,反而会被判定为非法的管道语法符号,因此抛出parse error near '|'错误。你提供的.zshrc配置没有修改正则相关的默认行为,问题本质是两种Shell的语法差异,和配置无关。
可选用的解决方案
方案1:修改正则写法兼容两种Shell
把正则匹配行的|转义,修改为:
[[ ! $OPTARG =~ 1\|2\|3 ]] && { echo "Incorrect architecture provided" }
修改后无论是直接用bash运行,还是用zsh source都可以正常执行。
方案2:在脚本开头增加zsh兼容选项
在脚本最前面加入Shell判定和zsh兼容配置,让zsh的正则匹配行为和bash对齐:
# 仅zsh环境下生效 if [ -n "$ZSH_VERSION" ]; then setopt BASH_REMATCH fi
这个方案不需要修改原有正则逻辑,兼容两种Shell的执行。
方案3:source时指定用bash执行
如果不想修改脚本,也可以直接用bash加载运行脚本,不要用当前zsh的source:
bash -c "source ./my_script.sh -a 1"
内容的提问来源于stack exchange,提问作者Eugene Popovych
相关产品推荐
相关产品推荐

