node js cli STDOUT STDERR 输出 exec 和 spawn 命令

Posted

技术标签:

【中文标题】node js cli STDOUT STDERR 输出 exec 和 spawn 命令【英文标题】:node js cli STDOUT STDERR output exec and spawn commands 【发布时间】:2021-05-26 19:34:09 【问题描述】:

我正在寻找关于在开发 npm cli 模块时stdoutstderr 如何工作的明确答案。

我想打印出与child_process.spawn 运行命令时完全相同的所有内容。

我设法输出带有--progress 选项的git clone 命令。现在我想输出npm install 命令,但它只打印最后一个字符串。

如果能就一般情况下如何工作以及最佳做法有哪些明确的答案,我会很高兴。

这行得通:

import * as cp from 'child_process';

const child = cp.spawn('git', ['clone', 'ssh://myrepo...', '--progress']);
    
child.stdout.setEncoding('utf8');
child.stdout.on('data', (chunk) => 
    process.stdout.write(`$chunk`);
);
    
child.stderr.setEncoding('utf8');
child.stderr.on('data', (chunk) => 
    process.stdout.write(`$chunk`);
);

// BTW why git is outputing in STDERR and not in STDOUT?

但这不起作用

const child = cp.spawn('npm', ['i', 'mymodule']);

有没有办法让每个命令都可以工作?

【问题讨论】:

【参考方案1】:

您可以省略事件处理程序和编码设置,并告诉spawn() 将 stdio 传递给父进程。

const child = cp.spawn('npm', ['i', 'mymodule'], stdio: 'inherit');

只要像您的第一个示例一样添加侦听器,您的两个命令都对我有用。如果我忽略事件处理程序,您的第二个示例只会停止为我工作。知道你在什么平台上运行,你正在使用什么版本的 node 和 npm,以及一个完整的不工作的例子,可以剪切并粘贴到一个文件中进行测试,这会很有趣。 (另外,文件的名称是什么?您是在使用.mjs 扩展名还是其他东西来使import 工作?这个文件是在其他地方加载的模块中还是在基本级别的脚本中?)

【讨论】:

我正在使用 Typescript (tsc v3.9.5)。这就是我使用import 的原因。节点 v14.2.0。 Linux 基本操作系统 5.1.7 Hera。文件名是从cli.ts#!/usr/bin/env node 编译的cli.js 会不会是npm 命令的输出没有显示,因为它是以其他方式格式化的?我注意到,当我使用stdio: 'inherit' 时,我看不到的东西是彩色的

以上是关于node js cli STDOUT STDERR 输出 exec 和 spawn 命令的主要内容,如果未能解决你的问题,请参考以下文章

php的三种CLI常量:STDIN,STDOUT,STDERR

php的三种CLI常量:STDIN,STDOUT,STDERR

php的三种CLI常量:STDIN,STDOUT,STDERR

进程替换 - Node.js child_process

node.js在控制台上获得批量输出

使用 Autohotkey 读取 StdErr 和 StdOut