从Node.js中的shell脚本读取二进制输出

时间:2013-07-10 06:38:32

标签: node.js

我需要从我的Node.js脚本执行shell命令,读取其输出并在读取一定数量的字节后终止该程序。 (更确切地说,我想通过smbget)部分下载文件。

我猜测,最明显的方法是使用childprocess.spawn(),手动缓冲输出,并在读取足够数据时简单地kill()进程。

这很好用,除了我看起来有点笨重。所以我想要聪明(TM)并使用head。因此,我按照文档中的说明将所有内容连接到child_process(或者更方便地使用procstreams)来生成相当于cat /dev/urandom | head --bytes=10的管道。唉,一切都如火如荼:

events.js:72
     throw er; // Unhandled 'error' event
             ^

Error: read ECONNRESET
    at errnoException (net.js:883:11)
    at Pipe.onread (net.js:539:19)

可能是因为head只是将流媒体归结为死亡,而我无法找到捕获或以其他方式处理该错误的方法(尽管这可能只是因为我是节点n00b :)。

或者,我可以执行以下操作:

var cmd = 'cat /dev/urandom | head --bytes=100';
childprocess.exec(cmd, function (err, stdout, stderr) {
    // ...
});

除了我不能再访问原始(二进制)数据。当我打电话

fs.writeFileSync('foo.dat', stdout);

流将被utf8编码,导致文件大约180字节而不是预期的100字节。

通过将第二个参数传递给exec

可以避免这种情况
{ encoding: 'binary' }

不幸的是,文档说这已被弃用。

这样做的正确方法是什么?或者我绝对需要缓冲自己?

1 个答案:

答案 0 :(得分:1)

从技术上讲,你应该能够将'buffer'作为编码传递并让它专门输出一个Buffer,但看起来并非如此。我opened a ticket for it,应该在v0.12发布之前修复。

暂时可以随意使用二进制编码。它只是被弃用了,但永远不会消失。在v0.11 it received some love中,现在是latin1编码的同义词。这是由v8正式支持的,因此支持不会很快消失。