使用命令在 MSYS 下的 Windows 上调用 shell 脚本
Invoking shell scripts on Windows under MSYS using Command
我正在尝试在 Windows 7 上的 MSYS2 环境中调用 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
脚本)变得棘手。
Windows 示例不起作用,因为 Windows 不是 Unix。在类 Unix 系统上,脚本开头的 #!
被识别,它调用给定路径的可执行文件作为解释器。 Windows 没有这种行为;即使它识别了,它也不会识别 /bin/bash
的路径名,因为该路径名是 msys2 模拟的路径名,它不是本机路径名。
相反,您可以使用 msys2 shell 显式执行您想要的脚本,方法如下(适当更改路径,我安装了 msys32
,因为它是 32 位的虚拟机)
let out_win = Command::new("C:\msys32\usr\bin\sh.exe")
.arg("-c")
.arg(path_win_style)
.output();
我正在尝试在 Windows 7 上的 MSYS2 环境中调用 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
脚本)变得棘手。
Windows 示例不起作用,因为 Windows 不是 Unix。在类 Unix 系统上,脚本开头的 #!
被识别,它调用给定路径的可执行文件作为解释器。 Windows 没有这种行为;即使它识别了,它也不会识别 /bin/bash
的路径名,因为该路径名是 msys2 模拟的路径名,它不是本机路径名。
相反,您可以使用 msys2 shell 显式执行您想要的脚本,方法如下(适当更改路径,我安装了 msys32
,因为它是 32 位的虚拟机)
let out_win = Command::new("C:\msys32\usr\bin\sh.exe")
.arg("-c")
.arg(path_win_style)
.output();