Claude Media
Claude CodeでfishシェルのPATHを通す設定と注意点

Claude CodeでfishシェルのPATHを通す設定と注意点

fishはClaude Codeの公式シェル要件に無く、PATH設定の書き方もbash/zshと異なります。fish_add_pathでの直し方と、Bashツールがfishの関数を読み込まない理由をまとめます。

fishシェルでclaudeを実行するとcommand not foundになることがあります。原因は、インストーラーが追加する~/.local/binがfishのPATHに入らないことです。fishは~/.bashrcや~/.zshrcを読まないため、bash/zsh向けの案内どおりに設定しても反映されません。加えてClaude CodeのBashツールはfishではなくbashかzshを起動するため、fishのfunctionやabbrはClaude Codeからは使えません。fish固有のPATH設定コマンドと、この非対応が及ぶ範囲を具体的に確認します。

fishはClaude Codeの公式シェル要件に入っていない

Claude Codeのシステム要件は、対応シェルをBash・Zsh・PowerShell・CMDの4つと案内しています。fishはこの一覧に含まれていません。

ただし、インストールコマンド自体はログインシェルの種類に依存しません。macOS/Linuxのインストールは次の1行で、ダウンロードしたスクリプトを明示的にbashへ渡して実行するためです。

curl -fsSL https://claude.ai/install.sh | bash

つまり要件の「Bash・Zsh・PowerShell・CMD」が対応するのは、インストール後にclaude本体を起動する側の話です。fishをログインシェルにしていても導入自体は問題なく進み、つまずくのは次の「PATHが通らない」段階になります。

すでにbash側でPATHを直したはずなのに、fishではclaudeが見つからないというすれ違いもよく起きます。fishは独自の設定ファイル(~/.config/fish/config.fish)しか読み込まず、~/.bashrcや~/.zshrcに足したexport文はfishの対話シェルには反映されません。シェルごとに設定ファイルが完全に分かれている点が、他のシェルからの乗り換え時につまずきやすい理由です。

公式のトラブルシューティングページも、fishやNushellのユーザーが一定数いる前提で案内を用意しています。ただし内容は「シェル自身の設定構文を使って~/.local/binをPATHに追記し、ターミナルを再起動する」という一般論に留まり、fish固有のコマンド名までは書かれていません。導入手順そのものを最初から見直したい場合はClaude Code install完全ガイドにまとめています。

fish_add_pathでPATHを通す

fishでの標準的な直し方はfish_add_pathです。指定したディレクトリをfish_user_pathsというuniversal変数に追加し、シェルを再起動しても値が消えません。config.fishに書き足さなくても、次回以降のセッションに自動で引き継がれます。

fish_add_path ~/.local/bin

存在しないディレクトリを渡した場合は無視されるだけなので、パスを間違えても実害はありません。すでに追加済みのディレクトリを重ねて渡しても、二重には追加されません。複数のディレクトリを渡すと指定順にPATHの先頭側へ入ります(既定の動作は--prepend)。末尾に足したい場合は--appendを付けます。

--pathオプションを付けると、fish_user_pathsではなくPATH本体を直接書き換えます。この場合は変数の性質がuniversalではなくグローバルになるため値が永続せず、config.fishに呼び出し自体を書いておかないと次回起動時に消えます。用途が違う2つの動作なので、通常のPATH追加には--pathを付けない既定の形で十分です。

config.fishを手動で編集するときの落とし穴

fish_add_pathを使わずconfig.fishを直接編集したい場合、bashやzshと同じexport PATH="$HOME/.local/bin:$PATH"という書き方はfishでは通りません。fishは変数の設定・削除をexportのような別ビルトインではなくsetに統一しており、公式ドキュメントでも「export PAGER=lessと同じことはset -gx PAGER lessと書く」と説明しています。

PATHに直接追記したい場合は次のように書きます。

set -gx PATH $HOME/.local/bin $PATH

fish_user_pathsをuniversal変数のまま使い続けたい場合はset -Ux fish_user_paths $fish_user_paths ~/.local/binのように書きますが、この--append相当の書き方をconfig.fishにそのまま置くのは避けてください。universal変数は同じマシン上のfishセッションすべてで共有され、変更は即座に全セッションへ伝わります。ところがconfig.fishはfishを起動するたびに読まれるため、末尾への追記をそこに置くと、新しいシェルを開くたびに同じディレクトリが再度追加され続けて肥大化します。fish_add_pathは既存のエントリを検出して重複を避けるため、この事故を起こしません。手動編集よりfish_add_pathのほうが安全なのはこのためです。

Bashツールはfishのconfigも省略入力(abbr)も読み込まない

Claude Code自身がコマンドを実行するBashツールは、ログインシェルにfishを使っていても、fishのプロセスを直接起動しません。

Bashツールが使うシェルを固定するCLAUDE_CODE_SHELLは、bashかzshのバイナリパスしか受け付けません。fishのパスを渡しても無視され、自動検出にフォールバックします。自動検出は$SHELLがbashかzshを指していればそれを使い、そうでなければPATH上や標準的なインストール場所から見つかったzsh、次点でbashを選びます。ログインシェルがfishの環境では、この自動検出が働くため、Bashツールは実質的に常にbashかzshの中で動きます。

