Chapter 22

Gitが使える環境ならば、awkやPerlも使えるのです

zetamatta
zetamatta
2021.07.18に更新

Git for Windows には awk や Perl などの MSYS ツールのサブセットがついてきます。

git は開発者向けツールなので、一般のユーザ環境でインストールされていることは期待できませんが、GitHub で公開するソフトウェアから使う分には、入手している時点で git for Windows が入っているとしても問題ないでしょう。

つまり、ビルド用バッチならば awk や Perl が使えるということです。

awk や Perl は環境変数 PATH こそ通っていませんが、git.exe からは

  • (GITのインストールディレクトリ)/
    • cmd/
      • git.exe
    • usr/
      • bin/
        • gawk.exe
        • perl.exe

と相対パスが決まっています。なので、git の絶対パスが分かれば

setlocal
for %%I in (git.exe) do set "GITDIR=%%~dp$PATH:I.."
set "AWK=%GITDIR%\usr\bin\gawk.exe"
"%AWK%" "BEGIN{ print \"ahaha\" }"
endlocal

のように呼び出すことができます。

%~dp$PATH:Iは %I に与えられた実行ファイル名を %PATH% のリストのディレクトリから検索し、最初に見付かった実行ファイルの「ドライブ+ディレクトリ」に変換します。where.exe でも同様のことができますが、複数見付かったら複数行出力してしまうので、パス文字列を組み立てる時はこちらの方が都合がよいです。
ただし、このバッチファイルはパッケージマネージャの scoop でインストールされた git ではうまく動作しません。git.exe の本体ではなく、パスを調整するプロキシー的な実行ファイルが %PATH% のディレクトリリスト上にあるからです。

ですが、幸い、scoop の git の場合、%GIT_INSTALL_ROOT% という git のインストールディレクトリを示す環境変数が設定されているようです。これを利用しましょう。

完成形は以下のとおりです。

setlocal
if "%GIT_INSTALL_ROOT%" == "" for %%I in (git.exe) do set "GIT_INSTALL_ROOT=%%~dp$PATH:I.."
set "AWK=%GIT_INSTALL_ROOT%\usr\bin\gawk.exe"
"%AWK%" "BEGIN{ print \"success\" }"
endlocal