PaPoo
cover

EACCESで止まるときにまず疑う3つのパターン

EACCES が出ても、原因はひとつではありません。今回の issue 群では、見た目は似ていても中身がかなり違いました。ひとつはファイルパスに Cyrillic の混入が起きて別の場所を作ろうとしてしまうケースで、#41422 に報告があります。もうひとつは ~/.claude/settings.json の保存まわりで、シンボリックリンクが 1 段ではなく 2 段つながっていると atomic write が失敗するケースで、#78162 です。さらに Windows では、hook の実行先に App Execution Alias を指定すると Executable not found in $PATH と出る件が #85475 にあります。これは厳密には EACCES とは別ですが、権限や実行可否のエラーとして紛らわしいので、同じ流れで引っかかりやすいです。

自分のケースかどうかを見分けるには、まずエラーメッセージの出方を見ます。mkdir '/wоrksрасеs' のように、見た目は普通なのに一部の文字が非 ASCII に化けているなら #41422 の系統です。issue では、会話コンテキストに Cyrillic の homoglyph が混ざると、Read / Write / Edit のツール引数にその文字が混入し、Write fails with EACCES: permission denied, mkdir '/wоrksрасеs' になると報告されています。ここはパスが間違っているというより、モデルの出力側が汚染されて別文字列になっている、という説明でした。

~/.claude/settings.json を触ったときに失敗するなら、 #78162 の可能性があります。報告では、~/.claude/settings.json が「シンボリックリンク → さらにシンボリックリンク → 書き込み可能な実体」という鎖になっていると、Claude Code の atomic save が 1 段目のターゲットの横に一時ファイルを置こうとして失敗する、とされています。重要なのは、最終的に書ける先が存在していても、途中のリンク先が read-only だとそこで止まる点です。issue の文面では EROFS/EACCES が出るとされていましたが、筆者環境でこの再現は取れていません。なので、ここでは「その構成だと失敗しうる」とだけ書いておきます。

筆者の環境では、Claude Code は次の状態でした。

$ claude --version
2.1.207 (Claude Code)
$ claude doctor
Claude Code doctor

Running: native (2.1.207)
Commit: bc512d563325
Platform: darwin-arm64
Path: ~/.local/share/claude/versions/2.1.207
Config install method: native
Search: OK (bundled)
Auto-updates: enabled
Auto-update channel: latest
Last update attempt: none recorded

Multiple installations found
- npm-global at /usr/local/bin/claude
- native at ~/.local/bin/claude

Remote Control
Control this session from claude.ai/code or the Claude mobile app

1 warning found
- Leftover npm global installation at /usr/local/bin/claude
  Fix: Run: npm -g uninstall @anthropic-ai/claude-code

For a full setup checkup that can also fix issues, run /doctor in a Claude Code session.
$ /usr/bin/which -a claude
~/.local/bin/claude
/usr/local/bin/claude
/usr/local/bin/claude

この出力だけ見ると、claude の実体が複数見えており、少なくともインストール経路は単純ではありません。claude doctor でも Multiple installations found と出ています。ただし、これだけで今回の EACCES の直接原因だとは言えません。実際には、報告内容に近いパスや設定ファイルの状態を確認しないと切り分けはできないです。

~/.claude/settings.json の構造は確認できましたが、値は出さずに構造だけ見るとこうでした。

[settings_structure]
~/.claude/settings.json:
  permissions: object
    allow: array[73]
    additionalDirectories: array[3]
  effortLevel: str
  voiceEnabled: bool
  model: str
  hooks: object
    Stop: array[1]
      hooks: array[1]
        ...
    PermissionRequest: array[1]
      hooks: array[1]
        ...
    PreToolUse: array[1]
      hooks: array[1]
        ...
      matcher: str
    UserPromptSubmit: array[1]
      hooks: array[1]
        ...
    SubagentStop: array[1]
      hooks: array[1]
        ...
~/git/papoo/newsbot_openai/.claude/settings.json: (存在しない)
~/git/papoo/newsbot_openai/.claude/settings.local.json: (存在しない)

ここから言えるのは、少なくとも筆者環境ではローカルの .claude/settings.json 系は存在しない場所があり、設定の置き方が一様ではないことです。とはいえ、#78162 のような symlink 連鎖の問題を自分の環境で断定する材料にはなっていません。

Windows で hook の実行先を WindowsApps 配下に向けた場合の話は、今回の macOS 検証とは別件です。#85475 では、pwsh.exepython.exe の App Execution Alias に向けた hook が、Executable not found in $PATH と報告されるのに、実際には「$PATH にない」のではなく「その実行方法では起動できない」ことが問題だとされています。ここはメッセージが紛らわしい、というのが issue の主旨でした。

現時点で実際に裏が取れているのは、「EACCES はひとつの症状名であって、原因は少なくとも 3 系統ある」ということです。会話文脈に Cyrillic が混ざるとパスが壊れる話、settings.json の symlink が 2 段あると atomic save が失敗する話、そして Windows の hook 先が App Execution Alias だと別種の実行エラーになる話。このうち、筆者環境で直接確かめられたのは claude doctorwhich -a claude、それから settings.json の構造確認まででした。EACCES の再現そのものは取れていないので、ここは未解決です。


検証環境

claude --version : 2.1.207 (Claude Code)
OS          : Darwin 25.3.0 (arm64)
Python      : 3.14.2
検証日時    : 2026-08-11T18:14:20+09:00

参照した Issue(anthropics/claude-code): #78162, #41422, #85475

同じ著者の記事