节点脚本可执行文件无法在 Mac 上运行:环境:node\r:没有这样的文件或目录
Node script executable not working on Mac : env: node\r: No such file or directory
我已经创建了我的节点脚本可执行文件来执行一些 grunt 任务。在 Windows,我的节点脚本工作正常。但是在 Mac OS X (Yosemite) 上,它不起作用。
我的节点脚本已在 Windows 上发布。
我的节点脚本是通过 npm 命令安装的:
npm install -g task-app
我的节点脚本有第一行:
#! /usr/bin/env node
我尝试了很多解决方案来解决我的问题,但我仍然卡住了。
这是我使用的这些解决方案:
- 卸载并重新安装 Node.js
- 执行这个命令来
为节点创建一个 link :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);
[...]
您的脚本中的换行符有问题。确保 #!/usr/bin/env node
后跟 \n
(unix 风格)而不是 \r\n
(windows/dos 风格)。
要解决此问题,请使用 tr
命令从您的文件中删除 \r
:
cat your_script.js | tr -d '\r' > fixed_script.js
毕竟,我找到了解决问题的方法。
因为我的节点脚本文件是在 Windows 上创建的,文件是 DOS 格式(我认为是 DOS 格式的行结尾)。所以,我使用了一个允许将文件转换为 unix 格式的模块:
brew install dos2unix
sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js
您也可以使用 vim:
vim script
:se ff=unix
:wq
这会将 DOS 风格的换行符确认为 Unix 风格的换行符。
正如 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
从 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 的大部分最佳功能。
MS-DOS 插入的回车 return 被解释为脚本解释器名称的一部分,顺便说一下,这是 Un*x 系统的正确行为。因此,系统查找文件 /usr/bin/node\r
而不是 /usr/bin/node
。正如其他人所指出的那样,npm
现在 "fixes" 通过剥离换行符来解决问题,这是一种有点可疑的行为。
带有以 DOS 行结尾的 shebang 行的可执行文件已损坏,必须由作者而非用户修复,npm
或 yarn
。在撰写本文时,几乎没有理由仍然使用 DOS 行尾,即使您在 Windows 系统上开发也是如此。但是你至少应该在将它们分发给一般 public 之前修复你生成的文件。有关如何配置 git 以正确处理行尾的信息,请参阅 https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings。
第一个命令告诉 Git 永远不要更改行尾(将来)。接下来,我们通过从 Git 的索引中删除每个文件来刷新每个存储库,最后重写 Git 索引以获取所有新行结尾。这修复了克隆每个存储库时引入本地文件系统的 CRLF。
运行 这个命令:
git config core.autocrlf false
git rm --cached -r .
git reset --hard
原因:
这通常是由于行尾的不同,尤其是 LF 与 CRLF 的不同。像 Linux 和 macOS 这样的 Unix 系统默认使用换行符 LF 作为换行符。另一方面,Windows 是特殊的,默认情况下使用 CR/LF 、回车符 return 和换行符。
参考:https://qvault.io/clean-code/line-breaks-vs-code-lf-vs-crlf/
解决方法:
对于 mac 用户,在发生错误的文件中将 CRLF 更改为 LF。
我已经创建了我的节点脚本可执行文件来执行一些 grunt 任务。在 Windows,我的节点脚本工作正常。但是在 Mac OS X (Yosemite) 上,它不起作用。
我的节点脚本已在 Windows 上发布。
我的节点脚本是通过 npm 命令安装的:
npm install -g task-app
我的节点脚本有第一行:
#! /usr/bin/env node
我尝试了很多解决方案来解决我的问题,但我仍然卡住了。
这是我使用的这些解决方案:
- 卸载并重新安装 Node.js
- 执行这个命令来 为节点创建一个 link :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);
[...]
您的脚本中的换行符有问题。确保 #!/usr/bin/env node
后跟 \n
(unix 风格)而不是 \r\n
(windows/dos 风格)。
要解决此问题,请使用 tr
命令从您的文件中删除 \r
:
cat your_script.js | tr -d '\r' > fixed_script.js
毕竟,我找到了解决问题的方法。
因为我的节点脚本文件是在 Windows 上创建的,文件是 DOS 格式(我认为是 DOS 格式的行结尾)。所以,我使用了一个允许将文件转换为 unix 格式的模块:
brew install dos2unix
sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js
您也可以使用 vim:
vim script
:se ff=unix
:wq
这会将 DOS 风格的换行符确认为 Unix 风格的换行符。
正如 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
从 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 的大部分最佳功能。
MS-DOS 插入的回车 return 被解释为脚本解释器名称的一部分,顺便说一下,这是 Un*x 系统的正确行为。因此,系统查找文件 /usr/bin/node\r
而不是 /usr/bin/node
。正如其他人所指出的那样,npm
现在 "fixes" 通过剥离换行符来解决问题,这是一种有点可疑的行为。
带有以 DOS 行结尾的 shebang 行的可执行文件已损坏,必须由作者而非用户修复,npm
或 yarn
。在撰写本文时,几乎没有理由仍然使用 DOS 行尾,即使您在 Windows 系统上开发也是如此。但是你至少应该在将它们分发给一般 public 之前修复你生成的文件。有关如何配置 git 以正确处理行尾的信息,请参阅 https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings。
第一个命令告诉 Git 永远不要更改行尾(将来)。接下来,我们通过从 Git 的索引中删除每个文件来刷新每个存储库,最后重写 Git 索引以获取所有新行结尾。这修复了克隆每个存储库时引入本地文件系统的 CRLF。
运行 这个命令:
git config core.autocrlf false
git rm --cached -r .
git reset --hard
原因: 这通常是由于行尾的不同,尤其是 LF 与 CRLF 的不同。像 Linux 和 macOS 这样的 Unix 系统默认使用换行符 LF 作为换行符。另一方面,Windows 是特殊的,默认情况下使用 CR/LF 、回车符 return 和换行符。 参考:https://qvault.io/clean-code/line-breaks-vs-code-lf-vs-crlf/
解决方法: 对于 mac 用户,在发生错误的文件中将 CRLF 更改为 LF。