対象読者
- WindowsでVS Codeを使って開発しているエンジニア
-
~/.bash_profileでcygpathを使ってパスを変換している方 - Windows TerminalのGit Bashでは使えるのに、VS CodeのGit Bashではコマンドが見つからないことがある方
- 本記事の検証内容は執筆時点(2026年4月)のものです。VS Codeはアップデートが活発なため、最新バージョンでは挙動が異なる場合があります
- 本記事の執筆には生成AIを使用しています
TL;DR
-
~/.bash_profileにexport PATH=$(cygpath -up $PATH)と書くと、VS CodeのGit Bashでだけコマンドが見つからないという現象が起きることがある - 原因は
$PATHをダブルクォートで囲んでいないことで発生する単語分割(word splitting) -
export PATH=$(cygpath -up "$PATH")とダブルクォートで囲むだけで解決できる
背景:Windows TerminalとVS Codeで使えるコマンドが違う!
先日、Windows TerminalのGit Bashでは問題なく使えているコマンドが、VS CodeのターミナルのGit Bashでだけ「コマンドが見つからない」とエラーになることに気が付きました。
同じ~/.bash_profileが読み込まれているはずなのに、なぜ環境によって結果が変わるのか、しばらく原因がわかりませんでした。
環境
- OS: Windows 11 Pro
- VS Code: 1.117.0
- Git for Windows: 2.54.0
- Windows Terminal: 1.22.3232.0
重要:cygpathに渡す$PATHはダブルクォートで囲む
WindowsのPATHはセミコロン(;)区切りで、パスの表記もバックスラッシュ使いです。Git Bash上ではコロン(:)区切りのUnix形式に変換する必要があるため、~/.bash_profileに次のような記述をすることがあります。
export PATH=$(cygpath -up $PATH) # ← $PATH がクォートされていない
cygpath -upはWindowsスタイルのPATH文字列をUnix形式に変換するコマンドです。しかし、$PATHをダブルクォートで囲んでいないと、シェルの単語分割(word splitting) が発生します。
単語分割とは、シェルが変数を展開したあとにスペース・タブ・改行で文字列をバラバラにする処理のことです。WindowsのパスにはC:\Program Files\のようにスペースが含まれるものが多く、特にVS CodeがPATHに追加するパス(C:\Program Files\Microsoft VS Code\binなど)はこれに該当します。
$PATHをクォートせずに展開すると、スペースで区切られたパスが複数の引数としてcygpathに渡ってしまい、変換結果が壊れます。結果として、そのパス以下にあるコマンドが見つからない状態になります。
Windows TerminalのGit BashではたまたまPATHにスペースを含むパスが少ないため問題が出にくいのですが、VS CodeはインストールディレクトリをPATHに追加するため、スペースを含むパスが混入しやすく、影響が出やすい環境です。
ハマりポイント
1. Windows TerminalとVS Codeで挙動が変わる
両者とも同じ~/.bash_profileを読み込んでいるにもかかわらず、使えるコマンドが異なります。VS Codeは起動時に独自のパスをPATHに追加するため、スペースを含むパスが混入しやすく、クォートなしの変数展開の影響を受けやすい環境です。
2. echo $PATHで確認しても気づきにくい
echo $PATHの出力は一見正しそうなパスが並んでいるように見えますが、よく確認するとスペースを含むパスが途中で切れていたり、余計なパスが増えていることがあります。意図した変換結果かどうかは、既知のパス(Windowsのパスで言うとどのディレクトリに対応するか)と照らし合わせて確認する必要があります。
3. .bash_profileを修正してもすぐに反映されない
ターミナルを開き直すだけでは既存のVS Codeプロセスが保持している環境変数は更新されません。.bash_profileを修正したあとはVS Codeを完全に再起動してから、新しいターミナルで動作確認する必要があります。
実例
修正前のコード(問題あり)
# ~/.bash_profile
export PATH=$(cygpath -up $PATH)
$PATHがクォートされていないため、スペースを含むWindowsパスで単語分割が発生します。
修正後のコード(OK)
# ~/.bash_profile
export PATH=$(cygpath -up "$PATH")
"$PATH"とダブルクォートで囲むと、PATHの値がスペースで分割されずに1つの文字列としてcygpathに渡されます。スペースを含むWindowsパスも正しく変換できるようになります。
動作確認の手順
-
~/.bash_profileを上記のように修正する - VS Codeを完全に終了する
- VS Codeを再度起動し、ターミナルを新規に開く
- 以下のコマンドで変換後のPATHを確認する
echo $PATH
スペースを含むWindowsパスが正しく変換されて含まれていれば修正完了です。これまで使えなかったコマンドが実行できるようになっているはずです。
まとめ
~/.bash_profileでcygpathを使ってWindowsのPATHをUnix形式に変換するときは、"$PATH"とダブルクォートで囲むのを忘れないようにしましょう。
# 正しい書き方
export PATH=$(cygpath -up "$PATH")
シェルスクリプトで変数を使うときはダブルクォートで囲むのが基本ですが、PATHのようにスペースを含む可能性がある値では特に重要です。Windows Terminalでは問題が出にくいため、VS Codeでだけ動かないという症状が現れたとき、この点は見落としがちです。
同じ現象で困っている方のヒントになれば幸いです。
参考資料
- Word Splitting - GNU Bash Reference Manual(シェルにおける単語分割の仕様)
- Bash Startup Files - GNU Bash Reference Manual(ログインシェルで読み込まれるファイルの説明)
- cygpath - Cygwin User's Guide(cygpathコマンドのオプション一覧)
- Git for Windows(Git BashとGit for Windowsの配布元)