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

时间:2015-05-20 08:56:49

标签: node.js command-line osx-yosemite

我创建了我的节点脚本可执行文件来执行某些任务grunt。在Windows上,我的节点脚本工作正常。但是在Mac OS X(约塞米蒂)上,它无法正常工作。

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

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

npm install -g task-app

我的节点脚本有第一行:

#! /usr/bin/env node

我尝试了很多解决方案来解决我的问题,但我还是坚持了下来。

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

  1. 卸载并重新安装Node.js
  2. 执行此命令 为节点创建一个链接:sudo ln -s / usr / bin / nodejs / usr / local / bin / node
  3. 使用此命令设置我的路径:export PATH = $ PATH:/ usr / local / bin / node
  4. 你有其他解决方案吗?

    编辑:

    我的剧本的开头:

    #! /usr/bin/env node
    
    var grunt = require('grunt');
    
    //Get parameters from command line
    var args = process.argv.splice(2);
    
    [...]
    

7 个答案:

答案 0 :(得分:27)

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

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

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

答案 1 :(得分:9)

你也可以使用vim:

(.link-panel

这将确认DOS风格换行符的DOS风格。

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

正如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

答案 4 :(得分:0)

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

但是,这仍然是毛线问题:https://github.com/yarnpkg/yarn/issues/5480

如果您因为在使用yarn而不是npm时遇到此错误而进入此页面,就像我一样,您可能要考虑使用npm而不是yarn。无论如何,npm如今具有纱线的大多数最佳功能(可以说)。

答案 5 :(得分:0)

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

带有shebang行且DOS行结尾的可执行文件已损坏,必须由作者而不是用户npmyarn修复。在撰写本文时,即使您在Windows系统上进行开发,也没有理由仍然使用DOS行尾。但是您至少应该修复所产生的文件,然后再将其分发给公众。有关如何配置git以正确处理行尾的信息,请参见https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

答案 6 :(得分:0)

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

运行这个命令:

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