我正在尝试在 shell 中执行命令并获取字符串形式的返回值。 我尝试执行的命令是
ps axww | grep mongod | grep -v grep
。
我在互联网上看到过解决方案,但他们没有解释代码,所以很难根据我的需求定制它。
示例:如何在 Rust 中制作三明治管道? & 两个子进程之间的管道
有人可以提供一个解决方案,并用通俗易懂的术语逐行解释它是如何工作的吗?
您需要的是文档,他们通过详尽的示例逐行解释所有内容。改编自它,这是你的代码
use std::process::{Command, Stdio};
use std::str;
fn main() {
let ps_child = Command::new("ps") // `ps` command...
.arg("axww") // with argument `axww`...
.stdout(Stdio::piped()) // of which we will pipe the output.
.spawn() // Once configured, we actually spawn the command...
.unwrap(); // and assert everything went right.
let grep_child_one = Command::new("grep")
.arg("mongod")
.stdin(Stdio::from(ps_child.stdout.unwrap())) // Pipe through.
.stdout(Stdio::piped())
.spawn()
.unwrap();
let grep_child_two = Command::new("grep")
.arg("-v")
.arg("grep")
.stdin(Stdio::from(grep_child_one.stdout.unwrap()))
.stdout(Stdio::piped())
.spawn()
.unwrap();
let output = grep_child_two.wait_with_output().unwrap();
let result = str::from_utf8(&output.stdout).unwrap();
println!("{}", result);
}
查看 playground (当然不会输出任何内容,因为没有名为
mongod
的进程正在运行...)。
Rust 是一种精彩的语言,可以让人们进行创造性思考。不只是像C那样设计得优雅、用心,让我们盲目跟风。
use std::process::Command;
fn exec(cmd: &str, args: &[&str]) -> String
{
let output = Command::new(cmd)
.args(args)
.output()
.expect("failed to execute cmd");
String::from_utf8(output.stdout).unwrap()
}
fn main() {
let ret = exec("sh", &["-c", "ip addr |grep global"]);
//let ret = exec("sh", &["-c", "ls -l |grep target"]);
println!("exec: <{}>", ret);
}