如何在 bash 脚本中调用“nvm use”,并在脚本执行后保留所选节点版本?

Posted

技术标签:

【中文标题】如何在 bash 脚本中调用“nvm use”,并在脚本执行后保留所选节点版本?【英文标题】:How can I call "nvm use" in a bash script, and have the selected node version retained after the script executes? 【发布时间】:2021-05-28 01:07:56 【问题描述】:

对于需要从 Node.js 12 更新到 14 的构建过程,我想要一个 bash 脚本来检测是否安装了nvm,如果是,请执行nvm use v14(或nvm install v14,如果需要) ),然后我希望 nvm 选择的节点版本在 bash 脚本终止后保持在 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 脚本,它所做的任何事情在执行完之后都是持久的。我也应该有办法实现这一点。

【问题讨论】:

【参考方案1】:

我想如果你用 nvm 默认设置一个别名,

nvm alias default 14.0.0

节点版本将在任何新的终端实例中保持不变。

【讨论】:

在那里看起来不错...但遗憾的是,它没有用。 嗯……也许吧。如果我关闭我所在的终端,然后再次打开终端,那么新的默认值就会启动。这可能就足够了,只要从主脚本启动的另一个进程也继承了这个更改,而不退出原始终端。你至少应该为至少让我分道扬镳而投赞成票。 :) 你可以试试这里提到的选项 - ***.com/questions/47190861/…

以上是关于如何在 bash 脚本中调用“nvm use”,并在脚本执行后保留所选节点版本?的主要内容,如果未能解决你的问题,请参考以下文章

每次目录中有 .nvmrc 文件时自动运行 `nvm use`

如何编写文本文件,然后在同一个 Bash 脚本中读取它?

Bash 脚本:如何确保脚本在使用“或”(||) 条件调用的函数中出现任何错误时退出?

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

如何使用 bash -c 调用 bash 脚本函数 [重复]

text auto`nvm use`