2017-02-07 5 views
9

Ich versuche, einen Prozess mit der Command API zu starten und seine Standardausgabe auf Standardfehler umzuleiten. In der folgenden fehlschlägt:Wie umleiten Child-Prozess-Ausgabe zu Stderr?

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

weil Command::new("tput").arg("rc").stdout(<XXX>) erwartet ein std::process::Stdio:

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

Das Äquivalent in Bash wahrscheinlich tput rc > /dev/stderr wäre.

Ich würde gerne wissen, wie man das richtig macht.

+2

Kurz auf die API Ich würde sagen, das ist nicht möglich. Vielleicht sollte hier ein Problem auftreten, wo die "stdout" -Methode stattdessen eine "Writer" -Instanz akzeptieren könnte? –

Antwort

7

Ab Rust 1.15.0 stellt Stdio diese Funktionalität in einer portablen API nicht zur Verfügung, aber es gibt plattformspezifische Erweiterungsmerkmale, die Sie für diesen Zweck verwenden können.

Auf Unix-ähnlichen Plattformen, the std::os::unix::io::FromRawFd trait is implemented on Stdio. Dieses Merkmal stellt eine einzige Methode bereit, from_raw_fd, die einen Dateideskriptor in den Typ umwandelt, der das Merkmal implementiert. Da der Standardfehler als Dateideskriptor 2 definiert ist, können Sie einfach .stdout(Stdio::from_raw_fd(2)) verwenden.

Unter Windows, there's a similar trait called FromRawHandle implemented on Stdio. Leider ist es nicht in der Online-Dokumentation aufgeführt; Es enthält nur die Unix-spezifischen Varianten. Sie würden GetStdHandle(STD_ERROR_HANDLE) aufrufen, um ein Handle für den Standardfehler zu erhalten.

Verwandte Themen