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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在cygwin上使用`std :: process :: Command`执行`find`不起作用相关的知识,希望对你有一定的参考价值。

当我尝试从Rust程序调用find命令时,我得到FIND: Invalid switchFIND: 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的情况下。

这意味着:

  1. 由cygwin shell设置的PATH变量在启动进程时可能意味着也可能没有任何意义。
  2. 使用/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::wstring 移植到 gcc cygwin

使用多线程加速(std::async、std::thread 还是?)

如何使用 cygwin 在 Windows 上构建 zeromq?

如何使用Cygwin在Windows上运行OpenSSH SSHD服务器

Cygwin工具安装和使用指导书