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からは使えません。Desktopアプリの内蔵ターミナルでfishが起動時に止まる場合は、DA1への無応答が原因です。
fishはClaude Codeの公式シェル要件に入っていない
Claude Codeのセットアップページは、シェルの要件をBash・Zsh・PowerShell・CMDの4つと案内しています。fishはこの一覧に含まれていません。
ただし、インストールコマンド自体はログインシェルの種類に依存しません。macOS/Linuxのインストールは次の1行で、ダウンロードしたスクリプトを明示的にbashへ渡して実行するためです。
curl -fsSL https://claude.ai/install.sh | bashfishをログインシェルにしていても導入自体は進みます。つまずくのは、インストール後にclaudeを呼び出す段階です。
bash側でPATHを直したのに、fishではclaudeが見つからないというすれ違いも起きます。~/.bashrcや~/.zshrcに足したexport文は、fishには届きません。fishの設定は~/.config/fish/config.fishなどfish側の場所に置くからです。
トラブルシューティングページには、fishやNushellの場合の案内が1行あります。内容は「シェル自身の設定構文で~/.local/binをPATHに追加し、ターミナルを再起動する」で、fishのコマンド名は載っていません。導入手順そのものを見直したい場合はClaude Code install完全ガイドが入口になります。Nushellでのpath addはClaude CodeでNushellは使えるかで扱っています。
fish_add_pathでPATHを通す
fishでの標準的な直し方はfish_add_pathです。指定したディレクトリをfish_user_pathsというuniversal変数に追加し、シェルを再起動しても値が消えません。config.fishに書き足さなくても、次回以降のセッションに引き継がれます。
fish_add_path ~/.local/binfishの公式ドキュメントによると、fish_add_pathは存在するディレクトリだけを追加し、存在しないものは無視します。パスはrealpathで正規化され、末尾のスラッシュは無視され、相対パスは絶対パスになります。すでに入っているディレクトリは重ねて追加されず、位置も変わりません。
位置を動かしたいときは--moveを付けます。複数のディレクトリを渡すと指定順に追加され、既定の動作は--prependです。末尾に足したい場合は--appendを使います。
--pathオプションを付けると、fish_user_pathsではなくPATH本体を直接書き換えます。PATHはuniversalにできないため値が永続せず、config.fishに呼び出し自体を書いておかないと次回起動時に消えます。通常のPATH追加には、--pathを付けない既定の形で足ります。
config.fishを手動で編集するときの落とし穴
fish_add_pathを使わずconfig.fishを直接編集する場合、bashやzshと同じexport PATH="$HOME/.local/bin:$PATH"は通りません。fishは変数の設定・削除をexportではなくsetに統一しています。公式の「bashユーザー向けfish」ページにも、export PAGER=lessと同じことはset -gx PAGER lessと書くという説明があります。
PATHに直接追記する書き方は次のとおりです。
set -gx PATH $HOME/.local/bin $PATH一方、set -Ux fish_user_paths $fish_user_paths ~/.local/binのようなuniversal変数への追記は、config.fishに置かないでください。fishの公式ドキュメントも「universal変数への追記をconfig.fishに書くと、新しいシェルを開くたびに変数が長くなる」と注意しています。config.fishはfishの起動のたびに読まれ、universal変数は全セッションで共有されるためです。
fish_add_pathは既存のエントリを検出して重複を避けるので、config.fishに書いても肥大化しません。公式ドキュメントも「config.fishに書いても安全」としています。手動で追記するよりfish_add_pathが向くのは、この違いのためです。
Bashツールはfishのconfigも省略入力(abbr)も読み込まない
ログインシェルがfishでも、Claude CodeのBashツールがfishのプロセスを起動することはありません。Bashツールが使うシェルを固定するCLAUDE_CODE_SHELLが受け付けるのは、bashかzshのバイナリパスだけだからです。環境変数リファレンスにも「fishなどの他のシェルはサポートされない」と明記されています。
fishのパスを渡しても無視され、自動検出に切り替わります。自動検出は$SHELLがbashかzshを指していればそれを使い、そうでなければPATH上や標準的なインストール場所のzsh、次点でbashを選びます。
セッション開始時には、選ばれたシェルに応じて~/.zshrc・~/.bashrc・~/.profileのいずれかを1回だけソースします。そこで得たエイリアスと関数、シェルオプションが、以降のBashコマンドすべてに適用されます。~/.config/fish/config.fishは、この読み込み対象の中にありません。zsh・bash側の起動ファイルの読み込みタイミングは、Claude Codeのシェル起動設定で詳しく扱っています。
fishのabbrは、対話入力でだけ展開されます。fishの公式ドキュメントにも「入力されたコマンドだけがabbreviationを使い、スクリプト内では展開されない」と書かれています。たとえばabbr --add gco git checkoutと登録すると、fishのプロンプトでgcoと打ってspaceかenterを押したときにgit checkoutへ置き換わります。
Claude Codeが実行するコマンドは、fishの対話プロンプトを経由しません。gcoはBashツールのシェルがそのまま解釈するため、定義が無ければcommand not foundになります。個人用のabbrをClaude Codeにも使わせたいなら、PATHの通った場所にシェルスクリプトとして置くか、~/.bashrc・~/.zshrcにも同じ内容を定義します。
PATHについては分けて考える必要があります。fishからclaude本体を起動した場合、fish_user_pathsを含むPATH環境変数は、通常は子プロセスに引き継がれます。Bashツールで~/.local/binのコマンドが見つからないときは、~/.zshrc等の起動ファイルでPATHが上書きされていることもあるため、そこを見直します。
また、Bashツールでexportした環境変数は、次のBashコマンドには残りません。ツールリファレンスによると、環境変数をコマンドをまたいで保つには、起動前にCLAUDE_ENV_FILEへシェルスクリプトを指定するか、SessionStartフックで書き出す方法があります。
claude doctorとclaude updateはconfig.fishも読む
fishのファイルを読むClaude Codeの機能が、一つだけあります。claude updateとclaude doctorは、古いclaudeのエイリアスを探すために設定ファイルを走査します。対象は~/.zshrc(ZDOTDIRを設定している場合は$ZDOTDIR/.zshrc)、~/.bashrc、~/.config/fish/config.fishで、macOSではさらに~/.bash_profile、~/.bash_login、~/.profileのうち最初に存在するものも含まれます。
config.fishに古いclaudeのエイリアスを残している場合は、この走査の対象になります。config.fishを整理するときの手がかりになります。
v2.1.214より前のバージョンでは、これらのパスのどれかがディレクトリだと、claude updateとclaude doctorがハングしました。該当しそうなら、次のコマンドで確かめられます。出力の先頭がdの行がディレクトリで、No such file or directoryは存在しないだけで原因ではありません。
ls -ld ~/.zshrc ~/.bashrc ~/.bash_profile ~/.bash_login ~/.profile ~/.config/fish/config.fishclaude doctorのヘルプは、v2.1.289で次のように出力されます。
claude doctor --helpUsage: claude doctor [options]
Check the health of your Claude Code installation. Reads settings files in the
current directory without a trust prompt. For a full checkup that can also fix
issues, run /doctor in a session.ヘルプに書かれているのは、カレントディレクトリの設定ファイルを信頼確認なしで読む点と、修復まで行う完全な診断はセッション内の/doctorで実行する点です。シェルの設定ファイルの走査はトラブルシューティングページの記述で、ヘルプには出てきません。
設定後の確認
PATHが通ったかを確かめる
- 1
新しいターミナルを開いてバージョンを見る
バージョンが表示されれば、PATHは通っています。
claude --version - 2
fish_user_pathsの中身を見る
fishの対話プロンプトから
claudeが見つからない場合は、fish_user_pathsに値が入っているかを確認します。fish -c 'echo $fish_user_paths' - 3
実行したユーザーを見直す
出力に
~/.local/binの実パスが無ければ、fish_add_pathの実行時点で~/.local/binがまだ作られていなかったか、別のユーザーでfish_add_pathを実行していたことも考えられます。universal変数はユーザーごとの~/.config/fish/fish_variablesに保存されるため、ほかのユーザーの設定は引き継がれません。
よくある質問
fish_user_pathsは複数のPC間でも共有されますか
共有されません。universal変数は同じコンピューター上で開いているfishセッションすべてに即座に伝わる仕組みで、別のPCには届きません。ディスクには~/.config/fish/fish_variablesに保存されます。公式ドキュメントはこのファイルを直接編集しないよう案内しています。
別のマシンでも同じPATHを使いたい場合は、そのマシンでfish_add_pathを実行します。config.fishにfish_add_pathを書いておけば、config.fishを同期している環境でも同じ設定になります。
まとめ
fishのPATHはfish_add_path ~/.local/binで足りますが、これはfishの中だけに効く設定です。Claude Codeに見せたいfunctionやabbr、PATHは、Bashツールが読むbash・zsh側の起動ファイルで決まります。より一般的なOS・シェル別のPATH確認手順はClaude Codeのcommand not foundをPATH設定で直すにあります。