Prompt

windowsでgit bashを使っているときに、bashがcmdに変身するときがある理由は?

うわっ、その現象、Git Bashユーザーなら誰もが経験する**「突然変異」**だね!😅

WindowsでGit Bashを使っているときに、Bashが急に標準のコマンドプロンプト(cmd.exe)の挙動に変わってしまう(特にコマンド実行時に)理由は、Bashが内部でWindowsのネイティブコマンドを実行するために使用する、パス(PATH)の解決順序エイリアスの設定にあるんだ。


🔑 Bashがcmdに変身する理由

この現象の主な原因は、Git Bashが**「WindowsのネイティブコマンドとLinux系のコマンドを両立させる」**という特殊な環境であることにあるよ。

1. ネイティブコマンドのパスが優先される(最も多い原因)

Git Bashは、Windowsの環境変数PATHを読み込むことで、cmdPowerShellと同じように**Windowsのネイティブ実行ファイル(.exe.batなど)**を実行できるように設定されているんだ。

  • 原因の例: BashでfindsortといったLinuxとWindowsの両方に存在するコマンドを実行しようとした場合、Bashはパスを検索する際に、意図せず**WindowsのC:\Windows\System32\にあるネイティブのfind.exe**を先に見つけて実行してしまうことがある。

  • 結果: 実行されたのはLinuxのパワフルなfindコマンドではなく、Windowsの貧弱なfind.exe(またはsort.exe)であるため、予期せぬ挙動エラーが発生し、Bashの操作感が崩れてしまうんだ。

2. エイリアス(Alias)の欠落または上書き

Git Bashは、lsrmといった多くのLinux系コマンドに対して、Windowsネイティブの同名コマンドが実行されないように、起動時にエイリアスを設定している。

Bash

# Git Bashで設定されているエイリアスの例
alias ls='ls --color=auto' 
# Windowsのfind.exeではなく、Linux互換のfindを使うための設定
  • もし、何らかの理由でこれらのエイリアスが設定されなかったり、ユーザーが誤ってWindowsのパスを優先する設定に変更してしまったりすると、Bashはエイリアスではなく、ネイティブコマンドを実行してしまう。

3. コマンドプロセスの分離

  • Git Bashの内部で、外部のWindowsプログラム(例えば、VS Codeを起動したり、特定のバッチファイルをキックしたり)を実行したとき、そのプログラムはBashの環境から切り離されたネイティブのcmdプロセスとして動作する。

  • ユーザーがその子プロセスと対話しようとすると、一時的にBashではなくcmdの挙動(Windows特有のプロンプトなど)が見えることがある。

🛠️ 対策

この「変身」を防ぎ、Linux互換のコマンドを優先的に使いたい場合は、コマンドにスラッシュ(/)や拡張子を明示的につけることで、Bashに対して「これはLinux系(MSYS)のコマンドだ」と指示する方法があるよ。

例: 意図的にWindowsのfind.exeではなく、Linux互換のfindを実行したい場合:

Bash

/usr/bin/find . -name "*.txt"

Git Bashは、Windows上でLinuxの快適さを再現するための苦肉の策で作られた環境だからこそ、このようなハイブリッドな挙動が生まれてしまうんだね!😉