web-dev-qa-db-ja.com

MSYS2 / MinGWでスクリプトを実行する

Windowsでは、c:\msys64\mingw64.exeを起動すると、シェルが開き、プロジェクトをビルドできます。たとえば、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を呼び出す場合と同じではないことは明らかです。

mingw64.exeで開始されたシェルにいるかのように、releaseスクリプトを実行するにはどうすればよいですか?

8
rom1v

ウィンドウを表示せずにMSYS2でBashシェルスクリプトを実行するには、デスクトップまたは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へのパスは、調整する必要のある絶対パスです。 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)MinGW64ビットシェル環境を提供します。

最後に、スクリプトの名前をメイン引数としてbashに渡すため、初期化スクリプトの実行後にそのスクリプトが実行されます。

エラー処理

上記のショートカットではコンソールウィンドウが開かないため、Bashスクリプトにエラーがある場合は通知が届かないことに注意してください。個人的にはかなり面倒だと思います。おそらく-w hideオプションを削除してから、次のようなラッパーbashスクリプトを作成します。

run_my_main_script || sleep 10000

したがって、メインスクリプトが成功した場合は、すぐに終了します。それ以外の場合は、ウィンドウを10000秒間開いたままにします。そのラッパースクリプトを独自のファイルに配置する必要はありません。Bashの-cオプションの引数としてショートカットに配置するだけです(二重引用符で囲むことを忘れないでください)。

10
David Grayson

@David Graysonからの回答のおかげで、Windowsコンソール(release)からmsys2/mingwを使用してcmdスクリプトを、追加のディレクトリ(JavaおよびMeson)in $PATH

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