node: not foundエラーの原因 — Claude Code WSLのnpmインストール
WSLでclaudeを実行するとnode: not foundになる原因を、Windows側Node.jsの取り違えとLinux側の未導入に分けて切り分けます。再現した出力と直し方つきです。
WSLでexec: node: not foundが出る場面
WSL内でnpm install -g @anthropic-ai/claude-codeを実行した後、claudeと入力すると次のエラーで起動しないことがあります。
exec: node: not foundこの症状の対象は、npm経由でインストールした場合です。ネイティブインストーラー(curl -fsSL https://claude.ai/install.sh | bash)で入れた場合は、この記事の対象外です。
公式のトラブルシューティングは、原因として「WSLがWindows側のNode.jsを使っている」ことを挙げています。nvmが読み込まれていない場合は、公式もよくある原因に挙げています。Linux側にNode.js本体が無い場合も、同じ文言で止まることがあります。npmインストールが求めるNode.jsのバージョンはClaude CodeにNode.jsは必要かにあります。
このメッセージはどこが出しているのか
先に押さえたいのは、claudeの本体はNode.jsを呼ばないという点です。npmパッケージはプラットフォーム別のネイティブバイナリを取得し、postinstallでclaudeコマンドの位置に置きます。公式のsetupページには「インストールされたclaudeバイナリ自体はNodeを呼び出さない」とあります。
それならなぜnodeが探されるのか。次の2点が手がかりになります。
- postinstallが終わるまで、
claudeは代わりのスクリプトです - そのpostinstall自体が
nodeで動きます(公式の復旧コマンドはnode node_modules/@anthropic-ai/claude-code/install.cjs)
つまり、PATHにnodeが無い環境ではpostinstallを実行できず、claudeは代わりのスクリプトのまま残ります。本体に届かないのは、この経路です。
文言の出どころは、手元で再現して確かめられます。PATHを空にした環境でexec nodeを実行すると、シェルが同じ形式のメッセージを返します(npm 10.8.2の環境、/tmpの一時ディレクトリで実行)。
printf '#!/bin/sh\nexec node "$@"\n' > w.sh && chmod +x w.sh
env -i PATH=/nonexistent /bin/sh ./w.sh./w.sh: line 2: exec: node: not found/bin/shはUbuntuやDebianではdashを指します。exec: node: not foundは、シェルがexecの宛先を見つけられなかったときの定型文です。#!/usr/bin/env nodeで始まるスクリプトの場合は、envが別の文言を出します。
env: node: No such file or directoryどちらも終了コードは127です。表示された文言がexec: node: not foundなら、シェルスクリプトがexec nodeを実行した結果、と読み分けられます。
似たエラーの見分け方
exec: node: not found
PATHにnodeが無い状態です。この記事の対象で、Windows側Node.jsの取り違えやLinux側の未導入が原因になります。
Exec format error
cannot execute binary file: Exec format errorはネイティブバイナリがWSL1のローダーで動かない問題です。公式はwsl --set-version <ディストリ名> 2でWSL2へ移す方法を示しています。
なぜWSLでWindows側のNode.jsを掴むのか
WSLは既定でWindows側のPATH環境変数をLinux側に取り込みます。cmd.exeやcode.exeをWSLのターミナルから呼べるのは、この仕組みのおかげです。Windows側にNode.jsを入れている場合は、取り込まれたパスに/mnt/c/配下のNode.jsも含まれます。
Linux側にnodeもnpmも無いと、/mnt/c/配下のWindows版が選ばれます。nvmを両方に入れている場合は、Windows側のnvmが優先されることがあります(詳しくは後の節で扱います)。Windows版のnpmでインストールすると、WSLのclaudeとしては動かないことがあります。インストール時にプラットフォーム不一致のエラーが出るのも、多くはこの取り違えが理由です。
症状から原因を切り分ける
whichで、実際にどのバイナリを参照しているかを見ます。
which npm
which nodewhich の出力から対処を選ぶ
- 1
両方が /usr/ や /home/ で始まる
Linux側のNode.jsを参照できています。
node -vを実行し、バージョンが出ることを確認します。nvmを使っているなら、ローダーが読み込まれているかを疑います。 - 2
/mnt/c/ で始まる
Windows側のバイナリを掴んでいます。Linux側にNode.jsを入れ、PATHの先頭に置きます。
- 3
何も表示されない
nodeがPATHのどこにもありません。パッケージマネージャーかnvmでNode.jsを導入します。
which npmだけを見て安心しないでください。npmがLinux側でもnodeが無い組み合わせは成立します。2つを必ずセットで確認します。
直し方 — インストール前の設定とNode.jsの入れ直し
インストール時にプラットフォーム不一致のエラーが出る場合は、プラットフォームの検出をLinuxに固定してからインストールします。
npm config set os linux
npm install -g @anthropic-ai/claude-code --forcesudoは付けません。root権限で入れると、通常ユーザーのPATH解決や更新時の権限とずれます。権限エラーが出るなら、ディレクトリの所有者などの別の原因を疑います。
exec: node: not foundがすでに出ている場合は、Linux側にNode.jsを入れ直します。ディストリビューションのパッケージマネージャーを使う方法です。
sudo apt update
sudo apt install -y nodejs npmUbuntu・Debian系以外では、aptの部分をAlpineならapk、Fedoraならdnfに読み替えます。標準リポジトリのNode.jsは古いことがあります。npmパッケージが求めるのはNode.js 22以降です。古い場合でも、公式のsetupページによればインストールはEBADENGINE警告つきで完了し、claudeは動きます。警告の扱いはClaude CodeのEBADENGINE警告は無視してよいかで見分けられます。
バージョンを選びたいときはnvm(Node Version Manager)を使います。インストールスクリプトを実行します。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash新しいターミナルを開いてから、Node.jsを導入します。
nvm install --lts
nvm use --ltsそのあとで、あらためてnpm install -g @anthropic-ai/claude-codeを実行します。npm版を更新するときはnpm install -g @anthropic-ai/claude-code@latestを使います。公式は、元のインストール時のsemver範囲に従うnpm update -gを避けるよう案内しています。
nvmを使っているのに切り替わらない場合
WSLとWindowsの両方にnvmを入れていると、WSL側でバージョンを切り替えたつもりでも、Windows側のnvmが優先されることがあります。公式が最も多い原因として挙げているのは、nvmのローダーがシェル起動時に読み込まれていないことです。
次のコードはコマンドではなく、~/.bashrcや~/.zshrcの末尾に書く中身です。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"nvmの公式インストールスクリプトは、通常この3行を自動で追記します。手動セットアップやドットファイルの自前管理では、抜けていることがあります。現在のセッションにだけ反映するなら次を実行します。
source ~/.nvm/nvm.shnvmを読み込んでもWindows側のパスが優先されるなら、Linux側のNode.jsのパスをPATHの先頭に足します。
export PATH="$HOME/.nvm/versions/node/$(node -v)/bin:$PATH"この設定は現在のシェルだけに効きます。次回以降も効かせるなら、同じ行を~/.bashrcか~/.zshrcの末尾に足します。
避けたい対処が2つあります。
appendWindowsPath = falseでWindowsのPATH取り込みを止める方法です。WSLからWindowsの実行ファイルを呼べなくなります。- Windows側のNode.jsのアンインストールです。Windowsの開発で使っているなら、そちらが動かなくなります。
似た症状 — claude native binary not installed
Node.jsは見つかるのに、claudeが次のメッセージで止まることもあります。
Error: claude native binary not installed.WSLでWindows版のnpmを使った場合は、先に見たプラットフォーム不一致のエラーになることがあり、対処はnpm config set os linuxの手順です。この節の表示は、Linux側のnpmでも依存の取得を飛ばせば出ます。
公式の説明では、npmはネイティブバイナリをプラットフォーム別のオプション依存として取得し、postinstallでclaudeの位置にコピーします。--ignore-scriptsでpostinstallを飛ばした場合や、--omit=optionalで依存を取得しなかった場合は、代わりのスクリプトが残ったままになります。
復旧は、--ignore-scriptsと--omit=optionalを外して入れ直すか、メッセージが示すとおりpostinstallを手で実行します。
node node_modules/@anthropic-ai/claude-code/install.cjsグローバルインストールの場合は、パスをグローバルのnode_modulesに読み替えます。この手順もnodeを使うので、which nodeが通ることが前提です。
postinstallをそもそも実行できない環境では、別の起動方法があります。次のコマンドは、ダウンロード済みのパッケージを見つけて起動します。
node node_modules/@anthropic-ai/claude-code/cli-wrapper.cjs代償として、起動のたびにNodeのプロセスが1つ余分に動きます。これがCould not find native binary packageと表示して止まるなら、プラットフォーム別のパッケージが一度もダウンロードされていません。
ネイティブバイナリはオプション依存としてだけ配布されるため、取得を飛ばした場合にJavaScriptで代替する経路はありません。install.cjsを再実行しても、ダウンロードされていないバイナリは置けません。.npmrcのoptional=falseも原因になります。依存を取得できる状態に戻してから入れ直します。
Windowsでは、bin/claude.exeが本物の実行ファイルではなく、同じシェルスクリプトの代わりです。PowerShellやCMDは「ファイルを実行できない」と報告します。未対応のプラットフォームや、企業のミラーにパッケージが無い場合も、この節と同じ状態になります。
npmをやめてネイティブインストーラーに移る
npm経由のclaudeは、postinstallの時点でNode.jsが見つかることを前提にします。ネイティブインストーラーに移ると、この種のエラーは出なくなります。npm版はpostinstallが走らないと代わりのスクリプトが残るのに対し、ネイティブ版はNode.jsを経由しません。
手元のv2.1.287では、claude install --helpが次のように表示します。
Usage: claude install [options] [target]
Install Claude Code native build. Use [target] to specify version (stable,
latest, or specific version)
Options:
--force Force installation even if already installed
-h, --help Display help for command[target]にはstable、latest、具体的なバージョンを渡せます。入れ直しの流れは次のとおりです。
npm uninstall -g @anthropic-ai/claude-code
curl -fsSL https://claude.ai/install.sh | bashWSL2のセットアップ全体はClaude Code WSL2セットアップ、導入方式ごとの違いはClaude Code Homebrew・npm・ネイティブ導入の比較にあります。
よくある質問
npm config set os linuxは他のパッケージにも影響しますか
影響します。コマンドはユーザーの~/.npmrcにos=linuxを書き込みます。設定が残っているかは、次の2つで確かめられます。
cat ~/.npmrc
npm config get osos=linuxの行があり、2つ目がlinuxを返すなら設定は有効です。インストールが済んだら、npm config delete osで戻せます。
自分のディストリビューションがWSL1かWSL2かを確かめるには
WindowsのPowerShellでwsl -l -vを実行します。
wsl -l -vVERSION列が1ならWSL1です。wsl --set-version <ディストリ名> 2でWSL2へ移せます。
まとめ
npm版を使い続けるなら、which nodeがLinux側のパスを返し、node -vでバージョンが出る状態にしてから入れ直します。済んだかどうかは、claude --versionでバージョンが表示されるかで判断できます。
npm版にこだわる理由が無ければ、ネイティブインストーラーへの移行が手早い選択肢です。その他のインストールエラーはClaude Codeインストールエラーの切り分けチェックリストにまとめています。