在MSYS2/MinGW中执行脚本

问题描述 投票:0回答:4

在 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 中一样?

windows mingw-w64 msys2
4个回答
22
投票

要在 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
选项的参数放在快捷方式中(不要忘记将其用双引号括起来)。


11
投票

另一种方法是使用 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.

8
投票

感谢@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"

0
投票

对上面补充一下:如果你想要shell脚本的输出

  • 参考:https://mintty.github.io/mintty.1.html

-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"

==========

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.