繁体   English   中英

在 std::process::Command 中使用 ~

[英]Use ~ in std::process::Command

我正在尝试使用 std::process::Command 运行以编程方式安装在$HOME/.webdrivers的 webdrivers。 我不希望用户必须将目录添加到他们的路径中,所以我希望能够使用类似

let geckodriver = Command::new("~/.webdrivers/geckodriver")
        .stdout(Stdio::null())
        .stderr(Stdio::null())
        .spawn()?;

但这似乎不起作用。 我收到可执行文件不存在的错误。

thread 'main' panicked at 'Could not start geckodriver: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/lib.rs:49:10

什么都有帮助!

波浪号扩展是 shell(bash 等)的一个特性 - std::process::Command使用的操作系统设施不会扩展波浪号。 所以你必须自己做。

使用std::env::var_os获取HOME环境变量,将其转换为Path ,然后join您的可执行文件路径加入其中。

正如 stargateur 提到的~由 shell 扩展bash是一个 shell,可用于执行扩展。 而不是产卵geckodriver直接spawn bash产卵geckodriver

let geckodriver = Command::new("bash")
        .arg("-c")
        .arg("~/.webdrivers/geckodriver")
        .stdout(Stdio::null())
        .stderr(Stdio::null())
        .spawn()?;

当心:将参数打包到传递给Command::new("bash -c ~/.webdrivers/geckodriver")的字符串中将不起作用,因为它将查找文件bash -c ~/.webdrivers/geckodriver (带有文件名中的空格)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM