如何执行"sudo nvm"?

How to execute "sudo nvm"?

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

我使用 homebrew 安装 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

returns 没有。

甚至

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

returns 什么都没有,所以我怀疑这是错误的 shell 脚本。

如何使用 sudo 显式调用 nvm?

尝试使用以下命令:-

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

先不要用ls,如果可以再用ls

试试

我找到了一个解决方案,即使在我看来这不是一个完美的解决方案。

我有一个误会,怀疑 nvm.sh 直接在 nvm 上被调用。事实上,nvm.sh 包含几个 shell 函数,它们在用户 shell 环境中加载,但在根 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

有效!

考虑定义一个 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

解释一下上面的逻辑:

  • 对 bash 使用 -l-i 参数确保目标用户(在本例中 root)的点文件是 运行,这nvm 的正确操作似乎是必需的。
  • bash -c 的下一个参数必须是脚本。在执行脚本的上下文中,后面的参数变为 [=18=]</code> 等。</li> <li><code>"$@" 在函数上下文中指的是函数的完整参数集。
  • "$@"bash -c 脚本的上下文中指的是传递给 [=46] 的完整参数集(从 </code> 开始,因此跳过 <code>_) =] 在 -c.
  • 之后