Claude Codeのシェル起動設定 — zsh/bash/PowerShellの違い
zsh・bashは起動ファイルを自動で読み込み、PowerShellツールはプロファイルを読み込みません。確認プロンプトが出る理由と環境変数を引き継ぐ設定方法をまとめます。
Claude Codeはセッション開始時にシェルの起動ファイルを読み込み、そこで定義したエイリアスや関数をBashコマンドに反映します。ただしこの挙動はシェルによって差があり、PowerShellツールは現状プロファイルを読み込みません。起動ファイルへの書き込みには確認プロンプトが挟まる仕様もあり、知らずに依頼すると「なぜ止まるのか」で戸惑いがちです。この記事ではzsh・bash・PowerShellそれぞれの初期設定の扱いと、環境変数を引き継ぐ実用的な方法をまとめます。
Claude Codeがシェル起動ファイルを読み込む仕組み
セッションを開始すると、Claude Codeは使用しているシェルに応じて~/.zshrc・~/.bashrc・~/.profileのいずれかをソースします。読み込んだ結果として得られるエイリアス・関数・シェルオプションを、以降のBashツール呼び出しすべてに適用する仕組みです。
| シェル | 読み込む起動ファイル | 読み込みタイミング |
|---|---|---|
| zsh | 読み込む起動ファイル~/.zshrc | 読み込みタイミングセッション開始時に1回 |
| bash | 読み込む起動ファイル~/.bashrc | 読み込みタイミングセッション開始時に1回 |
| それ以外(POSIX準拠シェル) | 読み込む起動ファイル~/.profile | 読み込みタイミングセッション開始時に1回 |
毎回のBashコマンドで起動ファイルを読み直しているわけではありません。セッションの最初に1回だけソースし、その結果をキャッシュして使い回します。起動ファイルを編集して.zshrcにエイリアスを足しても、同じセッション内では反映されません。反映させるには新しいセッションを始める必要があります。
もう1つ間違えやすいのが環境変数の扱いです。Bashツールは各コマンドを別プロセスとして実行するため、あるコマンドでexport FOO=barを実行しても、次のコマンドには引き継がれません。エイリアスや関数はセッション開始時の1回読み込みで全コマンドに効きますが、実行時にexportした値はコマンドをまたいで残らない。この非対称性が「さっき設定したのに効かない」というつまずきの主因です。
PowerShellツールではプロファイルが読み込まれない
Windows環境でGit Bashが無い場合、Claude Codeは自動でPowerShellツールを使います。Git Bashがあるときは段階的ロールアウト中で、macOS・Linux・WSLではCLAUDE_CODE_USE_POWERSHELL_TOOL=1を設定すると使えます(pwsh 7以降がPATH上に必要です)。
export CLAUDE_CODE_USE_POWERSHELL_TOOL=1settings.jsonのenvキーで恒久化することもできます。
{
"env": {
"CLAUDE_CODE_USE_POWERSHELL_TOOL": "1"
}
}このPowerShellツールはプレビュー中で、PowerShellプロファイル($PROFILE)を読み込みません。zsh・bashが起動ファイルを自動でソースするのとは対照的です。$PROFILEで定義した関数やエイリアスは、Claude CodeのPowerShellコマンドからは見えないと考えて設計します。
実行ポリシーの扱いにも注意点があります。Claude CodeはPowerShellを-ExecutionPolicy Bypass付きで起動しますが、これはプロセス単位の指定にとどまり、グループポリシーのMachinePolicy/UserPolicyは上書きしません。マシンの実効ポリシーに従わせたい場合はCLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY=1を設定します。対話コマンド(!から始まる入力)を既定でPowerShellに通すには、settings.jsonのdefaultShellを"powershell"にします。
セッションをまたいで環境変数を持ち越す方法
仮想環境の切り替えは、シェル起動ファイルの自動読み込みだけでは解決しません。venvやcondaのアクティベートは典型的にexportベースで環境変数を書き換えるため、Bashコマンドをまたいで消えてしまいます。公式ドキュメントが推す方法は2つです。
- Claude Codeを起動する前にアクティベートする。最も単純で、セッション全体に効きます。
CLAUDE_ENV_FILEにexport文を書き出す。このファイルはBashコマンドの実行直前に毎回読み込まれるため、値がコマンドをまたいで持ち越されます。
CLAUDE_ENV_FILEはSessionStart・Setup・CwdChanged・FileChangedの各フックからも動的に書き込めます。次はセッション開始時に環境変数を追記するフックの例です。
#!/bin/bash
if [ -n "$CLAUDE_ENV_FILE" ]; then
echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"
echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"
fi
exit 0追記(>>)を使っているのは、他のフックが書いた変数を上書きしないためです。ディレクトリを移動するたびに環境を切り替えたい場合はCwdChangedフックが使えます。cdのたびに発火するため、direnvのようなディレクトリ単位の環境管理と相性が良い仕組みです。
起動ファイルへの書き込みで確認プロンプトが出る理由
Claude Codeはv2.1.160で、.zshenv・.zlogin・.bash_loginなどのシェル起動ファイルと~/.config/git/への書き込み前に確認プロンプトを挟む変更を入れました。理由は明確で、起動ファイルは新しいシェルを開くたびに自動実行されるため、意図しない内容が混じると気づかないままコマンドが実行され続けるリスクがあるためです。
このプロンプトは個別の設定ではなく、Claude Codeが常に保護する「保護ファイル」の一部です。zsh・bash系の起動ファイルはまとめて対象に入っています。
| 保護対象 | 具体例 |
|---|---|
| bash起動ファイル | 具体例.bashrc .bash_profile .bash_login .bash_aliases .bash_logout |
| zsh起動ファイル | 具体例.zshrc .zprofile .zshenv .zlogin .zlogout |
| その他のシェル系 | 具体例.profile .envrc |
| Git設定 | 具体例.gitconfig .gitmodules |
これらへの書き込みは、権限モードによって扱いが変わります。
| 権限モード | 保護ファイルへの書き込み |
|---|---|
default / acceptEdits | 保護ファイルへの書き込み確認プロンプトが出る |
plan | 保護ファイルへの書き込みbypass permissionsが使えるセッションのみ許可、それ以外は基本プロンプト |
auto(auto mode) | 保護ファイルへの書き込み分類器の判定に回る |
dontAsk | 保護ファイルへの書き込み拒否される |
bypassPermissions | 保護ファイルへの書き込み無条件に許可 |
acceptEditsモードでも保護対象は自動承認されません。settings.jsonのpermissions.allowにルールを書いても、この保護チェックはallowルールの評価より先に走るため無効です。つまりEdit(.bashrc)のようなallowルールを足しても、default/acceptEditsではプロンプトが出続けます。
現状のプレビューでは、この保護リストにPowerShellプロファイル($PROFILE)は含まれていません。もっとも、Claude CodeのPowerShellツール自体がプロファイルを読み込まない仕様なので、書き込んでも次回セッションの起動には影響しません。
Windows側のシェル設定はこれまでどう変わったか
WindowsのBashツールとPowerShellツールは、公式changelogを追うと段階的に整備されてきた経緯があります。過去の記憶のまま設定を触ると、現行版とずれることがあります。
| バージョン | 変更内容 |
|---|---|
| v2.1.84 | 変更内容PowerShellツールをオプトインのプレビューとして追加 |
| v2.1.111 | 変更内容Windows版CLAUDE_ENV_FILEとSessionStartフックの環境ファイルが有効化(以前は無効なままだった) |
| v2.1.120 | 変更内容WindowsでGit Bashが不要に。無い環境ではPowerShellツールを自動使用 |
| v2.1.143 | 変更内容PowerShellツールに-ExecutionPolicy Bypassを既定適用、Bedrock/Vertex/Foundry利用者ではWindowsで既定有効化 |
| v2.1.160 | 変更内容シェル起動ファイルと~/.config/git/への書き込み前に確認プロンプトを追加 |
特にv2.1.120以降は、Git Bashを入れていないWindows環境でもClaude Codeがそのまま動くようになった点が大きな変化です。Git Bashを前提にした古い手順を参照していると、今は不要な手間を踏むことになります。
シーン別の設定早見表
| シーン | zsh/bash | PowerShellツール(プレビュー) |
|---|---|---|
| よく使うエイリアス・関数を使いたい | zsh/bash起動ファイルに書けばセッション開始時に自動反映 | PowerShellツール(プレビュー)プロファイルは読まれないため反映されない |
| venv/condaを引き継ぎたい | zsh/bash起動前にアクティベート、またはCLAUDE_ENV_FILE | PowerShellツール(プレビュー)同様に起動前のアクティベートが確実 |
| CI/自動化で固定環境を使いたい | zsh/bashCLAUDE_ENV_FILEをフックから明示的に書く | PowerShellツール(プレビュー)同上。プロファイル依存の設定は持ち込めない |
| 起動ファイルの編集を依頼したい | zsh/bash確認プロンプトが出る(意図しない実行防止) | PowerShellツール(プレビュー)プロファイルは保護リスト対象外 |
よくあるつまずき
- 起動ファイルの編集依頼が毎回止まる:
.zshrcや.bashrcへの書き込みは保護ファイルの確認プロンプトが必ず出ます。allowルールを足しても解除されないため、都度承認するか、変更内容を先に見せてもらってから承認する運用にします。 - PowerShellのエイリアスが効かない: プロファイル未読み込みはプレビュー中の既知の制約です。頻用する関数はCLAUDE.mdやプロジェクトのスクリプトに置き換えるほうが確実に動きます。
exportした環境変数が次のコマンドで消える: Bashツールは各コマンドを別プロセスで実行するため、単発のexportは引き継がれません。持ち越したい値はCLAUDE_ENV_FILEに書きます。- WindowsでBashツールとPowerShellツールが両方動く状態になり挙動が読めない: Git Bash導入環境ではPowerShellツールが段階的ロールアウト中のため、どちらが使われるか意識が必要です。
CLAUDE_CODE_USE_POWERSHELL_TOOLを明示的に0か1に固定すると挙動が安定します。 CLAUDE_ENV_FILEを編集したらBashコマンドが何も出力しなくなった: ファイルの末尾を#で始まるコメント行にすると、コマンドの標準出力が空になる不具合がv2.1.107以前にありました。v2.1.108で修正済みですが、古いバージョンを使っている場合はコメント行の位置を疑う価値があります。
よくある質問
Claude CodeはBashコマンドのたびに.zshrcを読み込みますか
いいえ。セッション開始時に1回だけソースし、その結果得られたエイリアス・関数・シェルオプションをセッション中の全Bashコマンドに適用します。起動ファイルを編集しても同じセッション内には反映されません。
PowerShellプロファイルを読み込ませる設定はありますか
現状のプレビューにはありません。PowerShellツールはプロファイルを読み込まない仕様として案内されています。プロファイル依存の関数・エイリアスは、CLAUDE.mdへの記載やプロジェクト内のスクリプト化で代替する必要があります。
.bashrcへの書き込みで確認プロンプトが出るのは危険な依頼だからですか
必ずしもそうではありません。起動ファイルは新しいシェルを開くたびに自動実行される特性があるため、Claude Codeは内容にかかわらず一律で確認を挟みます。正当な変更でもプロンプトは出ます。
--dangerously-skip-permissionsを使えばこの確認は出ませんか
bypassPermissionsモードでは保護ファイルへの書き込みも無条件で許可されます。ただしこのモードは他の安全確認もまとめて外れるため、起動ファイルの保護だけを個別に無効化する手段ではありません。
まとめ
zsh・bashはセッション開始時に起動ファイルを1回読み込み、以降のBashコマンドにエイリアスと関数を反映します。PowerShellツールはこの読み込みをまだ行わないため、プロファイル依存の設定は持ち込めません。環境変数をコマンドをまたいで持ち越したいときは、起動前のアクティベートかCLAUDE_ENV_FILEを使います。起動ファイルへの書き込みは保護ファイルの確認プロンプトが必ず挟まる仕様で、allowルールでは解除できません。権限モードごとの扱いをClaude Codeセキュリティ・権限ガイドで押さえておくと、プロンプトが出た理由を判断しやすくなります。環境変数とフックの組み合わせ方はClaude Code設定ガイド、フックの書き方はClaude Code Hooksの設定方法で詳しく扱っています。ショートカット全般はClaude Codeショートカット一覧から確認できます。