将Bash脚本转换为Fish脚本以检测.nvmrc文件并修复异常
修复并转换Bash的.nvmrc自动加载脚本到Fish
先说说原Bash脚本的作用:它会在你每次切换目录时,自动检查当前目录下有没有.nvmrc文件,如果有的话就执行nvm use,帮你切换到对应版本的Node.js。核心是通过Bash的PROMPT_COMMAND钩子,每次显示命令提示符前都跑一遍检查逻辑。
再看你现在的Fish脚本,几个地方出了问题导致它没法正常工作:
- Fish里给变量赋值必须用
set命令,你写的OLD_PWD="$PWD"不符合Fish语法 - 你只定义了函数,但没把它绑定到Fish的提示符事件上,所以函数根本不会自动执行
- 使用
bass调用Bash命令的写法不对,需要把整个Bash命令用单引号包起来,才能正确解析 - 条件判断的写法虽然能用,但换成Fish更常用的
test语法会更稳妥
下面是修复好的Fish脚本,每一步都加了注释说明:
# 初始化变量,用来记录上一次的工作目录 set OLD_PWD "" # 定义自动加载nvm的核心函数 function nvm_auto_load # 检查当前目录是否和上次的目录不一样 if test "$OLD_PWD" != "$PWD" # 更新变量为当前目录 set OLD_PWD "$PWD" # 检查当前目录下是否存在.nvmrc文件 if test -e .nvmrc # 用bass在Bash环境中加载nvm脚本,然后执行nvm use # --no-use参数是避免nvm默认加载默认版本,只加载环境变量 bass 'source ~/.nvm/nvm.sh --no-use && nvm use' end end end # 先执行一次函数,确保当前目录如果有.nvmrc能立刻加载 nvm_auto_load & # 将函数绑定到fish_prompt事件,每次显示命令提示符前自动执行 add fish_prompt nvm_auto_load
把这段脚本放到你的Fish配置文件里(比如~/.config/fish/config.fish),重启Fish或者执行source ~/.config/fish/config.fish就能生效了。以后只要切换到有.nvmrc的目录,就会自动帮你切换Node.js版本啦!
内容的提问来源于stack exchange,提问作者s-leg3ndz
相关产品推荐
相关产品推荐

