我正在node中构建一个命令行工具,作为该工具的一部分,我需要执行系统中的命令。问题是我无法从程序中生成的子进程获得管道输出
执行子进程的代码:
import * as Child_process from "child_process";
export function asyncExec(command: string): Promise<string> {
return new Promise((resolve, reject) => {
const child = Child_process.spawn(command, { shell: true });
child.stdout?.pipe(process.stdout);
child.on("error", (err) => {
reject(err);
});
child.on("exit", (code) => {
if (code === 0) {
resolve(code.toString());
} else {
reject(new Error(`Process exited with code ${code}`));
}
});
});
}
字符串
我有另一个版本的这段代码,试图使它的工作,使用exec
import * as Child_process from "child_process";
export function asyncExec(command: string): Promise<string> {
return new Promise((resolve, reject) => {
const child = Child_process.exec(command, (err, stdout, stderr) => {
if (err) {
reject(new Error(stderr || err.message));
} else {
resolve(stdout);
}
});
child.stdout?.pipe(process.stdout);
});
}
型
子进程的stdout流没有被打印,它只在promise解析后打印
为什么?我能做些什么来弥补?
2条答案
按热度按时间dfuffjeb1#
这取决于您正在执行的终端命令
process.stdout
是readable stream
,默认情况下highWaterMark
值为16384
。如果输出小于此大小,则在流结束时获得所有响应,否则将在每个数据块上获得响应
例如,尝试超时的大输出
await asyncExec("printf 'k%.0s' {1..100} ");
个await asyncExec("printf 'k%.0s' {1..1000000000} ");
个进一步阅读流highWaterMark有一个很好的解释在这里:
https://stackoverflow.com/a/45905930/4267015
af7jpaap2#
问题的解决方法是执行以下操作:
const child = Child_process.spawn(command, { shell: true, stdio: "inherit" });