Fish Shell扩展内置cd后无法使用`cd -`切换至原目录
解决Fish Shell自定义cd函数后
cd -失效的问题 你的问题出在参数传递错误、conda激活/停用逻辑写反,另外Fish的上一次目录确实不是用环境变量维护的,而是内置的shell变量$OLDPWD,不需要手动设置。
问题分析
- 参数传递错误:你写的
builtin cd $param $argv是多余的,$param在Fish里完全没必要,直接传递$argv就能把所有参数(包括-)正确交给内置cd命令,错误的参数格式导致cd -无法被正确解析。 - 逻辑判断反了:第二个分支里,你判断“当前目录包含
$CONDACONFIGDIR”时就停用conda,这完全搞反了——应该是当前目录不在$CONDACONFIGDIR及其子目录下时才执行停用。 - OLDPWD的误解:Fish的
$OLDPWD是shell本地变量,不是环境变量(所以env命令看不到),内置cd会自动维护它,不需要手动用set -gx设置。
修正后的代码
function cd -d "cd with auto conda activation" # 正确调用内置cd,传递所有参数 builtin cd $argv # 检查当前目录是否存在.condaconfig文件 if test -f ./.condaconfig set -gx CONDACONFIGDIR (pwd) conda activate (cat ./.condaconfig) else if [ -n "$CONDACONFIGDIR" ] # 只有当当前目录不在CONDACONFIGDIR路径下时,才停用conda if not string match -q -- "$CONDACONFIGDIR*" (pwd) set -gx CONDACONFIGDIR "" conda deactivate end end end
修正说明
- 去掉了多余的
$param,确保cd -这类参数能被内置cd正确处理,恢复切换到上一目录的功能。 - 修正了conda停用的判断逻辑,现在只有离开
$CONDACONFIGDIR及其子目录时才会停用环境,避免在子目录里误触发。 - 移除了无效的
OLDPWD手动设置,依赖Fish内置的变量维护机制即可。
内容的提问来源于stack exchange,提问作者glass-ships
相关产品推荐
相关产品推荐

