-bash: /usr/local/bin/rbenv: /usr/bin/env: 错误的解释器:每次我尝试使用 npm 时都会出现权限被拒绝

-bash: /usr/local/bin/rbenv: /usr/bin/env: bad interpreter: Permission denied shows up everytime I try to use npm

每次我尝试使用 npm 时,我都会收到上面的错误。 Python 在我的电脑上运行良好,但 npm 和节点无法运行。

您收到的错误消息表明 可执行脚本 /usr/local/bin/rbenv 有一个 shebang 行指定可执行文件 /usr/bin/env (#!/usr/bin/env ...).

它说 Permission denied 的事实意味着,出于某种原因,/usr/bin/env 不可执行 ,或者至少 不能由您执行 .

这是非常不寻常,因为/usr/bin/env是一个经常使用的标准实用程序。我会在那里开始调查,例如通过 运行ning ls -l /usr/bin/env 来查看权限。

更广泛地说,问题是为什么 rbenv - 一个用于管理多个 Ruby 环境的实用程序 - 在这里涉及.

建议在进行故障排除时至少暂时停用它 - 注释掉 shell 的 profile/initialization 中加载 rbenv 的行文件(在 Bash 中:~/.bash_profile~/.bashrc - 参见 https://github.com/sstephenson/rbenv#how-rbenv-hooks-into-your-shell),然后打开一个新终端 window.

最后,关于 npm 如何 在 Unix 系统上 启动 的一些背景信息:

  • npm 是位于您的 $PATH 中的符号链接,它指向名为 npm-cli.js.
  • 的可执行脚本
  • npm-cli.js,尽管包含 JavaScript,但实际上使用 #!/bin/sh 作为其 shebang 行,这意味着 shell (sh) 最初 执行文件。
  • npm-cli.js 中的第 2 行实际上是 sh 执行的 行:
    • // 2>/dev/null; exec "`dirname "[=30=]"`/node" "[=30=]" "$@"
    • 该行以 // 开头,以便 node 稍后忽略它(因为在 JavaScript 中,它是一个 comment),鉴于该行的唯一目的是调用 node.
    • shell的角度来看,//是试图运行//作为command,它总是会失败,因此附加 2>/dev/null 以抑制错误消息。
    • exec "`dirname "[=35=]"`/node" "[=35=]" "$@" 然后有效地将手头脚本的调用中继到 node 可执行文件:
      • exec 用指定的命令替换 运行ning sh 实例。
      • "`dirname "[=39=]"`/node"` 指定 node 可执行文件与 npm symlink (这是有道理的,因为 nodenpm 总是安装在同一目录中。
      • [=43=] 指的是脚本本身(npm 符号链接)
      • "$@" 只是将传递给 npm 的所有参数通过。
  • 我的猜测是这种间接调用的原因是确保用于执行npm脚本的node可执行文件来自相同 Node.js 版本。如果使用简单的 #!/usr/bin/env node shebang,那么将使用 $PATHfirst 的任何 node 可执行文件。