使用 cat 合并文件

Combine files with cat

我正在尝试使用 Rust 将文件与 cat 合并。下面是一些错误的示例代码,出现以下错误。

use std::process::Command as cmd;
cmd::new("/bin/cat")
    .arg("1.txt 2.txt > 3.txt")
    .spawn()
    .expect("Failure");

/bin/cat: '1.txt 2.txt > 3.txt': No such file or directory

我还尝试将它作为多个参数添加

cmd::new("/bin/cat")
    .args("1.txt 2.txt", ">", "3.txt")
    .spawn()
    .expect("Failure");

哪些错误出

/bin/cat: '1.txt 2.txt': No such file or directory
/bin/cat: '>': No such file or directory
/bin/cat: 3.txt: No such file or directory

我已经尝试过 cmd::new("/bin/sh"),但这也不起作用。

考虑到评论中的建议,这里有两个例子。

fn main() {
    // redirect output from rust
    std::process::Command::new("/bin/cat")
        .args(["1.txt", "2.txt"])
        .stdout(std::fs::File::create("3.txt").unwrap())
        .spawn()
        .expect("spawn failure")
        .wait()
        .expect("wait failure");
    //
    // rely on the shell for redirection
    std::process::Command::new("/bin/sh")
        .args(["-c", "cat 1.txt 2.txt >3_bis.txt"])
        .spawn()
        .expect("spawn failure")
        .wait()
        .expect("wait failure");
}

一个更简单和更强大的解决方案是使用 std::fs 而不是 cat:

use std::fs;

let file1 = fs::read_to_string("1.txt").expect("1.txt could not be opened");
let file2 = fs::read_to_string("2.txt").expect("2.txt could not be opened");

fs::write("3.txt", file1 + "\n" + &file2).expect("3.txt could not be written");

请注意,这不依赖于 cat,它适用于所有平台和操作系统,并且允许正确处理每个错误。