Claude Media
Denying BashでPowerShellも止まる警告の意味と対処 — Claude Code

Denying BashでPowerShellも止まる警告の意味と対処 — Claude Code

Windows + Git BashでBashをdenyすると、PowerShellツールも一緒に止まります。警告の意味と、環境変数で戻す方法とスコープ付きルールに替える方法を示します。

Windowsで起動した直後にDenying Bash also turns off the PowerShell tool, so Claude has neither.と表示されたら、そのセッションのClaudeはシェルツールを1つも持っていません。Bashをdenyした結果、PowerShellツールまで一緒に外れたことを知らせる警告です。

原因は、Bashの拒否ルールをツール全体にかけたことです。戻し方は2つあります。CLAUDE_CODE_USE_POWERSHELL_TOOL=1を設定するか、Bash全体の拒否を特定コマンドだけを止めるスコープ付きルールに替えます。

この警告が出る条件と意味

警告は、次の2つがそろったときに起動時に表示されます。

  • Windowsで、Git Bashがインストールされている
  • Bashツール全体を取り除くルールがある。具体的には--disallowedTools Bash、または設定ファイルのdenyに書いた単独のBashやBash(*)

メッセージの全文は次のとおりです。

Denying Bash also turns off the PowerShell tool, so Claude has neither. To use PowerShell, set CLAUDE_CODE_USE_POWERSHELL_TOOL=1.

訳すと「Bashを拒否するとPowerShellツールも止まるので、Claudeはどちらも使えない。PowerShellを使うならCLAUDE_CODE_USE_POWERSHELL_TOOL=1を設定する」となります。エラーではなく警告で、Claude Code自体は起動します。ただしそのセッションでは、コマンド実行を伴う作業はできません。

単独のBashとBash(*)は同じ意味で、どちらもdenyに置くとツールがClaudeのコンテキストから消えます。CLIフラグの--disallowedToolsも同様で、裸のツール名はそのツールを取り除きます。

claude --disallowedTools Bash

なぜBashのdenyでPowerShellまで止まるのか

BashとPowerShellは別々のツールで、権限ルールも別です。BashのルールはPowerShellツールを制限しません。PowerShell側にはPowerShell(...)形式の専用ルールがあります。

そのため、Bashだけを拒否してPowerShellを残すと、Bashで拒否したはずの操作をClaudeがPowerShell経由で実行できてしまいます。Claude Codeはこの抜け道を塞ぐため、Windows + Git Bashの環境ではBashのdenyが見つかるとPowerShellツールも自動で無効にします。

この挙動は、全体を取り除くルールに限りません。Bash(git push *)のようなスコープ付きの拒否ルールでも、設定ファイルまたは--disallowedToolsに書かれていればPowerShellは止まります。違いは警告と、Bashの有無です。

くらべる

Bash denyの種類で変わる状態

警告あり

Bash全体を拒否

Bashツールが消え、PowerShellも止まります。起動時に警告が出て、シェルツールが無い状態になります。

警告なし

スコープ付きで拒否

Bashは使えます。PowerShellは止まりますが、警告は出ません。

スコープ付きルールのときに警告が出ないのは、Bashが残っていてClaudeは作業を続けられるからです。「PowerShellが急に使えなくなった」と気づきにくい点は、この挙動の落とし穴になります。

対処法1: CLAUDE_CODE_USE_POWERSHELL_TOOLで戻す

Bashのdenyをそのまま残し、PowerShellは使いたい場合の方法です。環境変数CLAUDE_CODE_USE_POWERSHELL_TOOLを1にします。PowerShellツールがBashのdenyと並んで有効なままになります。

設定ファイルのenvブロックに書けば、環境変数を毎回設定する必要がありません。

{
  "env": {
    "CLAUDE_CODE_USE_POWERSHELL_TOOL": "1"
  },
  "permissions": {
    "deny": ["Bash"]
  }
}

この構成ではBashは使えず、ClaudeはPowerShellでコマンドを実行します。シェルの環境変数として渡すなら、PowerShellでは次のように書きます。

$env:CLAUDE_CODE_USE_POWERSHELL_TOOL = "1"
claude

注意が1点あります。この方法では、Bashで禁じた操作がPowerShellで通る状態に戻ります。止めたい操作があるなら、PowerShell側にも拒否ルールを置きます。

{
  "env": {
    "CLAUDE_CODE_USE_POWERSHELL_TOOL": "1"
  },
  "permissions": {
    "deny": [
      "Bash(git push *)",
      "PowerShell(git push *)"
    ]
  }
}

PowerShellのルールもBashと同じ形で、*は任意の位置に置けます。コマンドはASTで解析され、|や;で区切った複合コマンドの各部分が個別に判定されます。ルールは大文字小文字を区別せず、Get-ChildItemのルールはgciやlsのエイリアスにも効きます。個別の挙動はRemove-Itemがブロックされる条件にあります。

フックで検査している場合も、Bashだけでは足りません。シェルコマンドを見るフックのマッチャーはBash|PowerShellと書きます。

対処法2: Bash全体の拒否をスコープ付きルールに替える

そもそも止めたいのが特定のコマンドだけなら、単独のBashは広すぎます。Bash(git push *)のようなスコープ付きの拒否ルールに替えると、Claudeは引き続きBashを使えます。

{
  "permissions": {
    "deny": ["Bash(git push *)"]
  }
}

ただし、この状態ではPowerShellツールは止まったままです。PowerShellも使いたいときは、次のどちらかを加えます。

  • CLAUDE_CODE_USE_POWERSHELL_TOOL=1を設定する
  • 設定ファイルに、PowerShell(git push *)のようなスコープ付きのPowerShell権限ルールを追加する

