2011-03-19 41 views
2

在命令行上,如果用完问题的的Node.js和child_process.exec参数

echo -n "foo" | openssl aes-128-cbc -k "key" -base64 -e 

(所述-n标志可防止echo从添加一个新行到其输出的结束),我得到

U2FsdGVkX1+nMW5I4eZSasPKfsUuCpbFsnn56ngEdec= 

但是当我运行

exec = require('child_process').exec; 
exec('echo -n "foo" | openssl aes-128-cbc -k "key" -base64 -e', callback); 

回调得到输出

U2FsdGVkX1/CARBiGos0x9ALNhFqcIaFvZ9EUvVBxuc= 

它为什么不同?解密,你会得到字符串

-n foo 

所以不知何故,exec编码-n "foo""-n foo"(下节点0.4.2)。

这里是最奇怪的部分:当我直接从TextMate运行我的代码时(通过jashkenas的CoffeeScript包),我没有遇到这个问题。起初我认为这是一个路径问题,但它不是(使两个环境中的PATH完全没有影响)。也许这是因为一个环境是TTY,而另一个则不是。

其他人是否意识到这种不一致?这是一个节点错误,还是我忽略了一些东西?我猜测如果我使用底层spawn而不是exec,我的问题就会消失。

回答

3

也许你的/bin/echo doesn't respect -necho经常是一个内置的shell,并且可以尊重-n。您可能希望使用printf(1),它更便于携带。

+0

嗯,'/ bin/echo -n“foo”'似乎可以像预期的那样工作在shell上,所以我仍然认为根本原因是Node的'exec'问题。感谢'printf'指针,虽然 - 我能够解决它的问题。 – 2011-03-19 13:58:48

+0

Trevor Burnham,如果你找出问题的根源,我真的很想知道为什么你的初始代码没有按预期工作。但是我很高兴你找到了解决这个问题的解决方法。 – sarnold 2011-03-20 23:57:24

+1

我只是碰到了这个。难道是Node使用/ bin/sh而不是/ bin/bash?从echo的手册页:“最值得注意的是,sh(1)中的内置回显不接受-n选项。”在我的情况下,我用'echo foo |模拟'echo -n' tr -d'\ n''。 – davidchambers 2013-02-24 20:31:22