从bash脚本中运行Node

35

简单来说,我正在尝试使用cron自动运行一个nodejs脚本,但是脚本本身似乎无法运行该文件。我的脚本很简单:

#!/usr/bin/env node
node /var/node/assets/js/update.js

然而,运行此代码时,它返回路径的开头是不正确的:

/home/dev/update.sh:2
node /var/node/assets/js/update.js
      ^^^
SyntaxError: Unexpected token var
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3

bash有什么实际问题吗?还是Node有特定的做法?我使用了/bin/env以便无论版本如何,都可以得到正确形式的“node”。

3个回答

64

看起来你正在尝试在Node中运行Node。错误信息来自Node,似乎Node试图运行命令/var/node/assets/js/update.js

我会将shebang行指定为bash而不是Node。

顶部一行。

#!/usr/bin/env node

意思是接下来的内容应该是 JavaScript 代码,而不是 bash。


糟糕!我正要输入同样的内容。另一个选项是直接在文件中包含JavaScript代码。 - Pickels
嗯,从那个意义上讲,如果我只提供路径,它不就能工作了吗?因为当我只留下路径时,它会出现这样的错误:http://pastie.org/pastes/7899197/text - Rogue
对不起,我没有理解。我看到了错误,但是你究竟做了什么导致了这个错误? - Ray Toal
有点晚了,但我猜...既然这是一个节点环境,你可以简单地要求你的代码。我从来没有做过这个,也没有测试过。@Rogue - Maximilian Haindl
@MaximilianHaindl 十年后,我相信你对两个时间段都是正确的。话虽如此,对于这个任务,我认为我更喜欢通过bash调用我的节点应用程序,而不是将我的节点应用程序分散在各个地方,比如说像cron。 - Rogue

22

您已经在未经修改的环境中的第一行运行了Node。

然后在第二行,您向该节点进程提供命令 node /var/node/assets/js/update.js

这怎么样:

#!/usr/bin/bash
node /var/node/assets/js/update.js

不行,无论我运行哪个脚本,它似乎都会停滞。 - Rogue
这个答案和@Ray所说的有什么不同? 你最终的解决方案是什么? - stackunderflow
我有点放弃使用env node变量,而是改用bash编写我的脚本。因为Ray的回答最先出现,所以我只是勾选了他的答案 :) - Rogue

-5

这个怎么样?

#!/bin/bash

node /var/node/assets/js/update.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接