为何zshrc中条件块内外source文件行为不同?命令执行异常解析
提问:~/.zshrc中第一段代码正常运行,第二段报错的原因是什么?
无报错写法
BASE16_SHELL="$HOME/.config/base16-shell/" [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ] && source "$BASE16_SHELL/profile_helper.sh" base16_classic-dark
报错写法
if [ -d "$HOME/.config/base16-shell" ]; then BASE16_SHELL="$HOME/.config/base16-shell/" [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ] && source "$BASE16_SHELL/profile_helper.sh" base16_classic-dark fi
报错信息
/home/freddiehaddad/.zshrc:44: command not found: base16_classic-dark
补充说明
我并没有同时使用两段代码,只是想让.zshrc更健壮,仅在依赖存在时执行代码块。
后续测试更新
我怀疑问题和source命令的行为有关,以下是测试结果:
可正常运行的写法
BASE16_SHELL="$HOME/.config/base16-shell/" if [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ]; then source "$BASE16_SHELL/profile_helper.sh" fi base16_classic-dark
放入if块内报错的写法
将base16_classic-dark命令放入if块内会报相同错误:
BASE16_SHELL="$HOME/.config/base16-shell/" if [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ]; then source "$BASE16_SHELL/profile_helper.sh" base16_classic-dark fi
同样报错的写法
if [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ]; then BASE16_SHELL="$HOME/.config/base16-shell/" source "$BASE16_SHELL/profile_helper.sh" fi base16_classic-dark
奇怪的现象
以下写法实际能运行,但仍输出相同错误信息:
BASE16_SHELL="$HOME/.config/base16-shell/" if [ -n "$PS1" ] && [ -s "$BASE16_SHELL/profile_helper.sh" ]; then source "$BASE16_SHELL/profile_helper.sh" base16_classic-dark fi
最新怀疑
继续测试后发现,问题似乎和BASE16_SHELL变量的作用域/可见性有关,添加export前缀也没用,目前只是盲目尝试。
内容的提问来源于stack exchange,提问作者Freddie Haddad
相关产品推荐
相关产品推荐

