! (Prefix)(エクスクラメーション(プレフィクス))

キーバインド
! (Prefix)
エクスクラメーション(プレフィクス)
Claude Code の入力欄の頭に半角の ! を1文字打つと、画面が直接実行モード(公式名: Shell mode)に切り替わるスイッチ。以降に書いたコマンドは Claude を経由せず、起動元の bash / zsh で直接実行される

Claude を介さず一発でコマンドを叩いて、その出力も会話に残しておきたい人

テストやビルドの結果を Claude に「これ見て直して」と渡したい時に、コピペを挟まず会話の流れへ流し込みたい場面で叩く。!git status や !npm test のように、入力欄の先頭に ! を1文字付けてからコマンドを書いて Enter で実行する

Claude Code の入力欄の頭に半角の ! を1文字だけ打つと、画面が直接実行モードに切り替わって、その後ろに書いたコマンドが Claude を介さず即実行されます。コマンドの結果はそのまま会話に残るので、後から「いまの npm test の出力を見て、失敗箇所を直して」と Claude に頼めます。

裏で動いてるのは Claude Code を起動してる時の bash / zsh そのもの。! は単なる「これ以降はClaudeに渡さず、直接OSに流せ」という合図です。

噛み砕くと

会議室にホワイトボードと電話があるのを想像してください。普段の Claude Code とのやり取りはホワイトボードに書いた内容を Claude が読んで返事をくれる感じ。ここに ! は「電話で経理部に直接問い合わせる」スイッチが付くイメージです。

電話の会話内容はちゃんとホワイトボードにも書き写されるので、後から Claude が「経理部はこう答えたんですね」と読めます。! は会話の流れを切らずに、横にある電話を一回叩くだけのショートカット。

大事な前提:! は入力欄の一番先頭だけ効く

公式の Quick commands 表に ! at start」と書かれている通り、! は入力欄の頭にあるときだけ直接実行モードのスイッチになります。

文の途中で ! を打っても、ただの感嘆符として Claude へのメッセージに混ざるだけ。たとえば これすごい! git status を見せて みたいに途中で打っても、モード切り替えは起きません。

「世界の魚を紹介するサイトを作りたい」プロジェクトで実際に叩く

ステップ1: いまの状態を !git status で見る

プロジェクトフォルダで Claude Code を起動した直後。まず作業履歴がどうなってるかを確認します。入力欄に !git status と打ち込んで Enter。

! git status

するとモードが切り替わって、出力がそのまま画面に流れます。

On branch main
Changes not staged for commit:
  modified:   src/pages/index.html
  modified:   src/data/fish.json
Untracked files:
  src/pages/tuna.html

この出力は会話に追加されます。あとで Claude に「tuna.html がまだ未追跡だけど、これ fish.json と連動させたい」と頼めば、Claude はこの出力を読んで動いてくれる。

ステップ2: フォルダ構造を !ls -la で見せる

続けて !ls -la で隠しファイル込みの全部を出します。

! ls -la

.env.gitignore も含めて中身が一覧で出る。これも会話に残るので、Claude が「.env には API キーが入ってるはずだから .gitignore 入りを確認した方がいい」みたいに気付けます。

ステップ3: テストを !npm test で走らせる

本命。サイトに付けたテストが通るか走らせます。

! npm test

長いログが流れた末、FAIL src/pages/__tests__/tuna.test.js で落ちたとしましょう。エラー全文が会話に残ります。

ステップ4: ここで Claude に渡す

このモードを抜けるには、入力欄が空っぽの状態で EscBackspaceCtrl+U のどれかを押します。何か文字が入ってると効かないので注意。

普通の入力モードに戻ったら、Claude に話しかけます。

いまの npm test の出力見て。tuna.test.js が落ちてる原因を直して

Claude はさっき会話に追加された FAIL 行とエラースタックを読んでくれます。これ正直やばい。「ログをコピペして貼る」ステップが完全に飛ばせる。

ステップ5: 直してもらった後、!npm test で再確認

Claude が tuna.test.js を修正してきたら、もう一度 !npm test を叩きます。今度は PASS が出ればOK。出てなければまた会話に渡して直してもらう。この往復が、コピペ無しで回るのが核です。

ステップ6: 履歴から再呼び出し

同じプロジェクトで2回目以降、!np まで打って Tab を押すと、過去の !npm test が補完されます。これ history-based autocomplete と呼ばれてる仕組みで、同プロジェクトの中で過去に叩いた ! コマンドだけが対象。

つまり ! は何をしてくれるのか

  • やってくれる: Claude を経由せずコマンドを即実行して、その出力を会話に残す。後から Claude にそのまま「これ見て」と頼める
  • やってくれる: コマンドの途中経過をリアルタイム表示。長いビルドや npm install の進捗ログが、Claude の返答を待たずに流れてくる(公式 verbatim「Shows real-time progress and output」)
  • やってくれる: 過去に叩いた ! コマンドを Tab 補完。同プロジェクトに限る
  • やってくれる: 長時間動くコマンドは Ctrl+B で背景化。普通の Bash ツール呼び出しと同じ背景化が効く
  • やってくれない: 危険コマンドの確認。Claude の承認を完全に飛ばすので、rm -rf ~/projects/fish-site も確認なしで走る
  • 意味が薄い場面: 出力が長大なログ系(巨大なビルドログ・テスト全件出力)。会話の中身を食い潰すので、Ctrl+B で背景化して必要箇所だけ Claude に渡す形が向く

