在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条路径。 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)调用我的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"