2017-02-07 20 views
9

Próbuję uruchomić proces z interfejsem API Command i przekierować jego standardowe wyjście do błędu standardowego. Dodaje się nie powiedzie:Jak przekierować wyjściowe procesy potomne na stderr?

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

ponieważ Command::new("tput").arg("rc").stdout(<XXX>) oczekuje std::process::Stdio:

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

Równowartość w Bash będzie prawdopodobnie tput rc > /dev/stderr.

Chciałbym wiedzieć, jak to zrobić poprawnie.

+2

Krótko mówiąc na temat API, powiedziałbym, że nie jest to możliwe. Być może należy poruszyć kwestię, w której metoda 'stdout' mogłaby zaakceptować instancję' Writer'? –

Odpowiedz

7

Od wersji Rust 1.15.0, Stdio nie udostępnia tej funkcji w przenośnym interfejsie API, ale istnieją funkcje specyficzne dla platformy, które można wykorzystać do tego celu.

Na platformach uniksowych, the std::os::unix::io::FromRawFd trait is implemented on Stdio. Ta cecha zapewnia jedną metodę, from_raw_fd, która może przekształcić deskryptor pliku w typ implementujący tę cechę. Ponieważ standardowy błąd jest zdefiniowany jako deskryptor pliku 2, możesz po prostu użyć .stdout(Stdio::from_raw_fd(2)).

W systemie Windows: there's a similar trait called FromRawHandle implemented on Stdio. Niestety, nie ma go w dokumentacji online; Zawiera tylko warianty specyficzne dla Uniksa. Można zadzwonić pod numer GetStdHandle(STD_ERROR_HANDLE), aby uzyskać uchwyt do błędu standardowego.