为何未设置piped时Deno.Command仍能捕获stdout/stderr?
关于Deno.Command示例与文档说明冲突的疑问
你忽略的核心要点是:调用command.output()方法时,会自动将stdout和stderr的stdio模式隐式设置为"piped",无需在Deno.Command的构造函数中手动配置。
具体来说:
Deno.Command的output()方法设计目的就是捕获子进程的标准输出和错误输出,并将它们作为返回结果的一部分。因此当你调用该方法时,Deno会自动调整stdio选项,将stdout和stderr设为"piped",确保这些流的数据能被正确捕获并返回。- 文档中提到的「若任何stdio选项未设置为"piped",访问对应字段会抛出TypeError」,针对的是未通过构造函数或方法隐式配置piped的场景——比如使用
spawn()方法但未手动设置stdio,或者尝试访问未被配置为piped的流。而output()方法已经替你完成了这个隐式配置,所以示例代码可以安全访问stdout和stderr字段。
举个对比例子,如果使用spawn()方法,就必须手动配置stdio才能访问流:
const command = new Deno.Command(Deno.execPath(), { args: ["eval", "console.log('hello'); console.error('world')"], stdio: ["inherit", "piped", "piped"], // 必须手动设置 }); const child = command.spawn(); const { code } = await child.status; const stdout = await child.stdout.readable.toArray(); const stderr = await child.stderr.readable.toArray();
内容的提问来源于stack exchange,提问作者John Deighan
相关产品推荐
相关产品推荐

