2017-02-07 9 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` 

バッシュの等価はおそらく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)に電話します。

関連する問題