How do I invoke a system command in Rust and captu

2019-02-01 16:02发布

Is there a way to invoke a system command, like ls or fuser in Rust? How about capturing its output?

标签: rust
3条回答
男人必须洒脱
2楼-- · 2019-02-01 16:55

std::process::Command allows for that.

There are multiple ways to spawn a child process and execute an arbitrary command on the machine:

  • spawn — runs the program and returns a value with details
  • output — runs the program and returns the output
  • status — runs the program and returns the exit code

One simple example from the docs:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");
查看更多
再贱就再见
3楼-- · 2019-02-01 16:55

a very clear example from the 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());
查看更多
趁早两清
4楼-- · 2019-02-01 17:04

It is indeed possible! The relevant module is std::run.

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

ProcessOptions’ standard file descriptors default to None (create a new pipe), so you can just use process.output() (for example) to read from its output.

If you want to run the command and get all its output after it’s done, there’s wait_with_output for that.

Process::new, as of yesterday, returns an Option<Process> instead of a Process, by the way.

查看更多
登录 后发表回答