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の記事で整理しています。