Windows 在MSYS2/MinGW中执行脚本

Windows 在MSYS2/MinGW中执行脚本,windows,mingw-w64,msys2,Windows,Mingw W64,Msys2,在Windows上,如果我启动c:\msys64\mingw64.exe,它会打开一个shell,我可以在其中构建我的项目,比如调用releasebash脚本(以简化)。一切正常 现在,我想直接在mingw64上执行我的release脚本,无需交互 我试过: c:\msys64\mingw64.exe /c/the/full/path/release 窗口打开和关闭时,它不工作 我试图直接使用bash,但环境设置似乎不正确: > c:\msys64\usr\bin\bash -c ls

在Windows上,如果我启动
c:\msys64\mingw64.exe
,它会打开一个shell,我可以在其中构建我的项目,比如调用
release
bash脚本(以简化)。一切正常

现在,我想直接在
mingw64
上执行我的
release
脚本,无需交互

我试过:

c:\msys64\mingw64.exe /c/the/full/path/release
窗口打开和关闭时,它不工作

我试图直接使用
bash
,但环境设置似乎不正确:

> c:\msys64\usr\bin\bash -c ls
/usr/bin/bash: ls: command not found

> c:\msys64\usr\bin\bash -c /bin/ls
... it works ...
因此,很明显,环境与执行
c:\msys64\mingw64.exe
然后调用
ls
时不同


如何像在由
mingw64.exe启动的shell中一样执行我的
release
脚本?

要在MSYS2中运行Bash shell脚本而不显示窗口,您应该右键单击桌面或Windows资源管理器中的其他位置,选择“新建”,选择“快捷方式”,然后为快捷方式目标输入如下内容:

C:\msys64\usr\bin\mintty.exe -w hide /bin/env MSYSTEM=MINGW64 /bin/bash -l /c/Users/rom1v/project/release.sh
请注意,这里有4条路径。到
mintty
release.sh
的路径是您需要调整的绝对路径。到
env
bash
的路径与MSYS2安装目录相关。还请注意,第一个路径必须是标准的Windows路径,因为Windows在运行快捷方式时需要这样做

解释 对于非交互式脚本使用
MinTTY
似乎有些奇怪,但我们需要使用为Windows子系统编译的一些程序(
-mwindows
选项到GCC),否则Windows将在我们运行程序时自动启动新控制台。我们将
-w hide
选项传递给MinTTY,告诉它不要实际显示窗口。该选项之后的所有内容都由
MinTTY
解释为要运行的命令

因此MinTTY将从MSYS2发行版运行
/bin/env
,并将剩余的参数传递给它。这是一个方便的实用工具,实际上是Linux和MSYS2的标准部分。它将
MSYSTEM
环境变量设置为
MINGW64
(这在后面很重要),然后使用其余的命令行参数运行
/bin/bash

我们将
-l
传递给Bash,使其充当登录脚本,并运行某些启动脚本。特别是,MSYS2中的
/etc/profile
脚本非常重要,因为它查看
MSYSTEM
环境变量,发现它是
MINGW64
,然后设置一组其他环境变量(例如
PATH
)来为您提供MinGW 64位shell环境

最后,我们将脚本的名称作为主参数传递给
bash
,以便它在运行初始化脚本后运行该脚本

错误处理 请注意,如果Bash脚本有错误,则不会收到任何通知,因为上面的快捷方式不会打开任何控制台窗口。我个人会觉得这很烦人。我可能会删除
-w hide
选项,然后制作一个包装器bash脚本,它的功能如下:

run_my_main_script || sleep 10000

因此,如果主脚本成功,请立即退出,否则请保持窗口打开10000秒。你甚至不必把包装器脚本放在它自己的文件中,你只需把它放在快捷方式中作为Bash的
-c
选项的参数(别忘了用双引号把它括起来)。

多亏了@David Grayson的回答,我在Windows控制台(
cmd
)上用msys2/mingw调用了我的
发布
脚本,带有
$PATH
中的附加目录(用于Java和Meson):

c:\msys64\usr\bin\env MSYSTEM=MINGW64 c:\msys64\usr\bin\bash -l -c "PATH=\"/c/Program Files/Java/jdk1.8.X_XXX/bin:/c/Program Files/Meson:$PATH\" /c/Users/rom1v/project/release"

试试这个:
msys2_shell.cmd-mingw64-c“help | more”
@KonstantinL这有帮助,我可以执行我的脚本,但是1)环境仍然不一样(例如,它找不到介子,而它在mingw64 shell中找到了介子),2)它打开了一个新窗口。我已经发布了我的答案,但我想澄清一下你的“新窗口”抱怨你到底想不想看到什么窗口?如果你的脚本有错误,你想知道错误是什么,会发生什么情况?@DavidGrayson谢谢你的长篇大论,我会仔细阅读。关于没有窗口,我想从另一个程序(例如jenkins)执行脚本并以编程方式检索其输出(就像我对任何不使用msys2的“本机”脚本所做的那样)。您在问题中没有提到这一点。从Jenkins运行的命令可能与我的答案中的命令类似,只是您删除了
/bin/env
之前的所有内容,并将
/bin/env
替换为指向同一程序的绝对Windows样式路径。运行mintty可能会阻止您获取输出。请注意,
-w hide
仍然会取消当前窗口的焦点,至少在我的情况下是这样。我仍在寻找一个解决方案,以防止这种情况发生,让它保持对其当前计划的关注。