【发布时间】:2014-01-27 11:29:51
【问题描述】:
有没有办法调用系统命令,比如 Rust 中的 ls 或 fuser?捕获它的输出怎么样?
【问题讨论】:
标签: rust
有没有办法调用系统命令,比如 Rust 中的 ls 或 fuser?捕获它的输出怎么样?
【问题讨论】:
标签: rust
std::process::Command 允许这样做。
有多种方法可以生成子进程并在机器上执行任意命令:
文档中的一个简单示例:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
【讨论】:
output 函数在完成过程后返回 Vec 。所以,如果我们运行类似Command("ping google.com") 的东西。这是否可以获得此命令输出,因为它不会完成,但我想打印它的日志。请提出建议。
spawn,在这个答案中提到,返回带有标准 I/O 流的 Child 结果。
来自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());
【讨论】:
确实有可能!相关模块为std::run。
let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);
ProcessOptions'标准文件描述符default to None(创建一个新管道),因此您可以使用process.output()(例如)从其输出中读取。
如果您想在完成后运行该命令并获取其所有输出,there’s wait_with_output for that。
顺便说一下,Process::new 从昨天开始返回 Option<Process> 而不是 Process。
【讨论】:
std::process。