[英]How to execute “sudo 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
,但是:
sudo /usr/local/opt/nvm/nvm.sh ls
什么也不返回。
甚至
/usr/local/opt/nvm/nvm.sh ls
什么也不返回,所以我怀疑这是错误的shell脚本。
如何使用sudo显式调用nvm?
考虑定义一个外壳函数包装器:
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操作可确保运行目标用户的点文件(在本例中为root
),这对于nvm
的正确操作来说似乎是必需的。 bash -c
的下一个直接参数必须是脚本。 在执行脚本的上下文中,其后的参数变为$0
, $1
等。 "$@"
是指函数的完整参数集。 bash -c
脚本上下文中的"$@"
指的是-c
之后传递给shell的完整参数集(从$1
开始,因此跳过_
)。 请尝试以下命令:-
sudo -u <username> /usr/local/opt/nvm/nvm.sh
不要先使用ls
,如果可以,请尝试使用ls
我找到了解决方案,即使我认为这不是一个很好的解决方案。
我有一个误解,怀疑nvm.sh
被直接调用nvm
。 实际上, nvm.sh
包含几个在用户外壳环境中加载的外壳函数,但不在根外壳环境中加载。
首先, 启用root用户并在终端上登录。 然后,我不得不source
的内容nvm.sh
在苏环境来定义的功能。 然后我可以运行命令,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
作品!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.