with one click
oneq-control-tmux-pane
다른 tmux pane의 출력을 수집·분석하고, 쉘 프롬프트 상태일 때 명령도 전송
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
다른 tmux pane의 출력을 수집·분석하고, 쉘 프롬프트 상태일 때 명령도 전송
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | oneq-control-tmux-pane |
| description | 다른 tmux pane의 출력을 수집·분석하고, 쉘 프롬프트 상태일 때 명령도 전송 |
현재 tmux 세션의 다른 pane에서 버퍼를 가져와 분석하고, 필요하면 명령을 전송해 상호작용하는 스킬.
$TMUX 셋)매 단계마다 (1) 상태를 확인하고, (2) 상태에 맞는 액션(캡처 또는 전송)을 고르고, (3) 결과를 분석한 뒤 다음 단계를 정한다. 사용자 요청을 다 처리할 때까지 반복.
대상 pane 버퍼의 최근 30라인을 캡처해 현재 상태를 직접 읽고 판단한다. 프로세스 이름만으로는 모호하므로 실제 버퍼 내용을 분석해 결정.
TARGET=".2"
tmux capture-pane -t "$TARGET" -p -S -30
버퍼를 보고 파악할 것:
%, $, #, 또는 커스텀 PS1)로 끝남 → 명령 전송 가능cwd, 가상환경, 활성 컨테이너 등 이후 명령/출력 해석에 영향 주는 컨텍스트 파악.상태를 한 줄로 요약해 사용자에게 먼저 알리고 다음 액션으로 진행.
tmux capture-pane -t "$TARGET" -p -S -500 # 필요 시 -S 값 확대
grep/awk/sed 로 관심 라인/구간만 추려 보고.쉘 프롬프트 상태일 때만. 센티넬 마커로 경계를 감싸 전송하면 BEGIN~END 사이만 해당 명령의 출력이다.
NONCE="$(date +%s)_$$"
BEGIN="__TMUX_BEGIN_${NONCE}__"
END="__TMUX_END_${NONCE}__"
CMD='cd /mail/logs && grep -c ERROR *.log | head'
# 외부 "..." 로 NONCE 확장 허용, $? 는 대상 쉘에서 확장되도록 \$? 로 이스케이프
tmux send-keys -t "$TARGET" "printf '\n%s\n' '$BEGIN'; ${CMD}; printf '\n%s rc=%s\n' '$END' \"\$?\"" Enter
복잡한 이스케이프(따옴표·백틱·개행 포함)가 필요하면 /tmp/ 에 스크립트를 쓰고 bash /tmp/xxx.sh 만 전송.
END 마커가 줄 시작에 나올 때까지 대기. zsh가 send-keys 내용을 입력 에코할 때 같은 줄 중간에도 마커 문자열이 찍히므로, ^ 앵커로 실제 출력만 인식한다. 타임아웃 포함:
DEADLINE=$(( $(date +%s) + 120 ))
until tmux capture-pane -t "$TARGET" -p -S -5000 | grep -q "^$END"; do
[[ $(date +%s) -ge $DEADLINE ]] && { echo "timeout"; break; }
sleep 1
done
BEGIN~END 구간과 rc 추출. 여기서도 에코된 입력 라인에 마커가 중간에 박혀 있으므로 ^ 앵커로 줄 시작 매칭만 인정한다.
BUF="$(tmux capture-pane -t "$TARGET" -p -S -5000)"
OUT="$(printf '%s\n' "$BUF" | awk -v b="^$BEGIN" -v e="^$END" '
$0 ~ b {f=1; next}
$0 ~ e {f=0}
f
')"
RC="$(printf '%s\n' "$BUF" | awk -v e="^$END" '$0 ~ e { for(i=1;i<=NF;i++) if($i ~ /^rc=/){ sub(/^rc=/,"",$i); print $i; exit } }')"
출력이 scrollback을 넘기면 -S 값을 더 크게 하거나 명령을 파일로 리다이렉트해서 cat 으로 회수.
결과를 보고 더 캡처할지, 명령을 이어 보낼지, 보고하고 끝낼지 정한다. 상태가 바뀌었을 수 있으므로 액션 전에는 항상 1로 돌아가 상태 재확인.
rm -rf, drop, git push --force 등)은 반드시 사용자 확인 후 전송.cd/환경변수/alias 는 pane에 남는다. 연속 명령이면 의도한 상태인지 매번 확인.## pane 상태
- pane: .2 (zsh @ /path/to/cwd, 또는 "nginx 로그 tail 중")
## 수행
- [캡처] 5000라인 / [전송] <명령 요약> rc=0
## 출력 (요약)
<핵심 라인만>
## 분석
<사용자 요청에 대한 답/발견점>
출력이 길면 원본 버퍼는 /tmp/ 에 저장하고 경로만 보고에 포함한다.