在cygwin上使用`std :: process :: Command`执行`find`不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在cygwin上使用`std :: process :: Command`执行`find`不起作用相关的知识,希望对你有一定的参考价值。
当我尝试从Rust程序调用find
命令时,我得到FIND: Invalid switch
或FIND: Parameter format incorrect
错误。
find
从命令行运行良好。
echo $PATH
/usr/local/bin:/usr/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:.....
我正在搜索的文件(main.rs
)存在。
use std::process::{Stdio,Command};
use std::io::{Write};
fn main() {
let mut cmd_find = Command::new("/cygdrive/c/cygwin64/bin/find.exe")
.arg("/cygdrive/c/cygwin64/home/*")
.stdin(Stdio::piped())
.spawn()
.unwrap_or_else(|e| { panic!("failed to execute process: {}", e)});
if let Some(ref mut stdin) = cmd_find.stdin {
stdin.write_all(b"main.rs").unwrap();
}
let res = cmd_find.wait_with_output().unwrap().stdout;
println!("{}",String::from_utf8_lossy(&res));
}
./find_苍茫大地.exe
thread '<main>' panicked at 'failed to execute process: The system cannot find the file specified. (os error 2)', find_cmdd.rs:12
我也试过以下选项,
let mut cmd_find = Command::new("find").....
我得到FIND:Invalid switch
错误。
我没有把find.exe
重命名/复制到另一个地方的奢侈。
当您通过Command
运行程序时,Cygwin基本上不存在。执行进程使用操作系统的本机功能;在Windows that's CreateProcessW
的情况下。
这意味着:
- 由cygwin shell设置的
PATH
变量在启动进程时可能意味着也可能没有任何意义。 - 使用
/cygdrive/...
的目录结构实际上并不存在于Windows中;那是一件神器。
总而言之,您必须使用Windows本机路径:
use std::process::{Stdio, Command};
use std::io::Write;
fn main() {
let mut cmd_find = Command::new(r#"msys32usrinfind.exe"#)
.args(&[r#"msys32home"#])
.stdin(Stdio::piped())
.spawn()
.unwrap_or_else(|e| panic!("failed to execute process: {}", e));
if let Some(ref mut stdin) = cmd_find.stdin {
stdin.write_all(b"main.rs").unwrap();
}
let res = cmd_find.wait_with_output().unwrap().stdout;
println!("{}", String::from_utf8_lossy(&res));
}
作为旁注,我不知道find
的管道标准输入是什么;它对Msys2或OS X似乎没有任何影响......
“查找:无效的切换错误”表示这不是cygwin find
,但是您正在调用Windows。要仔细检查:
$ find -k
find: unknown predicate `-k'
$ /cygdrive/c/windows/system32/find -k
FIND: Parameter format not correct
以上是关于在cygwin上使用`std :: process :: Command`执行`find`不起作用的主要内容,如果未能解决你的问题,请参考以下文章
cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员
使用多线程加速(std::async、std::thread 还是?)
如何使用 cygwin 在 Windows 上构建 zeromq?