使用带有通用字符串的 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.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:你没用
好的,明白了。
我使用了这个问题的答案:
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);
});
我有一个字符串形式的脚本,我想在 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:你没用
好的,明白了。
我使用了这个问题的答案: 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);
});