バッチファイルからBashシェルスクリプトを実行する方法

Cygwin + Bashシェルスクリプトってほんとに便利!

最近は WSL が流行りですが、まだまだCygwinの出番も多いですよね。

そんな便利なBashシェルスクリプトですが、Batファイルと違ってエクスプローラーから直接実行できないのが難点です。

そんなときはBashシェルスクリプトを起動するBatファイルを作ってみましょう。

ここからの解説はCygwinを前提にしていますので、あらかじめCygwinをインストールしておいてください。

バッチファイルからBashシェルスクリプトを実行する方法

bash.exeにコマンド(シェルスクリプト)を渡すことでバッチファイルからBashシェルスクリプトを実行することができます。

@SETLOCAL
@SET PATH="C:\cygwin64\bin";%PATH%
@SET CHERE_INVOKING=yes
@SET LANG=ja_JP.SJIS
@FOR /F %%f in ('cygpath.exe -u %1') do @SET FILE=%%f
@bash.exe --login -i -c "ls -l %FILE% ; read -p \"hit enter key...\""
@ENDLOCAL

このサンプルbatにファイルをドラッグアンドドロップすると、そのファイルの情報をlsコマンドで表示することができます。

では、サンプルの解説です。

サンプルバッチの解説

  • @SETLOCAL, @ENDLOCAL
    @SETLOCALと@ENDLOCALで囲むと、その中で設定した環境変数はその範囲内でだけ有効になります。その外側には影響を及ぼさないので、環境変数をローカル変数として扱うことができます。これは便利!
  • @SET PATH="C:\cygwin64\bin";%PATH%
    bash.exeやcygpath.exeなどのCygwinコマンドのパスを設定しておきます。
  • @CHERE_INVOKING=yes
    Bashシェルを起動したときのカレントディレクトリをCygwinのホームディレクトリにcdせず、今のカレントディレクトリのままでBashシェルを起動します。このサンプルでは意味ありませんが、覚えておくと便利です。
  • @LANG=ja_JP.SJIS
    Bashシェルで日本語表示できるようにします。これをしておかないと日本語が文字化けします。
  • @FOR /F %%f in ('cygpath.exe -u %1') do @SET FILE=%%f
    第一引数で渡されたファイル名(ドラッグアンドドロップされたファイル名)をCygwinのパスに変換して環境変数FILEに代入します。しかし、なんでコマンドの実行結果を得るのにこんな冗長な記述しなきゃいけないんでしょうね。Bashなら `コマンド` で済むのに。
  • @bash.exe --login -i -c "ls -l %FILE% ; read -p \"hit enter key...\""
    Bashシェルスクリプトを実行し、""で囲まれた箇所のコマンドを実行します。ここをシェルスクリプトファイル名に変えれば、任意のスクリプトを実行することができます。

ちなみに、コマンド前の@は『コマンドプロンプトにコマンドを表示せずに実行する』という意味です。

活用方法

BashシェルスクリプトをBatファイルでラッピングするという一見技術の無駄遣いっぽい方法ですが、こうしておくと

  • Bashシェルスクリプトをダブルクリックで起動できる
  • ファイルのドラックアンドドロップでBashシェルスクリプトを起動できる

などすごく便利です。

Bashシェルスクリプトを実行するのにわざわざCygwimターミナルを立ち上げるのはちょっとストレスなんですよね。この方法ならストレスフリーでBashシェルスクリプトを実行できます。