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 に渡す
このモードを抜けるには、入力欄が空っぽの状態で Esc か Backspace か Ctrl+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種類は空プロンプト時のみ。
EscapeBackspaceCtrl+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> で叩いたコマンドにも同じように効く