我试图在MSYS2环境中在Windows 7上调用Rust(1.0 beta 3)中的命令,但我无法理解如何操作。
假设您的主文件夹中有一个名为myls
的非常简单的脚本:
#!/bin/bash
ls
现在在Rust中创建一个调用脚本的简单程序:
use std::process::Command;
use std::path::Path;
fn main()
{
let path_linux_style = Path::new("~/myls").to_str().unwrap();
let path_win_style = Path::new("C:\\msys64\\home\\yourname\\myls").to_str().unwrap();
let out_linux = Command::new(path_linux_style).output();
let out_win = Command::new(path_win_style).output();
match out_linux
{
Ok(_) => println!("Linux path is working!"),
Err(e) => println!("Linux path is not working: {}", e)
}
match out_win
{
Ok(_) => println!("Win path is working!"),
Err(e) => println!("Win path is not working: {}", e)
}
}
现在,如果您尝试执行它,您将获得以下输出:
Linux path is not working: The system cannot find the file specified.
(os error 2)
Win path is not working: %1 is not a valid Win32 application.
(os error 193)
所以我无法在MSYS环境中调用任何命令。 我该如何解决?
修改:
我注意到,如果我调用可执行文件,问题不会发生,所以它似乎与调用bash脚本有关。无论如何,它非常烦人,因为它根据外部C / C ++代码(需要启动configure
脚本)来编译项目很难开始工作。
答案 0 :(得分:3)
Windows示例不起作用,因为Windows不是Unix。在类Unix系统上,脚本开头的#!
被识别,它在给定路径上调用可执行文件作为解释器。 Windows没有这种行为;即使它确实如此,它也不会识别/bin/bash
的路径名,因为该路径名是msys2模拟的路径名,它不是本机路径名。
相反,您可以使用msys2 shell显式执行所需的脚本,通过执行以下操作(根据需要更改路径,我已安装msys32
,因为它是32位VM)
let out_win = Command::new("C:\\msys32\\usr\\bin\\sh.exe")
.arg("-c")
.arg(path_win_style)
.output();