tmux は何をしますか?
既存の対話型tmuxセッションに使用します。ワンショットコマンドには通常のシェルを、新規の非対話型バックグラウンドジョブにはバックグラウンド実行を使用してください。
基本
tmux ls
tmux list-windows -t shared
tmux list-panes -t shared:0
tmux capture-pane -t shared:0.0 -p
tmux capture-pane -t shared:0.0 -p -S -
形式: session:window.pane (例: shared:0.0)
入力送信
リテラルテキスト、その後Enter:
tmux send-keys -t shared:0.0 -l -- "続けてください"
tmux send-keys -t shared:0.0 Enter
特殊キー:
tmux send-keys -t shared:0.0 C-c
tmux send-keys -t shared:0.0 C-d
tmux send-keys -t shared:0.0 Escape
任意のテキストには -l -- を使用します。テキストとEnterは分けて送信し、ペーストや改行の不意の動作を避けます。
セッション
tmux new-session -d -s worker
tmux rename-session -t old new
tmux kill-session -t worker
プロンプト確認
tmux capture-pane -t worker-3 -p | tail -20
tmux capture-pane -t worker-3 -p | rg "proceed|permission|Yes|No|❯"
プロンプトを理解した場合のみ承認/選択:
tmux send-keys -t worker-3 -l -- "y"
tmux send-keys -t worker-3 Enter
ヘルパー
scripts/find-sessions.sh: セッションを発見します。scripts/wait-for-text.sh: キャプチャしたペインの内容にテキストが含まれるまで待機します。
wait-for-text.sh は、プロセス出力だけでなく、エコーされた入力やスクロールバックも検索します。コマンド完了を検出するには、tmuxに送信するコマンドの引数全体にまたがって分割された固有のマーカーを使用します:
nonce="$(od -An -N8 -tx1 /dev/urandom | tr -d ' \n')"
marker="OPENCLAW_DONE_${nonce}"
tmux send-keys -t shared:0.0 -l -- "sleep 4; printf '%s%s\n' 'OPENCLAW_DONE_' '$nonce'"
tmux send-keys -t shared:0.0 Enter
scripts/wait-for-text.sh -t shared:0.0 -p "$marker" -F -T 30
エコーされるコマンドには完全なマーカーが含まれず、nonceによって古い完了行との一致を防ぎます。
注意点
capture-pane -pは標準出力に出力するため、スクリプトで利用できます。-S -は完全なスクロールバックをキャプチャします。- tmuxセッションはSSH切断後も持続します。