我想通过std::process::Command::spawn
执行外部程序。此外,我想知道产生该过程失败的原因:是因为给定的程序名称不存在/不存在于PATH中还是因为某些不同的错误?
我想要实现的示例代码:
match Command::new("rustc").spawn() {
Ok(_) => println!("Was spawned :)"),
Err(e) => {
if /* ??? */ {
println!("`rustc` was not found! Check your PATH!")
} else {
println!("Some strange error occurred :(");
}
},
}
当我尝试执行一个不在我的系统上的程序时,我得到:
Error { repr: Os { code: 2, message: "No such file or directory" } }
但我不想依赖它。有没有办法确定PATH中是否存在程序?
答案 0 :(得分:7)
您可以使用e.kind()
查找错误ErrorKind
。
match Command::new("rustc").spawn() {
Ok(_) => println!("Was spawned :)"),
Err(e) => {
if let NotFound = e.kind() {
println!("`rustc` was not found! Check your PATH!")
} else {
println!("Some strange error occurred :(");
}
},
}
编辑:我没有找到任何关于可以返回错误类型的明确文档,所以我查找了源代码。似乎错误是直接从操作系统返回的。相关代码似乎在src/libstd/sys/[unix/windows/..]/process.rs
中。来自Unix版本的代码片段:
还有一个编辑:再想一想,我不确定许可证是否真的允许在这里发布部分Rust来源,所以你可以在github 上看到它
只返回Error::from_raw_os_err(...)
。 Windows版本似乎更复杂,我无法立即找到它甚至返回错误的位置。无论哪种方式,您的操作系统似乎都受此限制。至少我在src/libstd/process.rs
中找到了以下测试:
与上述相同:github
这似乎保证至少在找不到二进制文件时应该返回ErrorKind::NotFound
。假设OS在其他情况下不会给出NotFound错误,但是谁知道,这是有意义的。如果你想完全确定找不到程序,你必须手动搜索$ PATH中的目录。类似的东西:
use std::env;
use std::fs;
fn is_program_in_path(program: &str) -> bool {
if let Ok(path) = env::var("PATH") {
for p in path.split(":") {
let p_str = format!("{}/{}", p, program);
if fs::metadata(p_str).is_ok() {
return true;
}
}
}
false
}
fn main() {
let program = "rustca"; // shouldn't be found
if is_program_in_path(program) {
println!("Yes.");
} else {
println!("No.");
}
}