Claude CodeでNushellは使えるか — Bashツールのシェルとpathの通し方
NushellをログインシェルにしてもClaude CodeのBashツールはbashかzshで動きます。Nushell側のPATHの通し方と、bash構文が出力される問題への現実的な対処をまとめます。
Nushellをログインシェルにしていても、Claude Codeは使えます。ただしBashツールが動くのはNushellではなく、bashかzshです。Nushellを直接指定する設定は今のところありません。実際に困るのは、次の2点に絞られます。
claudeがcommand not foundになる(Nushell側のPATH)- Claudeが出力するコマンドがbash構文で、Nushellの目には読みにくい
前者は数行の設定で直り、後者は運用で緩和するしかありません。それぞれの手順を順に見ていきます。
Bashツールはログインシェルに関係なくbashかzshで動く
Claude Codeのシステム要件が挙げる対応シェルは、Bash・Zsh・PowerShell・CMDの4つです。Nushellは入っていません。
Bashツールが使うシェルの決まり方は、環境変数CLAUDE_CODE_SHELLの説明にまとまっています。
| 条件 | Bashツールが使うシェル |
|---|---|
CLAUDE_CODE_SHELLが動作するbashかzshのパス | Bashツールが使うシェルそのシェル |
| 上記以外(未設定・fish・Nushellなどのパス) | Bashツールが使うシェル自動検出にフォールバック |
自動検出で$SHELLがbashかzsh | Bashツールが使うシェル$SHELLのシェル |
自動検出で$SHELLがそれ以外(Nushell含む) | Bashツールが使うシェルPATHと標準的なインストール先から、最初に見つかった動作するzsh、次にbash |
記述は「fishのような他のシェルはサポートされない」で、Nushellも同じ扱いです。$SHELLが/usr/bin/nuを指していても、そのまま無視されます。macOSやLinuxならzshかbashがたいてい入っているので、フォールバックによって特に設定しなくてもBashツールは動きます。
CLAUDE_CODE_SHELLで固定する場合は、settings.jsonのenvに書けます。
{
"env": {
"CLAUDE_CODE_SHELL": "/opt/homebrew/bin/bash"
}
}パスは環境変数の説明にある例と同じHomebrewのbashです。使えるのはbashかzshのバイナリだけで、nuのパスを書いても無視されます。
defaultShellにもNushellは指定できない
設定の名前から、defaultShellにNushellを書けそうに見えます。しかし値は"bash"か"powershell"の2択です。しかもこの設定が切り替えるのは、入力欄で!を付けて打つ対話コマンド(shell mode)だけです。値の意味と各環境での既定はdefaultShellでshell modeの既定シェルを変更するにまとめています。
もう1つ紛らわしいのがPowerShellツールです。第二のシェル言語を扱う仕組みとして存在しますが、対象はPowerShellだけです。CLAUDE_CODE_USE_POWERSHELL_TOOLを有効にしても、Nushellが使えるようにはなりません。
Nushell側でPATHを通す
claudeがcommand not foundになる原因は、たいていインストーラーが使う~/.local/binがNushellのPATHに入っていないことです。トラブルシューティングのページは、fishやNushellのユーザーには「シェル自身の設定構文で~/.local/binをPATHに追加し、ターミナルを再起動する」とだけ案内しています。Nushellでの書き方は、Nushell公式ドキュメントに載っています。
NushellはPATHを文字列ではなくリストとして扱います。起動時に継承した文字列を、自動でリストに変換するためです。そのため末尾への追加は次のように書けます。
$env.path ++= ["~/.local/bin"]先頭に足して優先順位を上げたいときは、標準ライブラリのpath addが使えます。既定の動作は先頭への追加です。
use std/util "path add"
path add "~/.local/bin"
path add ($nu.home-dir | path join ".cargo" "bin")config.nuはconfig nuコマンドで開けます。編集後は新しいNushellセッションを開くと反映されます。bash用のexport PATH="$HOME/.local/bin:$PATH"は、Nushellではそのまま通りません。
Nushellの環境変数の名前は大文字小文字を区別しません。Path、path、PATHはどれも同じ変数の別表記として扱われます。
env.nuとconfig.nuのどちらに書くか
かつては環境変数をenv.nuに書くのが定石でした。Nushellの現行ドキュメントでは、環境変数などの設定はconfig.nuか自動読み込みディレクトリに書く方式が推奨です。古い記事の手順をなぞってenv.nuに書いた設定が残っていても、動作はしますが、新規に書くならconfig.nuが無難です。
ログインシェルならlogin.nuも確認する
Nushellをログインシェルにしている場合は、login.nuの存在に注意が必要です。Nushellのドキュメントによると、ログインシェルとしての起動時にだけ実行したい設定はlogin.nuに書きます。POSIX向けの~/.profileはNushellでは処理できません。従来のログインシェルで.profileなどに書いていた環境変数が、Nushellではlogin.nuに移っていないと、PATHを含む値が引き継がれません。
継承されている環境変数を洗い出す1行も、Nushellのドキュメントにあります。従来のログインシェルの中でnuを起動して実行します。
$env | reject config | transpose key val | each {|r| echo $"$env.($r.key) = '($r.val)'" } | str join (char nl)出力から必要なものだけをlogin.nuに写します。PS1のようにPOSIXのプロンプト用の値は不要です。
起動方法でconfig.nuが読まれるかが変わる
Nushellの起動方法ごとに、読み込まれる設定ファイルは違います。nu -c "ls"はenv.nuもconfig.nuもlogin.nuも読みません。nu -l -c "ls"(ログインシェル指定)なら3つとも読みます。外部プログラムがNushellをコマンド文字列付きで呼ぶ場合、config.nuに書いたPATHや設定が効いていないことがあるのはこのためです。
Claude Codeに渡るPATHはどこで決まるか
ここは明記された範囲と、切り分けの手順を分けて考えます。
ツールのドキュメントで確認できるのは、次の点です。
- Bashツールは、セッション開始時に
~/.zshrc、~/.bashrc、~/.profileのいずれかを読み込み、得られたエイリアス・関数・シェルオプションを以降のBashコマンドすべてに適用する - 読み込まれるのはbash/zsh側の起動ファイルで、Nushellの
config.nuは対象に入っていない - Bashコマンド間で環境変数を持ち越したいときは、
CLAUDE_ENV_FILEにシェルスクリプトを指定するか、SessionStartフックで生成する
つまりconfig.nuに書いたPATHが、Bashツールの中でも使えるとは限りません。Nushellからclaudeを起動したなら、プロセスの環境変数として継承されたPATHが元になります。継承されなかった場合は、~/.zshrcや~/.bashrc側にPATH追加を書きます。
export PATH="$HOME/.local/bin:$PATH"zsh・bashの起動ファイルがいつ読まれるかはClaude Codeのシェル起動設定で扱っています。fishで同じ問題が起きたときの解説はClaude CodeでfishシェルのPATHを通す設定と注意点です。OS・シェルを問わない一般的な確認手順はClaude Codeのcommand not foundをPATH設定で直すにあります。
切り分けの手順
Nushellのプロンプトで確認する順序は次のとおりです。
which claudeでNushell側からclaudeが見つかるか確認する- 見つからなければ、上の
path addをconfig.nuに書いて新しいセッションで再確認する - 見つかるのにClaude内のコマンドで見つからないなら、Claudeに
echo $PATHをBashツールで実行させ、~/.local/binが含まれるか見る - 含まれなければ、
~/.zshrcまたは~/.bashrcにPATH追加を書く
| 症状 | 原因の候補 | 直す場所 |
|---|---|---|
Nushellでclaude: command not found | 原因の候補NushellのPATHに~/.local/binが無い | 直す場所config.nu(ログインシェルならlogin.nuも) |
claudeは起動するが、Claude内で特定のコマンドが見つからない | 原因の候補bash/zsh側のPATHに無い | 直す場所~/.zshrc・~/.bashrc |
| Nushellのaliasや自作コマンドが使えない | 原因の候補BashツールはNushellを読まない | 直す場所使えない前提で設計する |
ClaudeにNushell構文を書かせたいときの現実的な対処
もう1つの悩みは、Claudeが出力するコマンドがbash構文になることです。GitHubのissue #83537は、Nushellを既定シェルにできるようにする機能要望です。「Claudeが出力するbashコマンドが読みにくく、承認する自信を持てない」という動機が書かれています。このissueはopenで、ラベルはenhancementとarea:toolsです。
同じissueのコメントには、利用者が実際に試した回避策の組み合わせが載っています。仕様ではなく、利用者の報告である点は区別して読む必要があります。
- グローバルの
CLAUDE.mdに、ユーザーへ渡すコマンドはNushellで書く指示と、bash構文が紛れ込みやすい箇所のチェックリストを書く UserPromptSubmitフックで、毎ターン短いリマインダーを注入する- 入力欄のコマンドは
!nu -c '<command>'で実行する - Nushellの書き方と落とし穴をまとめたSkillを用意する
コメントの投稿者は、この構成で「ユーザーに渡すコマンド」はおおむね守られると書いています。一方でツール本体は変えられないとも述べています。Bashツールはbash構文を前提にしているためです。
CLAUDE.mdの指示は、例えば次のような形にできます。あくまで例示で、効果の程度はプロジェクトごとに確認が必要です。
## シェルの扱い
- Claudeが自分のBashツールで実行するコマンドは、bash構文で書く
- ユーザーに手で実行してもらうコマンドは、Nushell構文で書く
- 変数: `let x = 1`(`x=1`ではない)
- 環境変数: `$env.FOO = "bar"`(`export FOO=bar`ではない)
- コマンド置換: `(cmd)`(`$(cmd)`ではない)
- 連結: `;`(`&&`ではない)ポイントは、Claudeが自分で実行するコマンドと、人に渡すコマンドで構文を分けることです。Bashツールで実行されるコマンドにNushell構文を書かれると、bashが解釈できず失敗します。CLAUDE.mdにNushellの指示を書くときは、この2つを混同させない書き方にします。
!nu -c '<command>'は、!コマンドの実行環境がbashである前提での回避策です。シングルクォートで囲むと、bashが中の文字列をそのままnuに渡します。ただし報告では、この方式だとNushellのaliasや自作コマンドは引き継がれません。nu -cは前述のとおりconfig.nuを読まないためです。nu -l -cにすればログインシェルとして設定を読みます。
Nushellをログインシェルにするか迷う場合
Claude Code中心の作業なら、ログインシェルはそのままNushellにして、Claudeが動く範囲(Bashツール)はbash/zshと割り切る運用が現実的です。Claudeに読ませるスクリプトやhooksのコマンドも、bashで書いておけば余計な変換が要りません。
逆にNushellの構文をClaudeが一貫して出力してくれることを期待すると、期待外れになります。issueの要望が通り、Bashツールの説明でシェルがNushellと明示されるようになるまでは、指示で補う形が続きます。
まとめ
NushellをログインシェルにしていてもClaude Codeは使えますが、Bashツールが動くのはbashかzshで、defaultShellにもCLAUDE_CODE_SHELLにもNushellは指定できません。PATHはconfig.nuにpath add "~/.local/bin"を書き、ログインシェルならlogin.nuも見直します。Claude内のコマンドで見つからないときは、bash/zsh側の起動ファイルにもPATH追加を書きます。bash構文が読みにくい問題は、CLAUDE.mdで人向けコマンドの構文を指定して緩和し、根本的な対応はissue #83537の動きを待つ形になります。