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

Pau*_*Dev 17 command-line node.js osx-yosemite

我创建了我的节点脚本可执行文件来执行一些任务grunt.在Windows上,我的节点脚本工作正常.但是在Mac OS X(Yosemite)上,它不起作用.

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

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

npm install -g task-app
Run Code Online (Sandbox Code Playgroud)

我的节点脚本有第一行:

#! /usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

我尝试了很多解决方案来解决我的问题,但我仍然陷入困境.

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

  1. 卸载并重新安装Node.js.
  2. 执行此命令为节点创建链接:sudo ln -s/usr/bin/nodejs/usr/local/bin/node
  3. 使用此命令设置我的路径: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);

[...]
Run Code Online (Sandbox Code Playgroud)

Pau*_*Dev 30

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

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

brew install dos2unix
sudo dos2unix /usr/local/lib/node_modules/task-app/src/task-app.js
Run Code Online (Sandbox Code Playgroud)


Joh*_*hnQ 12

你也可以使用vim:

vim script

:se ff=unix
:wq
Run Code Online (Sandbox Code Playgroud)

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


dav*_*d_p 7

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

cat your_script.js | tr -d '\r' > fixed_script.js
Run Code Online (Sandbox Code Playgroud)


drk*_*gel 5

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

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

如果您来到此页面是因为在使用yarn而不是npm时遇到此错误(就像我一样),那么您可能需要考虑使用npm而不是yarn。无论如何(可以说),npm 拥有目前yarn 的大部分最佳功能。


小智 5

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

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