好想发疯
为什么为什么,kamisama,为什么这种奇怪的bug总要发生在我的身上,呀哒呦呀哒呦,一定是哪里做错了desu,demo…bokuwa真的找到了解决の道啊!不要小看Google的力量啊铁咩(怒音!
TL; DR
ohmyzsh的配置文件里给某个 xxx
定义了一个alias yyy
,你在后面又定义了这个 xxx
相关的函数,并且没有用标准的函数写法,就会出现这个问题
这里把这个函数改成标准的函数写法就可以了,不要把这个函数当成变量用
问题描述
每次使用ohmyzsh更改了配置以后,执行 source ~/.zshrc
时总会弹出这个警告
(eval):43: defining function based on alias `conda'
(eval):43: parse error near `()'
因为平时用python环境经常用到conda,所以这个配置文件里也会有conda相关的函数,但如果只是简单的函数定义其实是不会有这个问题的,那么问题出在哪呢?
问题溯源
上面的问题,其实是因为除了正常使用conda外,我还给conda链接了一个别名,毕竟每次 conda install
时候配置检查真的是太痛苦了,所以我就转用了 mamba
(这里安利一下,貌似很多人都不知道还有这么好用的一个替代库),然后给 conda
起了一个别名,这样我顺手用的时候就直接调用 mamba
了:
alias conda='mamba'
但!!! 如果我也只是起了一个别名就算了,这个错误还是不会发生,这里要提一句,如果你也用conda的话,你会发现你的 .bashrc
或者 .zshrc
或者什么shell的配置文件里有这么一段
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/thinszx/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/thinszx/miniconda3/etc/profile.d/conda.sh" ]; then. "/home/thinszx/miniconda3/etc/profile.d/conda.sh"elseexport PATH="/home/thinszx/miniconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<
问题就出在前三行,其实这里是定义了一个函数 __conda_setup
,每次shell初始化都会调用一次这个函数,这个函数调用了 zsh
的 hook
特性,可以粗略地理解成这里把 conda
指令加到 zsh
的环境变量里去了,然后你就可以调用它啦,但是这个函数其实并不是按照标准的shell函数写法定义的,有点像那种函数式编程,所以把这一行改成标准function写法就可以
# ...
function __conda_setup {"$('/home/thinszx/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"}
# ...
原因
懒得找了哈哈哈,不想找了,等我研究生顺利毕业再说吧,有人刷到了记得提醒我(其实下面第一个参考链接说了原因,不过我还没看源码)
参考
https://github.com/ohmyzsh/ohmyzsh/issues/6723#issue-313463147
https://www.digitalocean.com/community/tutorials/how-to-use-editors-regex-and-hooks-with-z-shell