rust 匹配表达式中的Ok()正在处理错误消息,而不是Err()

xjreopfe  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(251)

我执行命令:

use std::process::Command;

pub fn search(query: &str, flag: &str) -> Vec<String> {
    let command = format!("xdotool search --onlyvisible {} {}", flag, query);
    let output = Command::new("sh").arg("-c").arg(command).output();

    match output {
        Ok(o) => {
            println!("Success message: {:?}", o);

            String::from_utf8_lossy(&o.stdout)
                .lines()
                .map(|s| s.to_owned())
                .collect()
        }
        Err(err) => {
            eprintln!(
                "Error message: {:?}",
                String::from_utf8_lossy(&err.to_string().as_bytes())
                    .trim()
                    .to_owned()
            );
            Vec::new()
        }
    }
}

如果我使用了错误的flag,我会得到一条错误消息,但是Ok()的错误消息会在search()函数中处理:

Success message: Output { status: ExitStatus(unix_wait_status(256)), stdout: "", stderr: "search: unrecognized ...

为什么会这样?如何让Err()处理错误消息?

ilmyapht

ilmyapht1#

output()返回的Err表示生成进程失败,与进程本身的成败无关,需要检查ExitStatus

if !o.status.success() {
    // Probably print stderr and bail.
}

相关问题