2017-02-07 17 views
9

Я пытаюсь запустить процесс с API Command и перенаправить его стандартный вывод на стандартную ошибку. Следующий сбой:Как перенаправить выход дочернего процесса на 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), чтобы получить дескриптор стандартной ошибки.

 Смежные вопросы

  • Нет связанных вопросов^_^