はじめに
環境
- PC: MacBook Air(16 GM)
- 開発環境: vscode
元ネタ
note AI駆動開発 Claude Code & Tmux入門 16ワーカーを同時に動かして開発効率爆上げする方法 bashもzshにも対応
背景
Gemini CLIを使って並列実行処理でタスクをさせてみたい!!と思いました。
この記事では、その下準備としてtmux
を使ってターミナルをグリッド状に分割し、さらに自作のシェルスクリプト(zshエイリアス)を使って、分割した全ペインまたは特定のペイン群を自在に操作する環境を構築する方法を解説します。
この記事で実現できること
ざっくり
-
N x N の tmux グリッドレイアウト自動生成:
create_tmux_layout.sh
で、好きなサイズのペイン群を一瞬で作成します。 -
コマンド一括実行:
ta
,tb
,tw
といった2文字のショートカットで、全ペイン、特定グループ(Boss/Worker)のペインに同じコマンドを送信します。 - セッション管理の効率化: セッションの起動、状態確認、終了を簡単に行うコマンドを整備します。
デモ
下記記事を設定し、以下コマンドを打つと、ターミナルが分割します。
以下画像は、N=2と設定した場合。
./create_tmux_layout.sh <N>
pane-R1C1で以下のコマンドを打つと、下記画像のように全部のターミナルにhelloと表示されます。
ta "echo hello"
元ネタと異なる点
- ターミナルの分割を動的にしました
- 44⇨NN
- ただし、ショートカットキーの改善はまだ
- ショートカットきーの設定に、現在のtmuxセッションを終了するコマンドを追加しました
ファイル構成
.
├── .zshrc
└── Parallel-Processing-With-CLI/ # お好みの適当なフォルダ名
├── create_tmux_layout.sh
└── README.md
Step 1: tmux グリッドレイアウトの自動生成
まずは、並列処理の土台となる tmux
のペインを自動で生成するスクリプトです。
tmuxのインストール
brew install tmux
create_tmux_layout.sh
指定した数 N
に基づき、tmux
ウィンドウ内に N x N のペイン(画面)を生成し、各ペインに識別用の名前とプロンプトを設定します。
セットアップ
スクリプトに実行権限を付与します。この操作は初回のみ必要です。
chmod +x create_tmux_layout.sh
実行方法
create_tmux_layout.shファイルを作成します。
# create_tmux_layout.sh
#!/bin/bash
# tmuxでNxNのペイン構成を作成するスクリプト
# 使用方法: ./create_tmux_grid_arg.sh <N>
# 例: ./create_tmux_grid_arg.sh 3 で3x3のペインを作成
# --- 引数のチェック ---
if [ -z "$1" ]; then
echo "使用方法: $0 <N>"
echo "例: $0 4 で4x4のペインを作成します。"
exit 1
fi
N=$1 # コマンドライン引数の最初の値をNに設定
SESSION_NAME="multagent_testtm" # セッション名にNを含める。ショートカットキーで設定するSESSIONと一緒
# --- 既存のセッションがある場合は削除 ---
tmux has-session -t "$SESSION_NAME" 2>/dev/null && tmux kill-session -t "$SESSION_NAME"
# --- 新しいセッションを作成 ---
tmux new-session -d -s "$SESSION_NAME"
# 最初のペインの名前を設定
tmux rename-window -t "$SESSION_NAME":0 "multiagent_window"
# --- 縦方向にN-1回分割してN行にする ---
# 最初のペイン (0.0) を基準に縦に分割していく
for ((i=1; i<N; i++)); do
tmux split-window -v -t "$SESSION_NAME":0.0
done
# --- 各行を横方向にN-1回分割してN列にする ---
# 各行の最初のペインを選択し、そこから横に分割していく
for ((row=0; row<N; row++)); do
# 各行の最初のペインのインデックスを計算
initial_pane_index=$((row * N))
# その行の最初のペインに移動
tmux select-pane -t "$SESSION_NAME":0."$initial_pane_index"
# 現在選択されているペインを横にN-1回分割
for ((col=1; col<N; col++)); do
tmux split-window -h
done
done
# --- 各ペインにタイトルを設定し、プロンプトをカスタマイズ ---
# ペインの総数
TOTAL_PANES=$((N * N))
for ((i=0; i<TOTAL_PANES; i++)); do
row=$((i / N)) # 現在のペインの行番号 (0からN-1)
col=$((i % N)) # 現在のペインの列番号 (0からN-1)
# ペイン名を生成 (例: pane-R0C0, pane-R0C1, ...)
pane_name="pane-R${row}C${col}"
# ペインにタイトルを設定
tmux send-keys -t "$SESSION_NAME":0."$i" "printf '\033]2;${pane_name}\033\\'" C-m
# プロンプトにペイン名を表示
tmux send-keys -t "$SESSION_NAME":0."$i" "export PS1='(${pane_name}) \$ '" C-m
# 画面をクリア
tmux send-keys -t "$SESSION_NAME":0."$i" "clear" C-m
done
# --- レイアウトを調整(均等に配置) ---
tmux select-layout -t "$SESSION_NAME":0 tiled
# --- セッションにアタッチ ---
tmux attach-session -t "$SESSION_NAME"
echo "tmuxセッション '$SESSION_NAME' が作成されました。"
echo "${N}x${N}のペイン構成で、合計${TOTAL_PANES}個のペインがあります。"
echo "各ペインは 'pane-R[行番号]C[列番号]' の形式で命名されています。"
実行コマンド
./create_tmux_layout.sh <N>
<N>
には、生成したいグリッドのサイズ(例: 4
なら 4x4=16ペイン)を指定します。
Step 2: .zshrc にコマンドエイリアスを追加
次に、.zshrc
に便利なエイリアスを追加して、tmux
ペインの操作を効率化します。これにより、コマンドラインから直接、複数のペインをコントロールできるようになります。
.zshrc 設定の概要
以下は、.zshrc
に追加する設定の要約です。
-
基本設定: 操作対象となる
tmux
のセッション名を定義します。 -
メインコマンド (2文字):
ta
(全ペイン),tb
(ボスペイン),tw
(ワーカーペイン) でコマンドやEnterキーを送信します。 -
便利コマンド:
tc
(クリア),ts
(状態確認),end
(セッション終了),tk
(現在セッション終了) など。 -
ヘルプ機能:
th
で、定義したコマンドの一覧と使用例を表示します。
.zshrc に下記コードを追加する
#################### 以下がCLIの並列処理をするために追加した内容 ####################
# 現在のtmuxセッションを終了するためのエイリアス
alias kill_this_session='tmux kill-session -t $(tmux display-message -p "#S")'
# ~/.zshrc に追加するシンプルな2文字 tmux コマンド
# ===========================================
# 基本設定
# ===========================================
# セッション名(必要に応じて変更)
SESSION="multagent_testtm" # ここは後の.ashrcの設定と同じにすること
# ===========================================
# メインコマンド(2文字)
# ===========================================
# ta "command" - 全ペイン(Total/All)
alias ta='function _ta(){
if [[ -z "$1" ]]; then
# 引数なし = ENTERキーのみ送信
for i in {0..15}; do
tmux send-keys -t "$SESSION:0.$i" C-m
done
echo "✅ 全ペインにENTERを送信しました"
else
# 引数あり = コマンド + ENTER送信
for i in {0..15}; do
tmux send-keys -t "$SESSION:0.$i" "$1" C-m
done
echo "✅ 全ペインで実行: $1"
fi
}; _ta'
# tb "command" - ボスペイン(Boss)
alias tb='function _tb(){
if [[ -z "$1" ]]; then
# 引数なし = ENTERキーのみ送信
for i in 0 4 8 12; do
tmux send-keys -t "$SESSION:0.$i" C-m
done
echo "✅ ボスペインにENTERを送信しました"
else
# 引数あり = コマンド + ENTER送信
for i in 0 4 8 12; do
tmux send-keys -t "$SESSION:0.$i" "$1" C-m
done
echo "✅ ボスペインで実行: $1"
fi
}; _tb'
# tw "command" - ワーカーペイン(Worker)
alias tw='function _tw(){
if [[ -z "$1" ]]; then
# 引数なし = ENTERキーのみ送信
for i in {1..3} {5..7} {9..11} {13..15}; do
tmux send-keys -t "$SESSION:0.$i" C-m
done
echo "✅ ワーカーペインにENTERを送信しました"
else
# 引数あり = コマンド + ENTER送信
for i in {1..3} {5..7} {9..11} {13..15}; do
tmux send-keys -t "$SESSION:0.$i" "$1" C-m
done
echo "✅ ワーカーペインで実行: $1"
fi
}; _tw'
# ===========================================
# 便利な追加コマンド
# ===========================================
# tc - 全ペインでクリア(Clear)
alias tc='ta "clear"'
# ts - セッション状況確認(Status)
alias ts='function _ts(){
echo "=== TMux セッション状況 ==="
echo "セッション名: $SESSION"
if tmux has-session -t "$SESSION" 2>/dev/null; then
echo "✅ セッション '$SESSION' は実行中"
pane_count=$(tmux list-panes -t "$SESSION" 2>/dev/null | wc -l)
echo "📊 ペイン数: $pane_count"
else
echo "❌ セッション '$SESSION' が見つかりません"
fi
}; _ts'
# end - セッション終了
alias end='function _end(){
echo "🛑 セッション '$SESSION' を終了中..."
tmux has-session -t "$SESSION" 2>/dev/null && tmux kill-session -t "$SESSION" || echo "❌ セッションが見つかりません"
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
echo "✅ セッション '$SESSION' を終了しました"
fi
}; _end'
# <<<<<<<<<<<<<<< ここから追加 >>>>>>>>>>>>>>>
# tk - 現在のtmuxセッションを終了(Kill This Session)
alias tk='kill_this_session'
# <<<<<<<<<<<<<<< ここまで追加 >>>>>>>>>>>>>>>
# ===========================================
# 使用例とヘルプ
# ===========================================
# ヘルプ表示
alias th='function _th(){
echo "=== シンプル tmux コマンド ==="
echo ""
echo "基本コマンド:"
echo " ta \"コマンド\" - 全ペイン(16個全部)で実行"
echo " tb \"コマンド\" - ボスペイン(4個)で実行"
echo " tw \"コマンド\" - ワーカーペイン(12個)で実行"
echo ""
echo "ENTERキーのみ送信:"
echo " ta - 全ペインでENTER"
echo " tb - ボスペインでENTER"
echo " tw - ワーカーペインでENTER"
echo ""
echo "便利コマンド:"
echo " tc - 全ペインでclear"
echo " ts - セッション状況確認"
echo " end - セッション終了"
echo " tk - 現在のセッションを終了" # ヘルプに追記
echo ""
echo "コマンド例:"
echo " ta \"npm start\" # 全ペインでnpm start"
echo " tb \"git status\" # ボスペインでgit status"
echo " tw \"clear\" # ワーカーペインでclear"
echo " ta \"cd /project\" # 全ペインでディレクトリ移動"
echo ""
echo "ENTER使用例:"
echo " ta \"sudo apt update\" # コマンド入力"
echo " ta # ENTERで実行"
echo ""
echo " tw \"npm init\" # 質問が表示される"
echo " tw # デフォルト値でENTER"
echo ""
echo "セッション: $SESSION"
echo "💡 ペイン構成: Boss(0,4,8,12) + Worker(1-3,5-7,9-11,13-15)"
}; _th'
# ===========================================
# よく使うパターンの例
# ===========================================
# 開発環境セットアップ例
alias dev-start='function _dev_start(){
echo "🚀 開発環境を起動中..."
ta "cd /project"
sleep 1
tb "npm run dev"
tw "npm run worker"
echo "✅ 開発環境起動完了!"
}; _dev_start'
# 全停止
alias dev-stop='function _dev_stop(){
echo "🛑 開発環境を停止中..."
ta "^C" # Ctrl+C
sleep 1
tc # clear
echo "✅ 停止完了"
}; _dev_stop'
# 初回メッセージ
echo "✅ 改良版シンプル tmux コマンドが読み込まれました!"
echo "💡 使い方: th でヘルプ表示"
echo "🚀 便利機能: tc(クリア) ts(状況確認) end(セッション終了) tk(現在のセッション終了) dev-start(開発開始)" # 初回メッセージに追記
設定の反映
.zshrc
を編集した後、以下のコマンドで設定を再読み込みします。
source ~/.zshrc
Step 3: テスト
1. 4x4 の開発環境を起動
# 16個のペインを持つtmuxセッションを開始
./create_tmux_layout.sh 4
2. 全ペインで一斉にコマンド実行
# 全ペインでhelloと言わせる
ta "echo hello"
3. クリーンアップと終了
# 全ペインの画面をクリア
tc
# 現在のtmuxセッションを終了
tk
まとめ
tmux
と .zshrc
のカスタムエイリアスを組み合わせることで、CLIにおける並列処理のセットアップと操作を劇的に効率化できます。
今回紹介したスクリプトと設定をベースに、ご自身の開発スタイルに合わせてカスタマイズしてみてください。
最後に
記事の80%をGemini CLIで書きました