在 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 中一样?
要在 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子系统编译的some程序(GCC的-mwindows
选项),否则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
选项的参数放在快捷方式中(不要忘记将其用双引号括起来)。
另一种方法是使用 MSYS2 安装文件夹中的
msys2_shell.cmd
启动器。假设它已安装到默认文件夹,则命令为:
C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -here -c "your command here"
选项
-defterm
将输出发送到当前终端,-no-start
使得不会打开新的终端窗口,-here
使当前目录作为工作目录,-mingw64
是要使用的环境(其他可能性)是 -mingw32
、-ucrt64
、-clang64
),-c
是您的 shell 命令本身。
这是一个示例
msys2_shell.cmd
在基于 Git Bash MSYS2 的终端内运行时显示的帮助菜单:
$ /c/msys64/msys2_shell.cmd --help
Usage:
msys2_shell.cmd [options] [login shell parameters]
Options:
-mingw32 | -mingw64 | -ucrt64 | -clang64 | -msys[2] Set shell type
-defterm | -mintty | -conemu Set terminal type
-here Use current directory as working
directory
-where DIRECTORY Use specified DIRECTORY as working
directory
-[use-]full-path Use full current PATH variable
instead of trimming to minimal
-no-start Do not use "start" command and
return login shell resulting
errorcode as this batch file
resulting errorcode
-shell SHELL Set login shell
-help | --help | -? | /? Display this help and exit
Any parameter that cannot be treated as valid option and all
following parameters are passed as login shell command parameters.
感谢@David Grayson的回答,我成功地从Windows控制台(
release
)使用msys2/mingw调用我的cmd
脚本,并在$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"
对上面补充一下:如果你想要shell脚本的输出
-l,--日志文件|-
将所有输出复制到指定的日志文件或标准输出(如果给出破折号而不是文件名)。 (意味着 -o Logging=yes。)
如果 FILE 包含 %d,它将被进程 ID 替换。有关进一步的格式选项和提示,请参阅下面等效选项“日志文件”(Log=) 的说明。
请注意,可以从扩展上下文菜单中切换日志记录。
添加完整示例:
C:\msys64\usr\bin\mintty.exe -w hide -l - c:\msys64\usr\bin\env MSYSTEM=MINGW64 c:\msys64\usr\bin\bash -l -c "PATH=\"$PATH\" /C/Users/Administrator/Desktop/myProject/Demo_C_C++/shell/textProcess/bookNoteHandler.sh" | find /v "/v:Displays all lines that don't contain the specified"
==========