Claude Media
Claude CodeでNushellは使えるか — Bashツールのシェルとpathの通し方

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かzshBashツールが使うシェル$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のプロンプトで確認する順序は次のとおりです。

  1. which claudeでNushell側からclaudeが見つかるか確認する
  2. 見つからなければ、上のpath addをconfig.nuに書いて新しいセッションで再確認する
  3. 見つかるのにClaude内のコマンドで見つからないなら、Claudeにecho $PATHをBashツールで実行させ、~/.local/binが含まれるか見る
  4. 含まれなければ、~/.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のコメントには、利用者が実際に試した回避策の組み合わせが載っています。仕様ではなく、利用者の報告である点は区別して読む必要があります。

  1. グローバルのCLAUDE.mdに、ユーザーへ渡すコマンドはNushellで書く指示と、bash構文が紛れ込みやすい箇所のチェックリストを書く
  2. UserPromptSubmitフックで、毎ターン短いリマインダーを注入する
  3. 入力欄のコマンドは!nu -c '<command>'で実行する
  4. 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の動きを待つ形になります。

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