使用Command在MSYS下的Windows上调用shell脚本

时间:2015-04-27 18:17:46

标签: path command rust msys

我试图在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脚本)来编译项目很难开始工作。

1 个答案:

答案 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();