如何在 bash 脚本中调用 "nvm use",并在脚本执行后保留选定的节点版本?

How can I call "nvm use" in a bash script, and have the selected node version retained after the script executes?

对于需要从 Node.js 12 更新到 14 的构建过程,我想要一个 bash 脚本来检测是否安装了 nvm,如果安装了,则执行nvm use v14(或 nvm install v14,如有必要),然后我希望在 bash 脚本终止后 ,nvm 选择的节点版本保持在 14 ,不仅仅是脚本的持续时间。

我可以用这个脚本切换到 v14,但是在脚本终止后,shell 环境仍然是 v12:

#!/bin/bash

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
source ~/.bashrc

nvm --version
echo $NVM_BIN
node --version
nvm use v14
echo $NVM_BIN
node --version

仅在 bash 脚本中执行 nvm 命令很痛苦,因为 nvm 不是真正的命令,而是 shell 函数,并且脚本必须使用前三行为脚本设置 nvm

输出为:

0.33.11
/home/pi/.nvm/versions/node/v12.21.0/bin
v12.21.0
Now using node v14.16.0 (npm v6.14.11)
/home/pi/.nvm/versions/node/v14.16.0/bin
v14.16.0

脚本完成后:

我认为技巧可能是在脚本退出时确保环境变量 NVM_BIN 保留在 v14 路径中,但我不知道该怎么做。实际上,我认为通常不允许执行脚本的shell更改父shell中的环境变量。

然而,nvm 命令本身就是一个 shell 脚本,无论它做什么,它在执行完成后都是持久的。我也应该有办法做到这一点。

我认为如果你默认使用 nvm 设置别名,

nvm alias default 14.0.0

节点版本将在任何新的终端实例中持续存在。