如何执行"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
. 之后
在我的 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
. 之后