如何合并子进程stdout和stderr?
由于不能在stdout
和stderr
之间共享所有权,因此以下操作不起作用
let pipe = Stdio::piped();
let prog = Command::new("prog")
.stdout(pipe)
.stderr(pipe)
.spawn()
.expect("failed to execute prog");
换句话说,什么是外壳中2>&1
的Rust等价物?
发布于 2020-06-24 05:39:27
我编写io-mux crate是为了提供一个多端的类似管道的构造;主要的用例是从进程中捕获标准输出和标准错误,正确地交错,并区分哪些数据来自哪个数据。有关如何使用它的示例,请参阅highlight-stderr。
(io-mux主要在Linux上工作;它也可以在其他UNIX平台上工作,但由于UNIX套接字在这些平台上的行为,它有一些限制。)
如果您不关心区分哪些数据来自stdout,哪些数据来自stderr,那么可以使用普通管道。在UNIX上,使用libc::pipe
创建管道,使用Stdio::from_raw_fd
两次创建标准输出和标准错误,生成进程,然后从管道的另一端读取。在Windows上,您可以做类似的事情,使用句柄而不是文件描述符。
如果您不需要区分哪些数据来自标准输出,哪些数据来自标准错误,并且您不想处理设置管道的特定于平台的细节,那么可以尝试像subprocess这样的工具,它特别提到了对组合标准输出和标准错误的支持。
发布于 2021-01-24 05:41:48
我知道您问的是std::Command
,但为了防止它对使用subprocess机箱的任何人有帮助,您可以使用Redirection::Merge
.stderr(Redirection::Merge)
https://stackoverflow.com/questions/41019780
复制相似问题