2011-03-19 84 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