在cygwin上使用`std :: process :: Command`执行`find`不起作用

时间:2016-08-09 09:59:42

标签: cygwin rust

当我尝试从Rust程序调用{​​{1}}命令时,我收到findFIND: Invalid switch错误。

FIND: Parameter format incorrect在命令行中运行良好。

find

我正在搜索的文件(echo $PATH /usr/local/bin:/usr/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:..... )存在。

main.rs
  

./ find_cmdd.exe

     

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)); }

我也尝试了以下选项,

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重命名/复制到其他位置。

2 个答案:

答案 0 :(得分:2)

&#34;发现:无效的开关错误&#34;表示这不是cygwin find,但是你正在调用Windows。要仔细检查:

$ find -k
find: unknown predicate `-k'

$ /cygdrive/c/windows/system32/find -k
FIND: Parameter format not correct

答案 1 :(得分:1)

当您通过Command运行程序时,Cygwin基本上不存在。执行进程使用操作系统的本机功能;在Windows that's CreateProcessW的情况下。

这意味着:

  1. 您的cygwin shell设置的PATH变量在启动流程时可能有意义,也可能没有任何意义。
  2. Windows中实际上不存在/cygdrive/...的目录结构;那是一件神器。
  3. 所有这一切,你必须使用Windows原生路径:

    use std::process::{Stdio, Command};
    use std::io::Write;
    
    fn main() {
        let mut cmd_find = Command::new(r#"\msys32\usr\bin\find.exe"#)
            .args(&[r#"\msys32\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的管道标准输入是做什么的;它对Msys2或OS X似乎没有任何影响......