Node.js 如何执行;sudo nvm”是什么;?

Node.js 如何执行;sudo nvm”是什么;?,node.js,shell,unix,terminal,nvm,Node.js,Shell,Unix,Terminal,Nvm,在我的Mac上,我想将一些需要su权限的包迁移到另一个节点版本 我使用自制软件安装nvm,现在我需要执行sudo nvm或——重新安装软件包将失败 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

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

我使用自制软件安装nvm,现在我需要执行sudo nvm或
——重新安装软件包将失败

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
不返回任何内容

甚至

不返回任何内容,因此我怀疑这是错误的shell脚本


如何使用sudo显式调用nvm?

尝试使用以下命令:-

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

不要先使用
ls
,如果它有效,那么只尝试使用
ls

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

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

首先,在终端登录。然后我必须
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

工作

考虑定义外壳函数包装器:

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
    脚本上下文中的“$@”引用了完整的参数集(从
    $1
    开始,因此跳过在
    -c
    之后传递给shell的

  • sudo-u me nvm
    (使用我的实际ofc用户名)导致相同的错误
    sudo:nvm:command not found
    。另外,我尝试像您一样在没有任何参数的情况下调用nvm.sh,它不会返回任何结果。我仍然认为这是错误的shell文件…打开shell文件并检查其中的逻辑,而不是点击并尝试。它是nvm的实际来源。它达到nvm_过程_参数,idk为什么它不工作。我还试着直接使用
    cd/usr/local/opt/nvm/
    /nvm.sh
    。当你像
    /nvm.sh
    那样运行时,会出现什么错误?在
    nvm.sh
    中放入一些
    echo
    语句,检查这些echo语句是否打印出来,就像
    echo“teat 1”
    谢谢,但是使用
    nvmsudo--version
    返回
    \:/opt/local/opt/nvm/nvm.sh:没有这样的文件或目录
    ,你说“跳过
    \
    ”是什么意思?当然,替换文件名使其实际上是正确的。“跳过
    \
    ”意味着因为
    \
    变成了
    $0
    (正如您所注意到的,它在错误消息中用作脚本的名称),所以它不包含在
    “$@”
    中。我想你可能会用
    nvmsudo
    替换
    nvmsudo:…
    来自shell的错误消息,如果你愿意的话;这就是说,
    \uu
    是一个传统的占位符,因此使用该字符串具有可读性。糟糕,感谢您更正了答案,但是它似乎仍然无法解析参数,因为最后一个命令返回
    ,如果提供了--reinstall packages from,它必须指向已安装版本的node。
    。如果需要将其视为交互式登录shell来获取相关的点文件,则您可能需要类似于
    bash-lic
    的内容,但我们现在正在对您的计算机如何配置的细节进行假设。@other,此注释线程前面讨论的调试步骤同样适用。0.33.8版本是什么?如何更改它?它与node
    node-v的输出不同,它是nvm(节点版本管理器)的版本,而不是节点本身。
    
    nvmsudo install 5.4.1 --reinstall-packages-from=9.6.1