Flat Leon Works

アプリやゲームを作ってます。

MacとWindowsで共通のバッチファイル(シェルスクリプト)を利用できるようにする

Windowsにはダブルクリックでスクリプトを実行できるバッチファイルという便利な仕組みがあります。Macにはバッチファイルというものはありませんが、拡張子を.commandにしたシェルスクリプトを用意することでバッチファイルと同じようにダブルクリックでスクリプトを実行させることができます。ところで、WindowsでもMSYS等を導入することでシェルスクリプトを実行することができるようになります。ということは、MacWindowsで共通のバッチファイルを利用することも可能なのではないでしょうか。ということで、いろいろ模索してみた結果、実際に実現することができたのでその方法を紹介したいと思います。

執筆時の環境

  • Windows 10(1709)
  • Msys2 (version 20161025)

注意

  • 「バッチファイル」は正確にはWindowsの用語ですが、ここでは「ダブルクリックで実行できるスクリプトファイル」のことをバッチファイルと呼ぶことにします
  • 今回紹介する方法ではWindowsにMsys2+MinGWを導入する必要があります

実現方法

記事のタイトルは「MacWindowsで共通のバッチファイル(シェルスクリプト)を利用できるようにする」となっていますが、具体的には「MacWindowsシェルスクリプトをダブルクリックで起動できるようにする」という形になります。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ファイルに記述したシェルスクリプトをダブルクリックで実行できるようになりました!(初回はどのアプリで開くかのダイアログが出るかもしれません。その場合は先程設定したファイルタイプが選択肢にあるはずなのでそれを選びます)

まとめ