Zsh脚本检测OS时出现'= not found'错误,求原因分析
问题:Zsh脚本检测操作系统时出现
load_config:3: = not found错误 我想用Zsh脚本检测操作系统并加载对应配置,但运行脚本时出现难以理解的load_config:3: = not found错误,错误信息极少无法明确原因。脚本代码及运行日志如下:
原脚本代码
function load_config(){ os=$(uname -a) echo $os if [[`echo $os | grep -o kali | tail -1` == "kali"]]; then for FILE in ~/.config/zsh_config/kali/*.zsh; do source $FILE done elif [[`echo $os | grep -o MANJARO | tail -1` == "MANJARO"]]; then for FILE in ~/.config/zsh_config/manjaro/*.zsh; do source $FILE done elif [[`echo $os | grep -o MacBook | tail -1` == "MacBook"]]; then for FILE in ~/.config/zsh_config/osx/*.zsh; do source $FILE done else echo 'Unknown OS!' fi }
运行日志
$ load_config Linux kali 5.18.0-kali5-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.5-1kali5 (2022-07-04) x86_64 GNU/Linux load_config:3: = not found
错误原因
这个错误是**[[ 和反引号()之间缺少空格**导致的。Zsh中[[`是语法关键字,必须和后续表达式保留空格,否则会被解析成一个不存在的命令`[[`(把`[[`和后面的反引号内容连在一起),同时后面的`==`会被错误拆分,最终触发"= not found"的错误。
修复后的脚本
function load_config(){ os=$(uname -a) echo $os # 给[[后添加空格,同时用$()替代反引号提升可读性 if [[ $(echo $os | grep -o kali | tail -1) == "kali" ]]; then for FILE in ~/.config/zsh_config/kali/*.zsh; do source $FILE done elif [[ $(echo $os | grep -o MANJARO | tail -1) == "MANJARO" ]]; then for FILE in ~/.config/zsh_config/manjaro/*.zsh; do source $FILE done elif [[ $(echo $os | grep -o MacBook | tail -1) == "MacBook" ]]; then for FILE in ~/.config/zsh_config/osx/*.zsh; do source $FILE done else echo 'Unknown OS!' fi }
额外优化建议
- 用
$()替代反引号:反引号在嵌套使用时容易出现语法问题,$()的可读性和兼容性更优 - 简化系统检测逻辑:可以直接用
uname -s获取内核名称,或者lsb_release -i获取发行版信息,避免依赖uname -a中的可变字符串
内容的提问来源于stack exchange,提问作者rivi mizuiro
相关产品推荐
相关产品推荐

