节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录

Posted

技术标签:

【中文标题】节点脚本可执行文件在 Mac 上不起作用:env: node\\r: 没有这样的文件或目录【英文标题】:Node script executable not working on Mac : env: node\r: No such file or directory节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录 【发布时间】:2015-08-01 09:59:44 【问题描述】:

我已经创建了我的节点脚本可执行文件来执行一些任务。在 Windows 上,我的节点脚本运行良好。但在 Mac OS X (Yosemite) 上,它不起作用。

我的节点脚本已在 Windows 上发布。

我的节点脚本是通过 npm 命令安装的:

npm install -g task-app

我的节点脚本有这第一行:

#! /usr/bin/env node

我尝试了许多解决方案来解决我的问题,但我仍然卡住了。

这是我使用的这些解决方案:

    卸载并重新安装 Node.js 执行此命令 为节点创建链接:sudo ln -s /usr/bin/nodejs /usr/local/bin/node 使用以下命令设置我的路径:export PATH=$PATH:/usr/local/bin/node

您还有其他解决方案要提出吗?

编辑:

我的脚本的开头:

#! /usr/bin/env node

var grunt = require('grunt');

//Get parameters from command line
var args = process.argv.splice(2);

[...]

【问题讨论】:

我在使用 yarn 的 macos 上安装 npmjs.com/package/json-mock-server 时遇到了这个问题,但没有使用 npm。在这两种安装中,包中的一些文件都有 crlf 结尾,但使用 npm 安装时似乎无关紧要。我将在此处创建一个关于此链接的新问题。 【参考方案1】:

原因: 这通常是由于行尾的差异,尤其是 LF 与 CRLF 的差异。 Linux 和 macOS 等 Unix 系统默认使用换行符 LF 来换行。另一方面,Windows 是特殊的,默认情况下使用 CR/LF 、回车和换行符。 参考:https://qvault.io/clean-code/line-breaks-vs-code-lf-vs-crlf/

解决方案: 对于 mac 用户,在发生错误的文件中将 CRLF 更改为 LF。

【讨论】:

【参考方案2】:

第一个命令告诉 Git 永远不要改变行尾(将来)。接下来,我们通过从 Git 的索引中删除每个文件来刷新每个存储库,最后,重写 Git 索引以获取所有新的行尾。这修复了在克隆每个存储库时引入本地文件系统的 CRLF。

运行这个命令:

git config core.autocrlf false
git rm --cached -r .
git reset --hard

【讨论】:

【参考方案3】:

MS-DOS 插入的回车被解释为脚本解释器名称的一部分,顺便说一下,这是 Un*x 系统的正确行为。因此,系统会查找文件/usr/bin/node\r 而不是/usr/bin/node。正如其他人指出的那样,npm 现在通过剥离换行符来“解决”问题,这是一种有点可疑的行为。

带有以 DOS 行结尾的 shebang 行的可执行文件已损坏,必须由作者而非用户、npmyarn 修复。在撰写本文时,几乎没有理由仍然使用 DOS 行尾,即使您在 Windows 系统上进行开发。但是您至少应该在将它们分发给公众之前修复您生成的文件。请参阅https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings 了解如何配置 git 以正确处理行尾。

【讨论】:

【参考方案4】:

正如 PauloDev 上面所说,这是一个 Mac/Windows 行尾问题。详细地说,如果您使用的是nvm,则需要先找到您的脚本(在我的情况下,我使用的是express-mvc-generator):

# install dos2unix
brew install dos2unix

# output the full path of your node version
which node 
>> /Users/<username>/.nvm/versions/node/v8.0.0/bin/node

# confirm the file path
cat /Users/<username>/.nvm/versions/node/v8.0.0/lib/node_modules/express-mvc-generator/bin/express

# convert the line endings
sudo dos2unix /Users/<username>/.nvm/versions/node/v8.0.0/lib/node_modules/express-mvc-generator/bin/express

# then run your script

【讨论】:

【参考方案5】:

从 npm@^5.4.0 开始,这应该不再是问题了。 npm 现在将自动转换为正确的行尾。见https://github.com/npm/npm/issues/12371。

然而,这仍然是 yarn 中的一个问题:https://github.com/yarnpkg/yarn/issues/5480。

如果你来到这个页面是因为你在使用 yarn 而不是 npm 时遇到了这个错误,就像我一样,你可能想要考虑使用 npm 而不是 yarn。无论如何(可以说),npm 目前拥有大多数 yarn 的最佳功能。

【讨论】:

【参考方案6】:

脚本中的换行存在问题。确保#!/usr/bin/env node 后跟\n(unix 风格)而不是\r\n(windows/dos 风格)。 要解决此问题,请使用 tr 命令从文件中删除 \r

cat your_script.js | tr -d '\r' > fixed_script.js

【讨论】:

我试过你的命令,但是当我再次执行我的命令时它不起作用。我的节点脚本的第一行之后没有换行符。看看我的第一篇文章。【参考方案7】:

你也可以使用 vim:

vim script

:se ff=unix
:wq

这会将 DOS 样式的换行符确认为 Unix 样式的换行符。

【讨论】:

【参考方案8】:

毕竟,我找到了解决问题的方法。

由于我的节点脚本文件是在 Windows 上创建的,该文件是 DOS 格式的(我认为是 DOS 格式的行结尾)。因此,我使用了一个允许将文件转换为 unix 格式的模块:

brew install dos2unix
sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js

【讨论】:

正是我需要的。谢谢! 修复了我的 mac El Capitan 上的问题,这是我在家里的电脑上启动的一个救星!

以上是关于节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

文件操作在设备上不起作用

.htaccess 在 XAMPP mac 上不起作用

在多处理中调用的模拟方法在 Mac 上不起作用

JSON HTTP请求在Mac OSX上不起作用[重复]

JSON HTTP请求在Mac OSX上不起作用[重复]

VirtualHosts 在 Mac OS 10.7 上不起作用