我在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
提前致谢!
答案 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