web-dev-qa-db-ja.com

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

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

56
quux00

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");
86
talles

docs からの非常に明確な例:

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());
13
Karan Ahuja

それは確かに可能です!関連するモジュールは _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_はProcessではなく_Option<Process>_を返します。

6
Ry-