使用带有通用字符串的 child_process#spawn

Use child_process#spawn with a generic string

我有一个字符串形式的脚本,我想在 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.spawngeneric 字符串一起使用,就像您可以使用 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:你没用

好的,明白了。

我使用了这个问题的答案: 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);
});