如何将子进程输出重定向到stderr?

Hea*_*low 9 io-redirection rust

我正在尝试使用CommandAPI 启动进程并将其标准输出重定向到标准错误.以下失败:

Command::new("tput").arg("rc")
    .stdout(io::stderr())
    .status()
    .expect("failed to run tput");
Run Code Online (Sandbox Code Playgroud)

因为Command::new("tput").arg("rc").stdout(<XXX>)期望std::process::Stdio:

expected struct `std::process::Stdio`, found struct `std::io::Stderr`
Run Code Online (Sandbox Code Playgroud)

Bash中的等价物可能是tput rc > /dev/stderr.

我想知道如何正确地做到这一点.

Fra*_*gné 7

从Rust 1.15.0开始,Stdio不会在可移植API中公开此功能,但是可以使用特定于平台的扩展特征来实现此目的.

在类Unix平台,std::os::unix::io::FromRawFd性状上实现Stdio.此特征提供了一种方法,from_raw_fd可以将文件描述符转换为实现特征的类型.由于标准错误被定义为文件描述符2,您可以简单地使用.stdout(Stdio::from_raw_fd(2)).

在Windows上,有一个类似的特性叫做FromRawHandle实现Stdio.不幸的是,它没有在在线文档中列出; 它只包含特定于Unix的变体.您可以调用GetStdHandle(STD_ERROR_HANDLE)以获取标准错误的句柄.