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

lea*_*nMN 1 env node.js npm

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

mkl*_*nt0 5

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

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

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

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

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

最后,一些关于如何npmUnix 系统上正常启动的背景信息:

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