Windowsにはダブルクリックでスクリプトを実行できるバッチファイルという便利な仕組みがあります。Macにはバッチファイルというものはありませんが、拡張子を.commandにしたシェルスクリプトを用意することでバッチファイルと同じようにダブルクリックでスクリプトを実行させることができます。ところで、WindowsでもMSYS等を導入することでシェルスクリプトを実行することができるようになります。ということは、MacとWindowsで共通のバッチファイルを利用することも可能なのではないでしょうか。ということで、いろいろ模索してみた結果、実際に実現することができたのでその方法を紹介したいと思います。
執筆時の環境
- Windows 10(1709)
- Msys2 (version 20161025)
注意
- 「バッチファイル」は正確にはWindowsの用語ですが、ここでは「ダブルクリックで実行できるスクリプトファイル」のことをバッチファイルと呼ぶことにします
- 今回紹介する方法ではWindowsにMsys2+MinGWを導入する必要があります
実現方法
記事のタイトルは「MacとWindowsで共通のバッチファイル(シェルスクリプト)を利用できるようにする」となっていますが、具体的には「MacとWindowsでシェルスクリプトをダブルクリックで起動できるようにする」という形になります。Macで「シェルスクリプトをダブルクリックで起動できるようにする」は比較的簡単なので、今回紹介する方法のメインは、Windowsで「シェルスクリプトをダブルクリックで起動できるようにする」の実現方法です。
Macでシェルスクリプトをダブルクリックで起動できるようにする
Macでシェルスクリプトをダブルクリックで起動できるようにするには、シェルスクリプトを記述したファイルの拡張子を.commandにし、さらにファイルに実行権限を与える必要があります。やり方は以下の記事などが参考になります。
参考リンク
Windowsでシェルスクリプトをダブルクリックで起動できるようにする
Windowsでのシェルスクリプトの実行環境について
まず、Windowsでシェルスクリプトを実行する方法について考える必要があります。Windowsでシェルスクリプトを実行する方法はいろいろあると思いますが、今回利用するのはMsys2+MinGWです。
Msys2+MinGWの導入方法は以下のページなどを参考にしてください。基本的にはMsys2をインストールし、Msys2上からMinGWをインストールする流れだと思います。
参考リンク
シェルスクリプトを実行する
Msys2+MinGWを導入することでWindowsでシェルスクリプトを実行できるようになるわけですが、シェルスクリプトの実行には以下のようなステップを踏む必要があります。
- シェルを起動
- シェル上でシェルスクリプトを実行する
ダブルクリックでシェルスクリプトを実行できるようにするには、これらをまとめて実行できるようにしなければなりません。
Msys2のシェルの起動はMSYS2 MinGW 32-bit.lnk
のようなファイルで行うようになっているのですが、これはMsys2の起動用バッチの引数付きショートカットになっています。これを展開すると以下のようなコマンドになります。
C:\msys64\msys2_shell.cmd -mingw32
引数については-mingw32
の他に-mingw64
や-msys
なども指定可能なようですが、それぞれの違いがよくわからないのでとりあえず、-mingw32
としています。
Msys2の起動用バッチmsys2_shell.cmd
の中ではいろいろな処理のあとに最終的にbash.exeなどのシェルプログラムを起動しています。その際にmsys2_shell.cmd
に渡された引数はそのままシェルプログラムに渡されるようになっているようなので、以下のようにすることでシェルの起動と同時にシェルスクリプトファイルを渡すことができます。
C:\msys64\msys2_shell.cmd -mingw32 シェルスクリプトファイルパス
これでシェルスクリプトの起動が1つのコマンドでできるようになりました。なお、この方法で起動するとスクリプトの実行が終わったらすぐにシェルのウインドウが閉じてしまいます。出力結果などを確認したい場合は、シェルスクリプトの末尾にread
コマンドをおいてユーザーの入力を待つようにします。
ダブルクリックで起動できるようにする
シェルスクリプトをダブルクリックで起動できるようにするには、ファイルの関連付けを行います。今回はMacと共通のシェルスクリプトを利用できるようにするという目的なので、Macで利用している拡張子.command
で関連付けを行うことにします。
通常の関連付けの方法、つまりエクスプローラー上から「プログラムから開く->常にこのアプリを使う」という方法ではプログラムに対して引数を与えることができません。先程紹介したシェルの起動と同時にシェルスクリプトの実行を行うコマンドは、msys2_shell.cmd
に対して-mingw32
という引数を与えているので、エクスプローラーを使った関連付け方法は利用できません。
すでに.command
に対して関連付けを行ってしまっている場合は、それを解除してから以下の作業を行ってください。関連付けの解除については以下のサイトが参考になりました。
参考リンク
引数付きで関連付けを行うには、assoc
コマンドとftype
コマンドを使います。具体的には以下のような手順になります。
- 管理者権限でコマンドプロンプトを起動する(やり方は後述の参考リンクを参照)
.command
にファイルタイプShellScriptFile
を割り当てる :
assoc .command=ShellScriptFile
- ファイルタイプ
ShellScriptFile
の実行プログラムを設定する :
ftype ShellScriptFile="C:\msys64\msys2_shell.cmd" -mingw32 "%1" %*
ShellScriptFile
という名前は適当につけたものなので、別のものでもかまいません。
参考リンク
これでWindowsで.command
ファイルに記述したシェルスクリプトをダブルクリックで実行できるようになりました!(初回はどのアプリで開くかのダイアログが出るかもしれません。その場合は先程設定したファイルタイプが選択肢にあるはずなのでそれを選びます)