将child_process#spawn与通用字符串一起使用

时间:2016-12-17 05:41:30

标签: node.js bash zsh child-process

我有一个字符串形式的脚本,我想在Node.js子进程中执行。

数据如下所示:

const script = {
    str: 'cd bar && fee fi fo fum',
    interpreter: 'zsh'
};

通常情况下,我可以使用

const exec = [script.str,'|',script.interpreter].join(' ');

const cp = require('child_process');
cp.exec(exec, function(err,stdout,sterr){});

然而,cp.exec缓冲了stdout / stderr,我希望能够将stdout / stderr传递到任何地方。

有没有人知道是否有办法以某种方式使用cp.spawn字符串generic,就像使用cp.exec一样?我想避免将字符串写入临时文件,然后使用cp.spawn执行该文件。

cp.spawn将使用字符串,但前提是它具有可预测的格式 - 这适用于库,因此它需要非常通用。

......我只是想到了一些事情,我猜这样做的最好方法是:

const n = cp.spawn(script.interpreter);
n.stdin.write(script.str);   // <<< key part

n.stdout.setEncoding('utf8');

n.stdout.pipe(fs.createWriteStream('./wherever'));

我会试试,但也许有人有更好的主意。

downvoter:你没用了

1 个答案:

答案 0 :(得分:1)

好的想出来了。

我使用了这个问题的答案: Nodejs Child Process: write to stdin from an already initialised process

以下允许您使用不同的shell解释器将通用字符串提供给子进程,以下使用zsh,但您可以使用bashsh或任何可执行文件

const cp = require('child_process');

const n = cp.spawn('zsh');

n.stdin.setEncoding('utf8');
n.stdin.write('echo "bar"\n');   // <<< key part, you must use newline char

n.stdout.setEncoding('utf8');

n.stdout.on('data', function(d){
    console.log('data => ', d);
});

使用Node.js,它大致相同,但似乎我需要使用一个额外的调用,即n.stdin.end(),如下所示:

const cp = require('child_process');

const n = cp.spawn('node').on('error', function(e){
    console.error(e.stack || e);
});

n.stdin.setEncoding('utf-8');
n.stdin.write("\n console.log(require('util').inspect({zim:'zam'}));\n\n");   // <<< key part

n.stdin.end();   /// seems necessary to call .end()

n.stdout.setEncoding('utf8');

n.stdout.on('data', function(d){
    console.log('data => ', d);
});