Claude Media
node: not foundエラーの原因 — Claude Code WSLのnpmインストール

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を実行した結果、と読み分けられます。

くらべる

似たエラーの見分け方

PATHの問題

exec: node: not found

PATHにnodeが無い状態です。この記事の対象で、Windows側Node.jsの取り違えやLinux側の未導入が原因になります。

WSL1の問題

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 node
手順

which の出力から対処を選ぶ

  1. 1

    両方が /usr/ や /home/ で始まる

    Linux側のNode.jsを参照できています。node -vを実行し、バージョンが出ることを確認します。nvmを使っているなら、ローダーが読み込まれているかを疑います。

  2. 2

    /mnt/c/ で始まる

    Windows側のバイナリを掴んでいます。Linux側にNode.jsを入れ、PATHの先頭に置きます。

  3. 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 --force

sudoは付けません。root権限で入れると、通常ユーザーのPATH解決や更新時の権限とずれます。権限エラーが出るなら、ディレクトリの所有者などの別の原因を疑います。

exec: node: not foundがすでに出ている場合は、Linux側にNode.jsを入れ直します。ディストリビューションのパッケージマネージャーを使う方法です。

sudo apt update
sudo apt install -y nodejs npm

Ubuntu・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.sh

nvmを読み込んでも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 | bash

WSL2のセットアップ全体はClaude Code WSL2セットアップ、導入方式ごとの違いはClaude Code Homebrew・npm・ネイティブ導入の比較にあります。

よくある質問

npm config set os linuxは他のパッケージにも影響しますか

影響します。コマンドはユーザーの~/.npmrcにos=linuxを書き込みます。設定が残っているかは、次の2つで確かめられます。

cat ~/.npmrc
npm config get os

os=linuxの行があり、2つ目がlinuxを返すなら設定は有効です。インストールが済んだら、npm config delete osで戻せます。

自分のディストリビューションがWSL1かWSL2かを確かめるには

WindowsのPowerShellでwsl -l -vを実行します。

wsl -l -v

VERSION列が1ならWSL1です。wsl --set-version <ディストリ名> 2でWSL2へ移せます。

まとめ

npm版を使い続けるなら、which nodeがLinux側のパスを返し、node -vでバージョンが出る状態にしてから入れ直します。済んだかどうかは、claude --versionでバージョンが表示されるかで判断できます。

npm版にこだわる理由が無ければ、ネイティブインストーラーへの移行が手早い選択肢です。その他のインストールエラーはClaude Codeインストールエラーの切り分けチェックリストにまとめています。

この記事を共有:XはてブLinkedIn