使いどころ3シナリオ

シナリオ1: テストが落ちた瞬間に Claude へ流す

「世界の魚を紹介するサイト」みたいな個人プロジェクトで、テストを書いた直後。!npm test を叩いて、落ちたら即「いまの出力見て直して」と Claude に投げる。テスト結果をコピペで貼る手間が消えるので、テスト駆動の往復が速くなります。

料理ブログのジェネレーターでも同じ。!python build.py で落ちた Python のスタックトレースが、そのまま会話に積まれる。

シナリオ2: 状態確認の3点セット

Claude に「このプロジェクトを直して」と頼む前に、自分で状況を Claude にも見せたい場面。!git status !git log --oneline -5 !ls -la を順に叩く。3つとも会話に残るので、Claude が「いま main ブランチで、tuna.html が未追跡で、最新の変更履歴はこれ」と全部把握した状態で作業を始められる。

OSS を git clone してきた直後にもこれ。!ls -la!cat README.md を流してから Claude に「このプロジェクト読み解いて」と頼むと、初手の精度が上がります。

シナリオ3: 小さな疑問の即時確認

fish.json の中身がいまどうなってるか1行だけ確認したい時。Claude に「fish.json 見せて」と頼むと Claude が Read ツールを呼んで読み込むけど、自分で見るだけなら !head fish.json の方が速い。出力は会話に残るので、後で Claude に「さっき見た fish.json 構造を踏まえて、tuna.html 作って」と頼める。

個人的には、ファイル中身を確認する一行コマンドは ! で叩く方が早いことが多いです。

初心者が踏みやすい落とし穴

  • ! は入力欄の一番先頭だけ有効。文中の ! はただの感嘆符で、モード切り替えは起きない。git status を見せて! と書いても何も起きない
  • bash の !!(前回コマンド再実行)は効かない。公式が「history expansion (!) is disabled by default」と明言。普段 bash で !! を使ってる人は癖で打つと驚きます
  • 確認ダイアログ無しで実行される。Claude の承認を完全に飛ばすので、!rm -rf ~/projects/fish-site みたいな破壊系もそのまま走る。Claude 経由なら「本当に削除していい?」と聞かれるところが、聞かれない。責任は完全にユーザー側
  • 長大ログを ! で投げると会話の中身を食う。巨大ビルドログを全部会話に積むと、Claude が後で長文を読み直す負担が上がる。長そうなコマンドは Ctrl+B で背景化して、必要な部分だけ抜き出して Claude に渡す方が安全
  • 抜けるキー3種類は空プロンプト時のみEscape Backspace Ctrl+U のどれも、入力欄に何か文字が残っていると効かない。先に Ctrl+U で行全消ししてからもう一度 Ctrl+U、みたいな2段操作で抜けるのが確実
  • クリップボードからの貼り付けでも勝手にモードに入る。空の入力欄に ! で始まる文字列を貼り付けると、自動で直接実行モード扱い。Slack や Notion からコマンド例をコピペしてくる時、頭の ! を意図せず実行してしまう事故が起きやすい
  • Tab 補完は「同じプロジェクト」スコープに限る。別フォルダで Claude Code を起動した時は、過去の ! コマンド履歴は引き継がれない。プロジェクトをまたいで使い回したいコマンドは、.zsh_history 側に頼るかメモしておく

書き方

! コマンド本体

やってみるとこうなる

入力

! npm test

出力例

FAIL src/pages/__tests__/tuna.test.js
  ● tuna page › renders title
    expect(received).toBe(expected)
    Expected: "Tuna"
    Received: undefined
(このエラー全文が会話に追加されるので、次のターンで Claude が読める)

このページに出てきた言葉

直接実行モード
公式名は <code>Shell mode</code>。Claude Code の入力欄を一時的に「OSへの直通モード」に切り替えた状態。打ったコマンドが Claude を素通りして、起動元の bash / zsh に直接渡って実行される
bash / zsh
コマンドを受け付けて実行するプログラムの種類。Mac は標準で zsh、Linux は bash が多い
会話に残る
いまのセッションで Claude が覚えている内容に追加されるという意味。質問・回答・<code>!</code> で叩いたコマンドの結果が全部ここに積まれる
history-based autocomplete
過去に同プロジェクトで叩いた <code>!</code> コマンドを覚えていて、頭の何文字か入れて Tab を押すと続きを補完してくれる仕組み
history expansion
bash で <code>!!</code> と打つと前回コマンドが呼び出される機能。Claude Code の <code>!</code> プレフィクスでは無効化されている
背景化 (Ctrl+B)
長く動くコマンドをセッションの裏側で走らせて、出力はファイルに書き出させる仕組み。<code>!</code> で叩いたコマンドにも同じように効く

関連項目

公式ドキュメント

https://code.claude.com/docs/en/interactive-mode

-

← 戻る