Open1

git-bash上からbatを呼び出すときにハマったことメモ

日照ちゃん日照ちゃん

環境

  • git version 2.47.1.windows.2
  • GNU bash, version 5.2.37(1)-release (x86_64-pc-msys)
  • WSL バージョン: 2.5.7.0

WSLでのcmd.exeの呼び出し

WSL上からcmd.exeを呼び出すときは以下のコマンドで呼び出せる。
/c オプションを使うとコマンド実行後にbashに処理が戻る。

cmd.exe /c echo test

batファイルを呼び出すときは以下のように引数を""で囲うことで正常に動作する。
引数内のパスの指定は\になるので気を付けること。

cmd.exe /c "path\to\dir\script.bat arg1 arg2"

Git Bashでのcmd.exeの呼び出し

git-bash上で同じコマンドを呼び出してもcmd.exeが立ち上がるだけでその後処理は正常に動作しない。

# NG
cmd.exe /c echo test

git-bashでは/から始まるオプションの引数を//に修正することで解決する。

# OK
cmd.exe //c echo test

なぜこのような動作になるのか?

git-for-windowsのrelease notesに理由が書いてある。
https://github.com/git-for-windows/build-extra/blob/main/ReleaseNotes.md#L14-L18
git-bashの仕様で、/から始まるものはPOSIX準拠のパス形式からWindows準拠のパス形式への変換が行われてしまうため正常に動作しない。
//にすることでパス変換を回避することができる。

結論

https://stackoverflow.com/questions/21357813/bash-in-git-for-windows-weirdness-when-running-a-command-with-cmd-exe-c-with-a
上記のstackoverflowの回答にも書いてあるけど、Unix互換環境としてgit-bashを使用するのはやめたほうがいいかもしれない。