如何执行" sudo nvm"?

时间:2018-03-06 11:51:22

标签: node.js shell unix terminal nvm

在我的Mac上,我想将一些需要su权限的软件包迁移到另一个节点版本。

我使用自制软件来安装nvm,现在我需要执行sudo nvm或--reinstall-packages将失败。

me@MacBook:~$ sudo nvm
sudo: nvm: command not found
me@MacBook:~$ sudo node -v
v5.4.1
me@MacBook:~$ sudo npm -v
3.3.12
me@MacBook:~$ nvm ls
->       v5.4.1
         v9.6.1
         system
default -> 5.4.1 (-> v5.4.1)
node -> stable (-> v9.6.1) (default)
stable -> 9.6 (-> v9.6.1) (default)
iojs -> N/A (default)
lts/* -> lts/carbon (-> N/A)
lts/argon -> v4.8.7 (-> N/A)
lts/boron -> v6.13.0 (-> N/A)
lts/carbon -> v8.9.4 (-> N/A)

我认为无法找到该命令,因为sudo正在寻找不同的路径。我在/usr/local/opt/nvm找到了nvm.sh,但是:

sudo /usr/local/opt/nvm/nvm.sh ls

什么都不返回。

即使

/usr/local/opt/nvm/nvm.sh ls

什么都不返回,所以我怀疑这是错误的shell脚本。

如何用sudo明确调用nvm?

3 个答案:

答案 0 :(得分:3)

考虑定义一个shell函数包装器:

nvmsudo() { sudo bash -lic '. /usr/local/opt/nvm/nvm.sh && nvm "$@"' _ "$@"; }

...此后:

nvmsudo --version

...或...

nvmsudo install 5.4.1 --reinstall-packages-from=9.6.1

解释上述逻辑:

  • 使用-l-i参数进行bash,确保运行目标用户的dotfiles(在本例中为root),这似乎是nvm所必需的这是正确的操作。
  • bash -c的下一个参数必须是一个脚本。后面的参数在执行脚本的上下文中变为$0$1等。
  • 函数上下文中的
  • "$@"引用函数的完整参数集。
  • "$@"脚本上下文中的
  • bash -c引用$1之后的完整参数集(因此跳过_)传递给shell -c 1}}。

答案 1 :(得分:0)

尝试使用以下命令: -

sudo -u <username> /usr/local/opt/nvm/nvm.sh

首先不要使用ls,如果有效则只能使用ls

答案 2 :(得分:0)

我发现了一个解决方案,即使在我看来这不是一个漂亮的解决方案。

我有一个误解,怀疑nvm.shnvm直接调用。实际上,nvm.sh包含几个在用户shell环境中加载的shell函数,但不包含在root shell环境中。

首先,I enabled the root user并在终端登录。然后我必须source nvm.sh的内容来定义su环境中的函数。然后我可以运行命令,su找到它:

me@MacBook:~$ su
Password:
root@MacBook:/Users/me$ source /usr/local/opt/nvm/nvm.sh
root@MacBook:/Users/me$ nvm --version
0.33.8

作品!