C.W.K.
Stream
Lesson 03 of 03 · published

세션 관리와 스크립트 레이아웃

~12 min · tmux, scripts, tmuxinator, automation

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Dev 환경이 되는 5 줄 셸 스크립트

tmux 일주일 쓰면 패턴 보일 거야: 매일 아침 같은 프로젝트 열고, 같은 window 만들고, 같은 명령 실행. tmux 의 커맨드라인 인터페이스가 전체 시퀀스를 셸 스크립트로 자동화하기 충분히 풍부해. 스크립트 실행; 워크스페이스 뜸.

기본 레시피

tmux 의 커맨드라인이 new-session, send-keys, split-window 같은 서브명령 받음. -d 로 detach 된 상태로 세션 생성해서 계속 설정 가능; -t 로 세션/window/pane 타깃; send-keys "cmd" C-m 으로 문자열과 Carriage-Return (Enter) 전송.

tmuxinator — 셸 스크립트가 복잡해질 때

복잡한 레이아웃엔 tmuxinator 가 YAML 기반 대안. 워크스페이스를 선언적으로 묘사; tmuxinator start project 가 띄움. Ruby gem 이고 다른 언어에 비슷한 도구 있어 (Python 의 tmuxp). 대부분 개인 프로젝트엔 10 줄 셸 스크립트면 충분.

SSH 통한 중첩 tmux

흔한 시나리오: 로컬에서 tmux 돌고, 자체 tmux 돌리는 서버에 SSH. 이제 Ctrl-a 가 모호 — 로컬 prefix 로 가나 리모트 거로? 두 깔끔한 해법:

  • 머신별 다른 prefix. 로컬 tmux 가 Ctrl-a, 리모트 tmux 가 Ctrl-b (기본). 충돌 X.
  • Send-prefix 바인딩. 둘 다 같은 prefix 써야 한다면, 각자 설정해서 Ctrl-a a 가 아래 중첩된 거에 리터럴 Ctrl-a 보내게. 두 번 눌러서 안쪽 tmux 와 대화.
보일러플레이트는 냄새. 매 아침 같은 일련의 prefix + 명령 실행하는 자신 발견하면, 그게 작성 기다리는 스크립트야. 스크립트가 작성에 몇 분 걸리고 그 분들을 프로젝트 남은 동안 매일 아껴줘.

발견 가능한 detach

tmux detach-client, tmux switch-client -t name, tmux send-keys -t name 'cmd' Enter — 모든 대화형 키가 비대화형 커맨드라인 짝 가져. 그게 자동화하는 방법.

Code

dev-setup.sh — 진짜 워크스페이스 스크립트·bash
#!/usr/bin/env bash
# dev-setup.sh — 3-window dev 워크스페이스 열기
set -euo pipefail

SESSION="myproject"
PROJECT_DIR="${HOME}/projects/myproject"

# 이미 있으면 재생성 안 함
if tmux has-session -t "$SESSION" 2>/dev/null; then
  exec tmux attach -t "$SESSION"
fi

# Window 1: editor
tmux new-session -d -s "$SESSION" -c "$PROJECT_DIR" -n editor
tmux send-keys -t "$SESSION:editor" "nvim ." C-m

# Window 2: dev 서버
tmux new-window -t "$SESSION" -n server -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION:server" "npm run dev" C-m

# Window 3: 두 pane 셸
tmux new-window -t "$SESSION" -n shell -c "$PROJECT_DIR"
tmux split-window -h -t "$SESSION:shell" -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION:shell.0" "git status" C-m

# editor window 에 도착
tmux select-window -t "$SESSION:editor"
tmux attach -t "$SESSION"
tmuxinator — 같은 레이아웃의 YAML 버전·yaml
# ~/.tmuxinator/myproject.yml
name: myproject
root: ~/projects/myproject

windows:
  - editor:
      panes:
        - nvim .
  - server:
      panes:
        - npm run dev
  - shell:
      layout: even-horizontal
      panes:
        - git status
        - 
중첩 tmux SSH config·tmux
# 로컬 tmux 가 Ctrl-a 사용; 두 번 누르면 아래 돌고 있는 거에
# 리터럴 Ctrl-a 전송 (리모트 tmux 가 Ctrl-b 쓰는 거든, 또 다른 Ctrl-a 인스턴스든).
bind -n C-a send-prefix

# 또는: 깔끔한 분리. 로컬: Ctrl-a. 리모트: 기본 Ctrl-b 유지.
# 충돌 X — 각 tmux 가 자기 prefix 받음.
스크립트에서 유용한 일회성 tmux 명령·bash
# 돌고 있는 세션/window/pane 에 명령 보냄
tmux send-keys -t myproject:editor.0 'echo hi' C-m

# Attach 된 클라이언트를 window 로 전환
tmux select-window -t myproject:server

# 현재 pane 내용을 파일로 저장
tmux capture-pane -p -t myproject:editor > /tmp/editor.log

# 스크립트 친화적 포맷으로 세션 리스트
tmux list-sessions -F '#{session_name}'

External links

Exercise

정기적으로 작업하는 프로젝트 골라. 위 스크립트 모델로 dev-setup.sh 작성: 세션 이름 = 프로젝트 이름, 실제 실행하는 작업용 두세 window, editor 가 프로젝트 root 에 열림. Idempotent 하게. 실행; detach; 다시 실행 — 중복 대신 reattach 해야 함. 스크립트를 프로젝트와 함께 commit. 미래의 너 (와 팀원) 이 이김.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.