执行source ~/.zshrc后zsh终端报错无法正常使用如何解决
问题描述
搭建React Native安卓开发环境配置环境变量时,按以下步骤操作后出现故障:
- 执行
vim ~/.zshrc打开zsh终端配置文件 - 在配置文件中粘贴添加
ANDROID_SDK_ROOT环境变量配置 - 执行
source ~/.zshrc尝试让新增配置立即生效
操作后终端输出如下报错:
/Users/username/.zshrc:source:26: no such file or directory: /Users/username/.zshrc# /Users/username/.zshrc:source:26: no such file or directory: /Users/username/.zshrc# /Users/username/.zshrc:source:26: no such file or directory: /Users/username/.zshrc# /Users/username/.zshrc:source:51: too many open files: /Users/username/.zshrc /Users/username/.zshrc:source:75: too many open files: /Users/username/.oh-my-zsh/oh-my-zsh.sh /Users/username/.zshrc:source:108: too many open files: /Users/username/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh /Users/username/.zshrc:source:109: too many open files: /Users/username/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh /opt/homebrew/Library/Homebrew/prefix.sh: line 40: echo: write error: Bad file descriptor /Users/username/.zshrc:source:112: no such file or directory: /nvm.sh /Users/username/.oh-my-zsh/oh-my-zsh.sh:source:61: too many open files: /Users/username/.oh-my-zsh/tools/check_for_upgrade.sh /Users/username/.oh-my-zsh/oh-my-zsh.sh:source:122: too many open files: /Users/username/.oh-my-zsh/lib/compfix.zsh compinit:503: cannot duplicate fd 0: too many open files /Users/username/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh:31: write error: bad file descriptor [256] done bindkey "$3"
故障现象:zsh终端完全无法正常工作,node -v这类基础命令无法运行,VSCode中打开zsh终端会立即终止退出。
故障原因
从首行报错no such file or directory: /Users/username/.zshrc#可以定位核心问题:粘贴配置时操作失误,在.zshrc中写入了错误的递归source规则,大概率是某行source命令末尾多拼了#字符,甚至直接写成了source .zshrc自身的逻辑。每次加载.zshrc时就会触发无限递归调用,短时间内耗尽系统文件描述符配额,触发too many open files报错,后续所有依赖文件读写、管道通信的命令和插件加载全部失败,最终导致zsh进程崩溃。
修复步骤
- 第一步:进入不加载zshrc的可用shell环境。由于zsh启动默认加载损坏的配置会直接崩溃,不要直接开默认终端:右键点击终端程序图标,选择「新建命令」,输入
/bin/bash后回车,进入bash环境,bash不会读取zsh的配置文件,可以正常执行文件操作命令。 - 第二步:备份损坏的配置文件,执行命令
cp ~/.zshrc ~/.zshrc.broken.bak,避免后续操作失误丢失原有配置。 - 第三步:编辑.zshrc修复错误配置,执行
vim ~/.zshrc打开配置文件,重点排查以下问题:- 定位到报错提示的第26行,删除所有路径末尾带多余
#的source命令行 - 查找所有目标为
~/.zshrc本身的source语句,全部删除——正常的zsh配置不需要自己source自己 - 检查新增的ANDROID_SDK_ROOT配置,确保格式正确,没有混入多余的source指令,标准配置参考:
export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk export PATH=$PATH:$ANDROID_SDK_ROOT/emulator export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools - 定位到报错提示的第26行,删除所有路径末尾带多余
- 第四步:保存修改退出vim,执行
exec zsh重新加载zsh,验证终端是否可以正常启动,基础命令是否能正常运行。 - 第五步:如果上述操作后仍无法正常启动,可以先清空损坏配置恢复基础zsh功能:执行
echo "" > ~/.zshrc重置配置文件,等zsh可以正常进入后,再从之前的备份文件~/.zshrc.broken.bak中逐行恢复原有配置,每恢复几行执行一次source ~/.zshrc验证,定位残留的错误规则。
内容的提问来源于stack exchange,提问作者nuru
相关产品推荐
相关产品推荐

