본문 바로가기
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

개발 환경이 되는 짧은 셸 스크립트

tmux를 일주일쯤 쓰면 패턴이 보여. 매일 아침 같은 프로젝트를 열고, 같은 window를 만들고, 같은 명령을 돌리고 있거든. tmux의 명령줄 인터페이스가 이 순서 전체를 셸 스크립트로 자동화할 만큼 충분히 풍부해. 스크립트 하나 돌리면 작업 공간이 통째로 뜨는 거지.

기본 레시피

tmux 명령줄은 new-session, send-keys, split-window 같은 하위 명령을 받아. -d를 주면 붙지 않은 상태로 세션을 만들어서 계속 설정할 수 있고, -t로 세션이나 window나 pane을 지목해. send-keys "cmd" C-m은 문자열에 Enter까지 같이 보내주고.

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

배치가 복잡해지면 tmuxinator가 YAML로 쓰는 대안이야. 작업 공간을 선언적으로 적어두고 tmuxinator start project로 띄워. Ruby gem이고, 다른 언어에도 비슷한 게 있어 (Python의 tmuxp). 개인 프로젝트 대부분은 열 줄짜리 셸 스크립트로 충분해.

SSH 너머 tmux 안의 tmux

흔한 상황이야. 로컬에서 tmux를 돌리는데, SSH로 들어간 서버에서도 tmux가 돌고 있어. 그럼 Ctrl-a가 애매해져. 로컬 prefix로 갈까, 리모트 쪽으로 갈까? 깔끔한 해법이 둘 있어.

  • 머신마다 다른 prefix를 써. 로컬 tmux는 Ctrl-a, 리모트 tmux는 기본값 Ctrl-b. 서로 안 겹쳐.
  • send-prefix를 걸어둬. 둘 다 같은 prefix를 써야 한다면, Ctrl-a a가 안쪽에 있는 tmux로 진짜 Ctrl-a를 보내도록 설정해. 두 번 눌러서 안쪽이랑 대화하는 거야.
반복되는 준비 작업은 냄새야. 매일 아침 똑같은 prefix + 명령을 순서대로 치고 있는 자신을 발견하면, 그건 아직 안 쓴 스크립트야. 쓰는 데 몇 분 걸리고, 그 몇 분을 프로젝트가 끝날 때까지 매일 돌려받아.

대화형 키에는 전부 짝이 있어

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 유지.
# 충돌 없음 — 각 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는 실제로 쓰는 작업 두세 개로, 에디터는 프로젝트 최상위에서 열리게. 몇 번을 돌려도 같게 만들어. 돌리고, 빠져나오고, 다시 돌려봐 — 세션이 하나 더 생기는 게 아니라 원래 세션에 다시 붙어야 해. 그 스크립트를 프로젝트에 같이 commit 해두면 나중의 나도, 팀 사람도 덕을 봐.

Progress

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

댓글 0

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

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