CLAUDE_CODE_USE_POWERSHELL_TOOLなしでPowerShellを残す手段が、スコープ付きのPowerShellルールを置くことです。BashとPowerShellの両方で同じ操作を止めたいなら、ルールを2行並べる形が目的に合います。

どちらを選ぶか

迷ったら、Claudeにシェルを使わせるかどうかで分けます。

目的選ぶ方法
シェルは一切使わせたくない選ぶ方法何もしない。警告は意図どおりの状態を知らせているだけ
PowerShellだけ使わせたい選ぶ方法対処法1(環境変数 + Bashのdeny)
特定コマンドだけ止めたい選ぶ方法対処法2(スコープ付きルール + 対応するPowerShellルール)

--disallowedTools BashをCIの起動オプションに入れている場合も、考え方は同じです。Claudeにシェルを触らせない運用なら警告は無視できます。シェルが必要な作業を頼んでいるのに、Claudeが「実行できません」と答えるなら、この警告が原因の可能性があります。

警告が見えないときの確認方法

バックグラウンドセッションや、--output-format json・stream-jsonで起動したときは、警告が標準エラーに出ません。機械が読む出力を汚さないよう、デバッグログに書かれます。

claude --debug

ログは~/.claude/debug/<session-id>.txtに残ります。非対話の実行でClaudeがシェルを使えない場合は、このファイルを調べると同じ警告が見つかります。

どの設定がBashを拒否しているかを突き止める

自分で書いた覚えのないdenyが原因のこともあります。Claude Codeの中で/permissionsを開くと、すべての権限ルールと、各ルールがどのsettings.jsonから来ているかが一覧で表示されます。単独のBashが出どころ付きで見つかれば、そのファイルを直せば済みます。

拒否ルールの出どころは、ユーザー設定、プロジェクト設定、組織が配布するmanaged settings、起動時の--disallowedToolsのどれかです。ここで押さえておきたい性質が2つあります。

  • denyはどのスコープにあっても効き、別のスコープのallowでは打ち消せません。ユーザー設定でBashをallowしていても、プロジェクト設定のdenyが勝ちます
  • managed settingsのdenyは、ほかのどの階層も、コマンドライン引数でも上書きできません

つまり、/permissionsでmanaged settingsに由来するBashのdenyが見つかった場合、手元の設定を変えても拒否は外れません。この場合に使えるのは、対処法1の環境変数でPowerShellだけを戻す道か、組織の管理者への相談になります。

対処法1の次につまずく点: PowerShellツールの制限

CLAUDE_CODE_USE_POWERSHELL_TOOL=1でPowerShellを戻したあと、Bashのときと同じ感覚で使うと引っかかる箇所があります。ツールにはプレビュー期間中の既知の制限が2つあります。

  • PowerShellプロファイルは読み込まれません。$PROFILEで定義した関数やエイリアスは、Claudeが実行するコマンドの中では使えません
  • Windowsではサンドボックスに対応していません。サンドボックスでコマンドの影響範囲を絞る運用をしている場合、PowerShell経由の実行はその枠の外になります

後者は、Bashを拒否した理由が安全面にあったときに効いてきます。PowerShellに切り替えると、拒否の代わりに権限ルールだけが歯止めになるので、止めたい操作はPowerShell(...)のルールで明示的に置いておきます。

古いバージョンでは警告が出ない

この警告はv2.1.287で追加されました。それ以前のバージョンでも、BashをdenyするとPowerShellツールは同じように止まっていましたが、警告はありませんでした。

古いバージョンのまま「PowerShellが使えない」状況に遭遇した場合、原因は設定のdenyルールかもしれません。Windows + Git Bashの環境でBashの拒否ルールが入っていないか、設定ファイルと起動オプションを確認します。v2.1.287の他の変更点はv2.1.287のリリースノートにまとめています。

関連する設定の覚え書き

PowerShellツールの有効条件は、環境によって異なります。

  • Git BashなしのWindows: ツールは自動で有効になります。
  • Git BashありのWindows: claude.aiとConsoleのアカウントでは既定で有効です。Amazon Bedrock、Google CloudのAgent Platform、Microsoft FoundryのセッションではCLAUDE_CODE_USE_POWERSHELL_TOOL=1で有効にします。0にすると無効になります。
  • Linux、macOS、WSL: 既定では無効で、有効にするにはPowerShell 7以降のpwshがPATHに必要です。

本記事の警告が出るのは、Windows + Git Bashの場合です。Git BashなしのWindowsでBashをdenyしたときの挙動は、エラー一覧のページにも、ツールリファレンスのPowerShellの節にも説明がありません。実際にどうなるかは、claude --debugのログで確かめられます。

CLAUDE_CODE_USE_POWERSHELL_TOOL=1でツールが有効になると、ClaudeはPowerShellを主なシェルとして扱います。Git Bashがあれば、Bashツールも並んで使えます。ただしBashをdenyしている場合、使えるのはPowerShellだけです。

Git Bashの環境でコマンドが途中で切れる問題は8KBの切り詰めで扱っています。起動時にどのシェルが使われるかを決める設定は、シェルの起動設定にあります。

まとめ

警告が指しているのは、Bashのdenyが招いた「シェルツールが1つも無い」状態です。意図どおりなら放置して構いません。PowerShellを使いたいならCLAUDE_CODE_USE_POWERSHELL_TOOL=1を足し、止めたいコマンドがあるならPowerShell側にも同じルールを置きます。特定の操作だけを防ぎたいなら、単独のBashをやめてBash(git push *)のような形に替えます。

起動オプションとして--allowedTools・--disallowedToolsをどう使い分けるかは、allowedTools/disallowedToolsの記事で整理しています。

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