2017-02-07 30 views
9

我试图用Command API启动一个进程,并将其标准输出重定向到标准错误。下面失败:如何将子进程输出重定向到stderr?

Command::new("tput").arg("rc") 
    .stdout(io::stderr()) 
    .status() 
    .expect("failed to run tput"); 

因为Command::new("tput").arg("rc").stdout(<XXX>)需要一个std::process::Stdio

expected struct `std::process::Stdio`, found struct `std::io::Stderr` 

中的Bash等效很可能是tput rc > /dev/stderr

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

+2

简单地看看API我会说这是不可能的。也许应该提出一个问题,因为'stdout'方法可以接受'Writer'实例吗? –

回答

7

从Rust 1.15.0开始,Stdio不会在便携式API中公开此功能,但您可以使用此平台特定的扩展特征来实现此目的。

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

在Windows上,there's a similar trait called FromRawHandle implemented on Stdio。不幸的是,它没有列在在线文档中。它只包含特定于Unix的变体。您可以拨打GetStdHandle(STD_ERROR_HANDLE)来获取标准错误的句柄。

相关问题