Node.js execSync 将 stderr 重定向到 stdout

问题描述 投票:0回答:2

我正在尝试将子进程 stderr 重定向到它的 stdout:

let buffer = execSync("echo hello 1>&2", {stdio : ["pipe","pipe", 1]});
console.log("Result: " + buffer.toString());

我的目标是在变量“buffer”中检索“hello”。 在文档中,我看到可以重定向stderr:https://nodejs.org/api/child_process.html#child_process_options_stdio

所以我一开始尝试将stderr通过管道传输到stdout(参见上面的代码),但我发现它重定向到父进程stdout。

产生以下输出:

node .\main.js
hello
Result:

我尝试添加自定义缓冲区:

const {subprocess, execSync} = require("node:child_process");
let buff = Buffer.alloc(128);

execSync("echo hello 1>&2", {stdio : ["pipe",buff, buff]});
console.log("Result:" + buff.toString());

但是缓冲区仍为空:

node .\main.js
Result:

是否可以将子进程stderr重定向到

execSync
返回的子进程stdout?或者我必须使用自定义流
spawnSync

node.js stdout child-process stderr
2个回答
0
投票

execSync
返回已执行命令的标准输出,无论
stdio
选项如何。你想要实现的目标可以通过异步来完成
exec
:

child_process.exec("echo hello 1>&2", function(error, stdout, buffer){
  console.log("Result: " + buffer.toString());
});

0
投票

根据文档

,我认为除了使用 execSync

命令读取标准输出之外,您无法读取任何内容

退货:

<Buffer>
|
<string>
命令的标准输出。

所以是的,您必须使用

spawnSync
。它将返回一个具有属性
stderr
的对象,其中包含子进程的 stderr 输出的
Buffer

let buffer = spawnSync("my_subprocess").stderr;
console.log("Result: " + buffer.toString());
© www.soinside.com 2019 - 2024. All rights reserved.