如何在 Rust 中通过管道传输命令?

问题描述 投票:0回答:2

我正在尝试在 shell 中执行命令并获取字符串形式的返回值。 我尝试执行的命令是

ps axww | grep mongod | grep -v grep

我在互联网上看到过解决方案,但他们没有解释代码,所以很难根据我的需求定制它。

示例:如何在 Rust 中制作三明治管道? & 两个子进程之间的管道

有人可以提供一个解决方案,并用通俗易懂的术语逐行解释它是如何工作的吗?

shell rust command-line command
2个回答
12
投票

您需要的是文档,他们通过详尽的示例逐行解释所有内容。改编自它,这是你的代码

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
的进程正在运行...)。


0
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.