在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中一样?
答案 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条路径。 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
,然后设置一堆其他环境变量(例如{{ 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"