Node.js SyntaxError:意外的输入结束

时间:2014-05-06 16:28:40

标签: node.js bash shell

我在shell脚本中编写了一个函数:

function nodee() {
    node -e "console.log((function() { $@ })());"
}
export -f nodee

并且这样称呼它:

nodee "var a = 1, b = 2;" "return a + b;"

然后我收到了一个错误:

[eval]:1
console.log((function() { var a = 1, b = 2;

SyntaxError: Unexpected end of input
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:456:26)
    at evalScript (node.js:532:25)
    at startup (node.js:80:7)
    at node.js:902:3

但这没关系:

nodee "var a = 1, b = 2; return a + b;"

最后,我发现声称nodee这样可以解决问题:

function nodee() {
    node -e "console.log((function() { `echo $@` })());"
}
export -f nodee

但以下两行印有相同的结果:

echo "console.log((function() { `echo $@` })());"
echo "console.log((function() { $@ })());"

所以,问题是这两条线之间的区别是什么?

node -e "console.log((function() { `echo $@` })());"
node -e "console.log((function() { $@ })());"

Mac OS X:10.9.2&amp; Node.js:0.10.26

提前致谢!

1 个答案:

答案 0 :(得分:2)

$@在引号中是神奇的,会产生多个参数:

$ set -- foo bar baz
$ printf "Argument: %s\n" "Hello $@ world"
Argument: Hello foo
Argument: bar
Argument: baz world

由于node只需要一个参数,所以它会跳起来。

你想要的是$*,它连接参数而不创建多个参数:

$ printf "Argument: %s\n" "Hello $* world"
Argument: Hello foo bar baz world

`echo $@`基本上是一种做同样事情的hacky方式 - 将多个参数连接成一个字符串 - 除了它会破坏许多边缘情况,例如嵌入的换行符或整数:

$ set -- "var = 2 * 3;"
$ printf "Argument: %s\n" "Hello $* world"
Argument: Hello var = 2 * 3; world

$ printf "Argument: %s\n" "Hello `echo $@` world"
Argument: Hello var = 2 a.class a.java a.out barcode.png [...] 3; world