-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 (这是有道理的,因为 node
和 npm
总是安装在同一目录中。
[=43=]
指的是脚本本身(npm
符号链接)
"$@"
只是将传递给 npm
的所有参数通过。
- 我的猜测是这种间接调用的原因是确保用于执行
npm
脚本的node
可执行文件来自相同 Node.js 版本。如果使用简单的 #!/usr/bin/env node
shebang,那么将使用 $PATH
中 first 的任何 node
可执行文件。
每次我尝试使用 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
用指定的命令替换 运行ningsh
实例。"`dirname "[=39=]"`/node"`
指定 node 可执行文件与npm
symlink (这是有道理的,因为node
和npm
总是安装在同一目录中。[=43=]
指的是脚本本身(npm
符号链接)"$@"
只是将传递给npm
的所有参数通过。
- 我的猜测是这种间接调用的原因是确保用于执行
npm
脚本的node
可执行文件来自相同 Node.js 版本。如果使用简单的#!/usr/bin/env node
shebang,那么将使用$PATH
中 first 的任何node
可执行文件。