セッション開始時には、選ばれたシェルに応じて~/.zshrc・~/.bashrc・~/.profileのいずれかを1回だけソースし、そこで得たエイリアスと関数を以降のBashツール呼び出しすべてに適用します。fishの設定ファイル(~/.config/fish/config.fish)はこの対象に入っていません。zsh・bash側の起動ファイルの読み込みタイミングやexportが引き継がれない挙動は、Claude Codeのシェル起動設定で詳しく扱っています。

ここで区別しておきたいのは、Bashツールがfishのプロセスを直接起動しないことと、fishが設定したPATHまで無効になることは別だという点です。fish_add_pathでfish_user_pathsに追加した値はfishがPATH環境変数として子プロセスに継承させるため、fishからclaude本体を起動した場合はそのPATHがBashツールにも渡ります。反映されないのは、~/.zshrc等の起動ファイルがPATHを継承せずに上書きしているケースです。

一方で継承されないのは、fishのfunctionで定義した関数やabbrで登録した省略入力(abbreviation)です。これらは対話的にfishを使っているときは動いても、Claude CodeがBashツールで同じコマンドを実行するときには存在しないものとして扱われます。fish公式のabbreviation解説自体、「abbreviationが展開されるのはタイプ入力されたコマンドだけで、スクリプト内では展開されない」と明記しています。

たとえばabbr --add gco git checkoutと登録した場合、fishの対話プロンプトでgcoと打ってspaceかenterを押すとgit checkoutへその場で置き換わりますが、この置き換えはあくまで対話プロンプトの機能です。Claude CodeのBashツールが実行するコマンド文字列はfishの対話プロンプトを経由しないため、gcoという文字列がそのままbash/zshに渡り、該当するコマンドが無いというエラーになります。個人的なabbrをClaude Codeにも使わせたい場合、fishの設定に頼らず、シェルスクリプトとしてPATHの通った場所に置くか、~/.bashrc・~/.zshrc側にも同じ内容を重複して定義しておく必要があります。

シーン別の使い分け

シーン使うコマンド反映される範囲
対話的なfishからclaudeを使いたい使うコマンドfish_add_path ~/.local/binをfish内で実行反映される範囲次回以降のfishセッション
bashのスクリプトからfish側のPATHも直したい使うコマンドfish -c 'fish_add_path ~/.local/bin'反映される範囲同上(fishのuniversal変数を更新)
Bashツールで見えないPATHがある(~/.zshrc等が上書きしている場合)使うコマンド~/.bashrcまたは~/.zshrcにexport PATH="$HOME/.local/bin:$PATH"を追記反映される範囲Bashツールが選ぶシェルの起動ファイル
fishのfunction/abbreviationをBashツールでも使いたい使うコマンドfish側のコマンドを移植し、シェルスクリプト化するか~/.bashrcにも重複定義反映される範囲Bashツール実行時

fishのuniversal変数と、bash/zshの起動ファイルは別々に管理されている点が要点です。片方だけ直しても、もう片方には反映されません。

設定後の確認

設定を変えたら、新しいターミナルを開き直してバージョンが表示されるかで確認します。

claude --version

fish_add_pathを実行した後もfishの対話プロンプトからclaudeが見つからない場合は、fish_user_pathsに実際に値が入っているかを確認します。

fish -c 'echo $fish_user_paths'

出力に~/.local/binの実パスが含まれていなければ、fish_add_pathを実行したユーザーが違う可能性があります。sudo等で別ユーザーとして実行すると、universal変数の保存先(ホームディレクトリ)が変わり反映されないことがあります。

universal変数の変更は同じマシン上で開いているfishセッションすべてに即座に伝わるため、すでに開いている別タブでも設定し直す必要はありません。新しいタブを開いても、開いたままの古いタブでも同様にPATHが反映されます。

よくある質問

fish_user_pathsは複数のPC間でも共有されますか

共有されません。universal変数は同じコンピューター上のfishセッション同士でのみ共有される仕組みで、変更は~/.config/fish/fish_variablesというローカルファイルに保存されます。別のマシンでも同じPATHを使いたい場合は、そのマシンでもfish_add_pathを実行するか、dotfilesの同期先にこのファイルを含める必要があります。

まとめ

fishはClaude Codeのシステム要件に挙げられた4シェルには含まれず、command not foundの直し方もbash/zshと同じ書き方は使えません。fish_add_path ~/.local/binをfish内で実行すれば、universal変数経由で次回以降のセッションにPATHが残ります。ただしBashツールはCLAUDE_CODE_SHELLの仕様どおり常にbashかzshを起動するため、fishのconfig.fishもfunctionもabbreviationも読み込まれません。fishの関数やabbreviationをClaude Codeにも使わせたい場合は、シェルスクリプト化するか、~/.bashrc・~/.zshrcに個別に用意します。より一般的なOS・シェル別のPATH確認手順はClaude Codeのcommand not foundをPATH設定で直すにまとめています。

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