-bash:/ usr / local / bin / rbenv:/ usr / bin / env:bad interpreter:每次尝试使用npm时都会显示权限被拒绝

时间:2015-04-12 19:05:03

标签: node.js npm env

每当我尝试使用npm时,我都会收到上述错误。 Python在我的计算机上工作正常,但是npm和节点永远不会工作。

1 个答案:

答案 0 :(得分:3)

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

事实上, Permission denied表示由于某种原因,/usr/bin/env 不可执行 ,或者至少不是你可以执行

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

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

建议在排除故障时至少暂时停用 - 注释掉在shell的配置文件/初始化文件中加载rbenv的行(在Bash中:~/.bash_profile或{{ 1}} - 见https://github.com/sstephenson/rbenv#how-rbenv-hooks-into-your-shell),然后打开一个新的终端窗口。

最后,在Unix系统上有一些关于~/.bashrc 正常启动的背景信息:

  • npm是位于npm中的符号链接,指向名为$PATH的可执行脚本。
  • npm-cli.js,尽管包含JavaScript,但实际上使用npm-cli.js作为其shebang行,这意味着 shell #!/bin/sh最初执行文件。
  • sh中的第二行实际上是npm-cli.js执行的唯一行:
    • sh
    • 该行以// 2>/dev/null; exec "`dirname "$0"`/node" "$0" "$@"开头,以便节点稍后忽略它(因为,在JavaScript中,它是注释),因为该行的唯一目的是调用节点
    • shell 的角度来看,//是尝试将//作为命令运行,它总是失败,所以{{附加1}}以抑制错误消息。
    • //然后有效地将手头脚本的调用转发给2>/dev/null可执行文件:
      • exec "`dirname "$0"`/node" "$0" "$@"使用指定的命令替换正在运行的node实例。
      • exec node 可执行文件指定为与sh 符号链接位于同一目录中(这是有道理的,因为{ {1}}和"`dirname "$0"`/node"`始终安装在同一目录中。)
      • npm指的是脚本本身(node符号链接)
      • npm只传递传递给$0的所有参数。
  • 我的猜测是这种间接调用的原因是为了确保用于执行npm脚本的"$@"可执行文件来自相同的 Node.js版。如果使用了简单的npm shebang,那么node中的npm可执行文件首先将会被使用。