在nodejs中构建CLI工具,看不到子进程输出

qlvxas9a  于 9个月前  发布在  Node.js
关注(0)|答案(2)|浏览(115)

我正在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解析后打印
为什么?我能做些什么来弥补?

dfuffjeb

dfuffjeb1#

这取决于您正在执行的终端命令
process.stdoutreadable stream,默认情况下highWaterMark值为16384
如果输出小于此大小,则在流结束时获得所有响应,否则将在每个数据块上获得响应
例如,尝试超时的大输出
await asyncExec("printf 'k%.0s' {1..100} ");
await asyncExec("printf 'k%.0s' {1..1000000000} ");
进一步阅读流highWaterMark有一个很好的解释在这里:
https://stackoverflow.com/a/45905930/4267015

af7jpaap

af7jpaap2#

问题的解决方法是执行以下操作:const child = Child_process.spawn(command, { shell: true, stdio: "inherit" });

相关问题