繁体   English   中英

如何执行“ sudo nvm”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM