在MSYS2 / MinGW中执行脚本

Windows上,如果我启动c:\msys64\mingw64.exe ,它会打开一个shell,在那里我可以构build我的项目,比方说通过调用一个release bash脚本(以简化)。 一切工作正常。

现在,我想直接在mingw64上执行我的release脚本,而不需要交互。

我试过了:

 c:\msys64\mingw64.exe /c/the/full/path/release 

一个窗口打开和closures,它不起作用。

我试图直接使用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

如何执行我的release脚本,就像我在mingw64.exe启动的shell mingw64.exe

要在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条路径。 minttyrelease.sh的路径是您需要调整的绝对路径。 envbash的路径是相对于您的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)调用我的release脚本:

 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"