rust 使用std::process::Command运行多个shell命令

nkkqxpd9  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(426)

我尝试在Rust上使用std::process::Command插入多个命令,而不是运行bash脚本。我已经阅读了使用这里引用的示例运行多个命令的概念,来自execute机箱:
https://docs.rs/execute/latest/execute/#execute-multiple-commands-and-pipe-them-together.

use std::process::{Command, Stdio};

use execute::Execute;

let mut command1 = Command::new("echo");
command1.arg("HELLO WORLD");

let mut command2 = Command::new("cut");
command2.arg("-d").arg(" ").arg("-f").arg("1");

let mut command3 = Command::new("tr");
command3.arg("A-Z").arg("a-z");

command3.stdout(Stdio::piped());

let output = command1.execute_multiple_output(&mut [&mut command2, &mut command3]).unwrap();

assert_eq!(b"hello\n", output.stdout.as_slice());

问题是这些命令是以分散的格式编写的。我想知道是否有更好的方法可以直接将子命令作为参数添加到Command::new()下,而不必将它们分隔为command1command2等。

kwvwclae

kwvwclae1#

shutil机箱简化了多个命令的运行。

cargo add shutil

然后,您可以运行示例管道,如下所示:

use shutil::pipe;

fn main() {
    // Executes `echo "HELLO WORLD" | cut -d " " -f 1 | tr 'A-Z' 'a-z'`
    let output = pipe(vec![
        vec!["echo", "HELLO", "WORLD"],
        vec!["cut", "-d", " ", "-f", "1"],
        vec!["tr", "A-Z", "a-z"],
    ]);

    // prints "hello"
    println!("{}", output.unwrap());
}

相关问题