システムコマンドを呼び出してその出力をキャプチャするにはどうすればよいですか?


91

Rustのように、lsまたはfuserRustでシステムコマンドを呼び出す方法はありますか?その出力をキャプチャするのはどうですか?

回答:


119

std::process::Command それを可能にします。

子プロセスを生成し、マシン上で任意のコマンドを実行するには、複数の方法があります。

  • spawn —プログラムを実行し、詳細を含む値を返します
  • output —プログラムを実行し、出力を返します
  • status —プログラムを実行し、終了コードを返します

ドキュメントからの1つの簡単な例:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");

2
リアルタイム出力を取得する必要がある場合はどうなりますか。output関数はプロセスの完了後にVecを返すと思います。したがって、のようなものを実行する場合に備えてCommand("ping google.com")。終了しないので、このコマンドを出力することは可能ですか?ログを印刷したいのですが。提案してください。
GrvTyagi

3
@GrvTyagi :spawn、この回答で言及されているようにChild、標準のI / Oストリームで結果を返します。
Ry-

この優れた回答に基づいて、この回答がstdin / stdoutとの対話方法を理解するのにも役立つことがわかりました。
MichaelNoguera20年

34

ドキュメントからの非常に明確な例:

use std::process::Command;
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

assert!(output.status.success());

8

それは確かに可能です!関連するモジュールはstd::runです。

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptions'標準のファイル記述子はデフォルトでNone(新しいパイプを作成する)であるため、process.output()(たとえば)を使用してその出力から読み取ることができます。

あなたはそれを行うの後にコマンドを実行し、そのすべての出力を取得したい場合は、ありますwait_with_output、そのために

Process::newちなみに、昨日の時点で、のOption<Process>代わりにを返しますProcess


31
すべての検索者の場合:std :: runが削除されましたstd::io::process。代わりに、を参照してください(以下の回答)。
jgillich 2014年

2
それはだstd::processrustc 1.19.0のようになりました。
WiSaGaN 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.