PaPoo
cover

ENOTDIR が出るときに見るべき 2 つの壊れ方

まず、この ENOTDIR は 1 つの症状に見えて、少なくとも issue 上では 2 つの壊れ方が報告されています。どちらも「ディレクトリとして扱うはずの場所が、そう扱えない」という点は共通ですが、起きる場所が違います。

ひとつは、デスクトップアプリでセッションを fork するときです。~/.claude/projects/<project> がシンボリックリンクになっている環境で、LocalSessions.forkSession の IPC ハンドラが ENOTDIR を投げ、UI 側でエラーが飲み込まれてしまう、という報告でした。結果として何も起きないか、親履歴のない空の新規セッションになるようです。これは #90931 に書かれています。

もうひとつは Bash tool 側です。こちらはコマンドが走る前に落ちます。issue では、セッションディレクトリを /proc/self/fd/N/ 経由で作ろうとして ENOTDIR になっている、と報告されています。Linux で procfs がない、あるいは不完全な環境で再現し、mkdirat(fd, name, mode) に置き換えるべきだという提案が出ています。これは #93680 です。

筆者環境の実測出力は、今回の本文中には症状の再現ログがないため、環境情報だけを載せます。

[env_summary]
OS          : Linux 3.10.0-1160.76.1.el7.x86_64 (x86_64)
Python      : 3.8.13
検証日時    : 2026-09-12T08:51:48+09:00

この2件を比べると、切り分けの入口はかなりはっきりしています。デスクトップアプリで「fork したのに反応がない」「空のセッションになる」なら #90931 の系統がまず疑わしいです。逆に Bash tool の実行そのものが毎回即死して ENOTDIR を見るなら #93680 に近いです。

現時点で、少なくとも issue から確認できる範囲では、どちらも根本修正がこの本文だけでは確定していません。#90931 は closed ですが、本文からは回避策までは読み取れませんでした。#93680 は open で、報告者は mkdirat への変更を求めています。ここでは断定せず、再現条件に近いかどうかを先に見たほうがよさそうです。


検証環境

OS          : Linux 3.10.0-1160.76.1.el7.x86_64 (x86_64)
Python      : 3.8.13
検証日時    : 2026-09-12T08:51:48+09:00

参照した Issue(anthropics/claude-code): #93680, #90931

同じ著者の記事