.zshrcに『AIへ貼るためのコピペ機能』を搭載した
ターミナルでエラーや診断結果が出たとき、ChatGPTやClaudeに相談するために、毎回マウスで範囲選択してコピーするのは面倒である。
そこで、コマンドの先頭に ai を付けるだけで、
実行したコマンド
実行結果
Markdownのコードブロック
を自動的にクリップボードへコピーする仕組みを、macOSの .zshrc に追加した。
たとえば、次のように実行する。
ai networkQuality
コマンドは通常どおり実行され、結果がターミナルに表示される。同時に、クリップボードには次の形式で保存される。
Machine : pk_mini
Folder : ~/dev/AI_corp/knn-funda
pk_mini % networkQuality
==== SUMMARY ====
Uplink capacity: 17.597 Mbps
Downlink capacity: 140.434 Mbps
あとはChatGPTやClaudeの入力欄で ⌘V を押すだけである。
なぜ、この機能を作ったのか
生成AIは、こちらのターミナル画面を見ることができない。
そのため、トラブルシューティングでは、ユーザーがコマンドと実行結果を正確にコピーして渡す必要がある。
ところが、実際には次のような問題が起きる。
コマンド部分をコピーし忘れる
実行結果の途中までしかコピーできない
過去の不要なログまで大量に貼ってしまう
コードブロックを手動で付けるのが面倒
ローカルのユーザー名やPATHをそのまま公開してしまう
そこで、『実行と同時にAI向けの文章を作る』ことにした。
.zshrcとは
.zshrc は、zshを起動するときに読み込まれる設定ファイルである。
macOSでは、ホームディレクトリに保存されている。
~/.zshrc
~ はホームディレクトリを意味する。
たとえば実際のPATHが、
/Users/paulkanda/.zshrc
であっても、一般的には次のように表記する。
~/.zshrc
編集には、macOS標準のテキストエディットを利用できる。
open -e ~/.zshrc
ターミナル上のエディタである nano でも編集できるが、慣れていない場合はテキストエディットの方が安全である。
完成した.zshrcのコード
既存のPATH設定などは残し、次のコードを .zshrc の末尾に追加する。
=========================
AI clipboard functions
=========================
_ai_core() {
if [ $# -eq 0 ]; then
echo "使い方: ai "
return 1
fi
local cmd="$*"
local tmp
tmp=$(mktemp)
# コマンドを実行し、画面表示と一時保存を同時に行う
"$@" 2>&1 | tee "$tmp"
local exit_status=${pipestatus[1]}
# ホームディレクトリを「~」に置き換える
local cwd="${PWD/#$HOME/~}"
# Markdown形式でクリップボードへコピー
{
echo '```terminal'
echo "Machine : pk_mini"
echo "Folder : $cwd"
echo
echo "pk_mini % $cmd"
echo
cat "$tmp"
echo '```'
} | pbcopy
rm -f "$tmp"
echo "📋 Copied"
return "$exit_status"
}
公開用の基本コマンド
ai() {
_ai_core "$@"
}
個人用の隠しショートカット
a() {
_ai_core "$@"
}
詳細情報付きのフォーマット
af() {
if [ $# -eq 0 ]; then
echo "使い方: af "
return 1
fi
local cmd="$*"
local tmp
tmp=$(mktemp)
"$@" 2>&1 | tee "$tmp"
local exit_status=${pipestatus[1]}
local cwd="${PWD/#$HOME/~}"
{
echo '```terminal'
echo "Machine : pk_mini"
echo "Folder : $cwd"
echo "Time : $(date '+%Y-%m-%d %H:%M %Z')"
echo "OS : macOS"
echo "Shell : zsh"
echo
echo "pk_mini % $cmd"
echo
cat "$tmp"
echo '```'
} | pbcopy
rm -f "$tmp"
echo "📋 Copied (formatted)"
return "$exit_status"
}
直近のコマンド履歴をコピー
as() {
local count="${1:-3}"
local cwd="${PWD/#$HOME/~}"
{
echo '```terminal'
echo "Machine : pk_mini"
echo "Folder : $cwd"
echo
echo "History (last $count)"
echo
fc -ln "-$count"
echo '```'
} | pbcopy
echo "📋 Copied history ($count)"
}
左手だけで入力しやすいショートカット
as4() { as 4 }
as5() { as 5 }
as6() { as 6 }
as7() { as 7 }
as8() { as 8 }
as9() { as 9 }
直近200件から単純なノイズを除去してコピー
ash() {
local cwd="${PWD/#$HOME/~}"
{
echo '```terminal'
echo "Machine : pk_mini"
echo "Folder : $cwd"
echo
echo "History (cleaned, last 200)"
echo
fc -ln 1 \
| tail -n 200 \
| grep -vE '^[[:space:]]*$' \
| grep -vE '^(ls|pwd|clear)$' \
| awk 'NR == 1 || $0 != previous { print } { previous = $0 }'
echo '```'
} | pbcopy
echo "📋 Copied history (cleaned)"
}
設定を反映する
.zshrc を保存しただけでは、現在開いているターミナルには反映されない。
次のコマンドを実行する。
source ~/.zshrc
設定が複雑に重複している場合は、zsh自体を再起動する方法もある。
exec zsh
基本的な使い方
単発のコマンドと結果をコピー
ai pwd
短縮版の a も同じ動作をする。
a pwd
a は一文字コマンドに抵抗がある利用者もいるため、公開マニュアルでは ai を正式コマンドとし、a は隠しショートカットとしている。
詳細情報を付けてコピー
af networkQuality
af は『Ask Format』の意味である。
クリップボードには、日時、OS、シェル情報も追加される。
Machine : pk_mini
Folder : ~/dev/AI_corp/knn-funda
Time : 2026-07-31 04:01 JST
OS : macOS
Shell : zsh
pk_mini % networkQuality
...
Qiitaやnoteの記事へ、そのまま貼り付けやすい形式である。
直近3件の履歴をコピー
as
as は『Ask Shell』または『Ask Session』という意味で付けた。
デフォルトでは、直近3件をコピーする。
History (last 3)
ai pwd
a pwd
af pwd
履歴件数を指定
as4
as5
as6
as7
as8
as9
左手側のキーだけで入力を完結できるようにしている。
整理した履歴をコピー
ash
ash は、直近200件から空行や単独の ls、pwd、clear などを除き、連続した重複行も削除してコピーする。
ただし、zshの履歴には、過去に貼り付けた長文や秘密情報が含まれる可能性がある。ash の内容を外部へ公開する前には、必ず目視確認が必要である。
PATHを~に置き換える理由
実際のPATHをそのままコピーすると、次のようなユーザー名が外部へ出る。
/Users/paulkanda/dev/AI_corp/knn-funda
これだけでMacへ侵入されるわけではないが、公開記事では不要な個人情報を出さない方がよい。
そこで、ホームディレクトリ部分を ~ に置換する。
~/dev/AI_corp/knn-funda
AIにはプロジェクトの位置関係が伝わり、外部にはmacOSのログイン名が見えない。
"$"と"$@"の役割
この関数では、表示用と実行用を分けている。
local cmd="$"
"$*" は、渡された引数をひとつの文字列としてまとめる。AI向けに『どのコマンドを実行したか』を表示する用途である。
一方、実際の実行には次を使う。
"$@"
"$@" は、各引数を分離した状態でコマンドへ渡す。そのため、スペースを含む引数なども比較的安全に扱える。
安易に eval を使わないことも重要である。eval は文字列を再解釈して実行するため、意図しないコマンド実行や引用符の問題を起こしやすい。
teeとpbcopyが中心
この仕組みの中心は、macOS標準の2つのコマンドである。
tee
"$@" 2>&1 | tee "$tmp"
tee は、実行結果をターミナルへ表示しながら、同じ内容を一時ファイルにも保存する。
2>&1 により、通常出力だけでなくエラー出力もまとめて取得している。
pbcopy
... | pbcopy
pbcopy は、標準入力で受け取ったテキストをmacOSのクリップボードへ保存する。
このため、実行後は ⌘V だけでAIへ貼り付けられる。
注意点
この仕組みは、コマンドを通常どおり実行する。
したがって、次のような破壊的なコマンドへ ai を付けても、安全になるわけではない。
ai rm -rf important-folder
また、次の情報が出力に含まれていないか確認する必要がある。
APIキー
パスワード
アクセストークン
Cookie
SSH秘密鍵
個人名を含むPATH
IPアドレスやMACアドレス
顧客情報
.env の内容
『AIへコピーする』ことと、『インターネットへ公開する』ことは同じではない。Qiitaやnoteへ掲載するときは、さらに慎重な確認が必要である。
まとめ
今回作ったのは、大規模なアプリではない。
.zshrc に数十行の関数を追加しただけである。
しかし、
ai
と入力するだけで、
ターミナル実行
↓
結果取得
↓
Markdown整形
↓
クリップボード保存
↓
AIへ貼り付け
までが一度に完了する。
生成AI時代には、AIそのものの性能だけでなく、『人間側がどれだけ正確なコンテキストを渡せるか』が重要になる。
この小さなCLIは、ターミナルとAIの間にあるコピー&ペーストの摩擦を、かなり減らしてくれる。