Windows エクスプローラから Bash スクリプトを開いて実行したい

Windows 環境での自動化というと、Windows コマンドプロンプトや PowerShell を使うのが妥当だと思うが、GitBash (Git SDK) をインストールしているので、Bash でスクリプトを書きたいなーと思うこともある。WSL から Windows ホスト上に移動して作業しても良いのかもしれないが、何となくそれは気持ち悪い気がして避けている。

.bat ファイルや .ps1 ファイルは、エクスプローラからダブルクリックすればスクリプトを実行できるので、同じ要領で、Windows のエクスプローラ上で .bash ファイルをダブルクリックして、GitBash (Git SDK) で実行できたらいいなーと考えていた。

今回色々と試行錯誤して、それらしい技を編み出したので紹介する。

目次

1. 任意の Bash スクリプトを実行する Windows バッチファイル

最初に作ったのはこんな Windows バッチファイル。

@C:\git-sdk-64\usr\bin\bash.exe --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'

@ でプロンプトを非表示にし、Git SDK 内の bash.exe を使う (通常の GitBash を使っている人はパスを適宜書き換えること)。

あとは通常の bash コマンドどおり、--login -i -c で実行したいスクリプトファイルへのフルパスを渡す。

末尾に ; read を入れているのは、実行後にウィンドウを開きっぱなしにしておきたいため。Enter を押せばウィンドウが閉じるようにしてある。

このようなバッチファイルを作ると、Windows コマンドプロンプト上で Bash スクリプトが実行される。実際の .bash ファイルと別々にファイルを持つことになるが、とりあえずこのバッチファイルへのショートカットを用意しておけば、エクスプローラ上から好きな Bash スクリプトを実行できるだろう。

2. 「GitBash」なウィンドウ (= MinTTY) で任意の Bash スクリプトを実行する Windows バッチファイル

上のバッチファイルだと、Windows コマンドプロンプトのウィンドウで Bash が実行されるので、コンソール出力が味気ない。せっかくなら、いつも使っている GitBash のウィンドウ (git-bash.exe を実行して開かれる MinTTY のウィンドウ) でスクリプトを実行したい。

色々調べてみたが、git-bash.exe 自体で任意のスクリプトを実行させるようなオプションはないっぽかった。調べてみると、以下の記事を見付けた。

コレを参考に編み出したのが以下のワンライナー。

@C:\git-sdk-64\usr\bin\mintty.exe --icon C:\git-sdk-64\git-bash.exe --exec '/usr/bin/bash' --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'

このバッチファイルを開けば、Bash スクリプトが実行されるウィンドウが GitBash のモノ (= MinTTY) になった。いつもの GitBash のウィンドウを開いて Bash スクリプトを実行した時と同じ UI になるだろう。

3. コマンドプロンプトのウィンドウがチラつかないように GitBash ウィンドウを直接開く VBScript

上のワンライナーで、MinTTY ウィンドウを開いて Bash スクリプトを実行できるようになった。

しかし、Windows バッチファイルである以上、.bat ファイルを実行した直後に一瞬だけ「Windows コマンドプロンプト」のウィンドウが表示され、その後すぐに「MinTTY ウィンドウ」が開く、という挙動になる。

一瞬だけ開くコマンドプロンプトのウィンドウがチラついて鬱陶しい…そんな時は WSH だ!!

↑ コレの応用。

WScript.CreateObject("WScript.Shell").Run "C:\git-sdk-64\usr\bin\mintty.exe --icon C:\git-sdk-64\git-bash.exe --exec '/usr/bin/bash' --login -i -c '/c/Users/Neo/bin/my-bash-script.bash ; read'"

上述のワンライナーを、WSH で実行するようにしている。WScript.CreateObject("WScript.Shell").Run 以降の内容は全く同じだ。もしも実行するコマンド内にダブルクォートを含む場合は、VBScript の書式に合わせて調整すること。

WSH (.vbs) も、.bat 同様エクスプローラからダブルクリックで実行できるので、この VBScript へのショートカットを配置しておけばよかろう。


実行する Bash スクリプト内で read -p なんかを使っていると、起動スクリプト中に書いた ; read が上手く効かないことがある。原因がイマイチ分かっていないのだが、; read ; read と、read コマンドを2回連続で記入しておけば、確実に止められた。

以上。コレで Windows エクスプローラから Bash ファイルを直接実行できるようになった。2021年も WSH じゃ…。