我有一个字符串形式的脚本,我想在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:你没用了
答案 0 :(得分:1)
好的想出来了。
我使用了这个问题的答案: Nodejs Child Process: write to stdin from an already initialised process
以下允许您使用不同的shell解释器将通用字符串提供给子进程,以下使用zsh
,但您可以使用bash
或sh
或任何可执行文件
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);
});