Is there a way to invoke a system command, like ls
or fuser
in Rust? How about capturing its output?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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 detailsoutput
— runs the program and returns the outputstatus
— 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");
回答2:
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());
回答3:
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.