在MSYS2 / MinGW

时间:2017-11-22 15:46:47

标签: windows mingw-w64 msys2

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

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

我试过了:

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

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

2 个答案:

答案 0 :(得分:4)

要在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,然后设置一堆其他环境变量(例如{{ 1}})给你MinGW 64位shell环境。

最后,我们将脚本的名称作为主要参数传递给PATH,因此它将在运行初始化脚本后运行该脚本。

错误处理

请注意,如果您的Bash脚本有错误,您将不会收到任何通知,因为上面的快捷方式不会打开任何控制台窗口。我个人会发现这很烦人。我可能会删除bash选项,然后创建一个包装器bash脚本,它只执行以下操作:

-w hide

因此,如果主脚本成功,请立即退出,否则保持窗口打开10000秒。您甚至不必将该包装脚本放在自己的文件中,只需将其作为Bash的run_my_main_script || sleep 10000 选项的参数放入快捷方式中(不要忘记用双引号括起来)。

答案 1 :(得分:3)

感谢来自@David Grayson的答案,我设法用Windows控制台(release)中的msys2 / mingw调用我的cmd脚本,并在{$PATH中使用其他目录(用于Java和Meson) {1}}:

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"