AIエージェントが全員踏む穴 — Bash の /tmp と Windows の /tmp は別の場所だ
今回の登場人物
Keath(キース)
AI パートナー / Blues-Men プロジェクトリーダー
Delta Blues の記録者。コードを書く前に「本当にそれで合ってるか」と立ち止まる技術者。問題の根っこを掘る習慣を持つ。
デジタルを通じて音楽と人をつなぐ次世代プロジェクト。現在準備中。
ファイルを書いた。でも、消えていた。
「ファイルが存在しない」というエラーが出た。でも、たった今 curl で書いたはずだ。ログにも残っている。
これが、Windows で AI エージェントを動かしているときにキースが踏んだ穴だ。現象は単純に見えて、根っこは深い。
症状:ENOENT、ファイルが見つからない
Claude Code の AI エージェントが次のような流れで動いていた。
- Bash ツール(= git-bash)で
curlを実行し、結果を/tmp/result.jsonに書き出す - 次のステップで node.js スクリプトが
/tmp/result.jsonを読み込む
2番でエラーが出た。
Error: ENOENT: no such file or directory, open '/tmp/result.json'
ファイルは確かに書いた。なぜ見つからないのか。
原因:git-bash と Windows node.js では /tmp が別の場所を指す
Windows で Claude Code を動かすと、内部で2つの異なる実行環境が混在している。
| 実行環境 | /tmp の実際のパス |
|---|---|
| Bash ツール(git-bash / MSYS2) | C:\Users\[ユーザー名]\AppData\Local\Temp |
| node.js(Windows ネイティブ版) | C:\tmp\(存在しないことも多い) |
つまり、git-bash で書いたファイルと、node.js が探しに行く場所が、最初から噛み合っていないのだ。
Bash ツールが /tmp/result.json に書いたファイルは C:\Users\[ユーザー名]\AppData\Local\Temp\result.json に存在する。しかし Windows の node.js は C:\tmp\result.json を探しに行く。そのディレクトリ自体が存在しないケースも多い。
さらに厄介な罠:多バイト文字が Python パイプで化ける
追い打ちがある。中間処理に Python を経由させると、日本語などの多バイト文字が文字化けする場合がある。
たとえば curl の結果を python -c "..." でパースして次に渡す構成だと、Python のデフォルトエンコーディングがシステムの設定(cp932 / Shift-JIS)になっていて、UTF-8 の文字列が壊れた状態でファイルに書き出される。
すると node.js は「壊れた JSON」を受け取り、JSON.parse() が失敗する。エラーメッセージは SyntaxError: Unexpected token だ。このとき「ファイルの内容が壊れている」と気づくのが難しい。なぜなら cat /tmp/result.json(git-bash 側)では正常に見えるからだ。
解決策
キースが確認した解決策は2つある。
解決策 A:絶対パスを使う
/tmp ではなく、Windows・POSIX 両方から同じ場所として解釈できる絶対パスを使う。
# Bash ツール側
curl ... -o "$TEMP/result.json"
# node.js 側(同じ変数を参照)
const tmpFile = process.env.TEMP + '\\result.json'
解決策 B:プロセス間通信を標準入出力に一本化する
ファイル経由のやり取りをやめ、パイプと標準入出力で一連のチェーンを組む。環境依存の /tmp に頼らないので、根本的に問題が起きない。
Python を経由する場合は PYTHONUTF8=1 環境変数を設定するか、スクリプト冒頭に sys.stdout.reconfigure(encoding='utf-8') を挟む。
【技術コラム】Windows で AI エージェントを書く前に知っておくべきこと
Windows で Claude Code や AI エージェントのスクリプトを書くとき、「動く環境が複数混在している」ことを常に頭に置く必要がある。
環境マップ(Windows + Claude Code の場合)
| ツール | 動作環境 | パス解釈 |
|---|---|---|
| Bash ツール | git-bash(MSYS2 / POSIX エミュレーション) | POSIX(/c/Users/...) |
| PowerShell ツール | Windows PowerShell / pwsh | Windows(C:\Users\...) |
| node.js(スクリプト実行) | Windows ネイティブ node | Windows(C:\tmp) |
| python(スクリプト実行) | Windows ネイティブ python | Windows + cp932 デフォルト |
踏みやすい穴 チェックリスト
- ✅ Bash と node/python で同じ
/tmpパスを使っていないか - ✅ Python 経由のパイプで日本語(多バイト)を扱っていないか →
PYTHONUTF8=1 - ✅ ファイル共有より標準入出力チェーンにできないか
- ✅ 環境変数
%TEMP%/$TEMP/$env:TEMPの指す先が同じか確認する
「動く環境が複数混在している」ことを前提に書く。それが Windows での AI エージェント開発のスタート地点だ。
キースが残した一文
「AI エージェントはコードを書く。でも動く場所が1つとは限らない。どの環境で何が動いているか、最初に地図を描け。」
踏んだことがある人間だけが書ける一文だ。
株式会社ツクルンでは、仲間が踏んだ穴を記録し、次に踏む人がゼロになるまで書き続ける。tsukurun.co.jp →