05장에서는 tmux set -g prefix C-a처럼 명령줄로 옵션을 바꿨다. 매번 서버를 새로 띄울 때마다 이 명령을 다시 입력하고 싶지 않다면, 그 명령들을 파일 하나에 모아두고 tmux가 시작할 때 자동으로 읽게 하면 된다. 이 장은 그 파일 — tmux.conf — 이 어디에 있고, 어떤 문법을 따르며, 이미 떠 있는 서버에 변경사항을 어떻게 반영(reload)하는지를 다룬다.
이 장을 읽기 전에
선행 챕터: 이 장은 05장: Prefix 키와 커맨드 모드에서 명령줄로 실행해 본 set -g prefix 같은 옵션 변경을, 파일로 관리하는 법으로 확장한다. 05장 끝에서 예고한 “옵션 범위(global/session/window/pane)“도 이 장에서 다룬다.
이 장의 깊이: 입문에서 중급(설정 파일이 언제 읽히고, 왜 reload가 필요한지 스스로 진단할 수 있는 수준) 사이를 오간다. 다루지 않는 것: 특정 키를 원하는 동작에 새로 연결하는 bind-key 문법 자체는 07장에서, 상태바에 무엇을 표시할지 정하는 포맷 문자열은 08장에서 각각 다룬다. 이 장은 설정 파일의 위치·문법·재적용에 집중한다.
당신의 수준에 맞는 경로
| 수준 | 읽을 부분 | 핵심 목표 |
|---|---|---|
| tmux.conf를 아직 만들어 본 적 없는 사람 | 정신 모델, 설정 파일 위치와 문법, 예시 | 첫 tmux.conf를 만들고 reload로 반영할 수 있다 |
| 명령줄로 옵션을 바꿔봤지만 파일로 관리하고 싶은 사람 | 옵션 범위, 예시(reload 패턴) | -g 유무에 따른 옵션 적용 범위를 이해하고 파일로 옮길 수 있다 |
| 설정을 고쳤는데 반영이 안 돼 당황한 적 있는 사람 | 주의사항·함정, 흔한 오개념 | 설정 파일이 언제 읽히는지 알고 reload 누락을 스스로 진단할 수 있다 |
| 여러 서버·환경에 같은 설정을 배포하려는 사람 | 설정 파일 위치와 문법(-f, 시스템 전역 파일), 비교/트레이드오프 | 사용자별·시스템 전역 설정 파일의 차이를 활용할 수 있다 |
정신 모델: 설정 파일은 “서버가 시작할 때 한 번 실행하는 명령 목록”
tmux.conf는 특별한 선언적 형식이 아니라, 지금까지 명령줄에서 tmux <명령>으로 입력해 온 것과 똑같은 tmux 명령을 한 줄에 하나씩 적어 둔 파일이다. tmux 서버는 처음 시작될 때 이 파일을 딱 한 번 읽어 위에서부터 순서대로 실행한다. 이미 떠 있는 서버는 파일이 바뀌어도 스스로 다시 읽지 않으므로, 변경사항을 반영하려면 source-file 명령으로 명시적으로 다시 실행시켜야 한다.
파일 단위와 한 줄(명령 시퀀스) 단위의 오류 처리 방식이 서로 다르다는 점도 알아 두면 유용하다. 한 줄에 세미콜론(;)으로 여러 명령을 이어 쓰면 그 줄은 하나의 명령 시퀀스가 되고, 그 시퀀스 안에서 앞 명령이 실패하면 뒤 명령은 아예 실행되지 않는다. 반면 파일 전체 수준에서는 관용적이다 — 어떤 줄에서 에러가 나도 tmux는 그 줄만 건너뛰고 파일의 나머지 줄은 계속 처리하며, 에러 메시지는 그때 만들어지는 첫 세션에 표시된다.
설정 파일 위치와 문법
tmux는 서버가 시작될 때 아래 순서로 설정 파일을 찾는다.
| 파일 | 성격 |
|---|---|
@SYSCONFDIR@/tmux.conf(예: /etc/tmux.conf) | 시스템 전역 설정(있으면 먼저 로드) |
~/.tmux.conf | 사용자 설정(가장 흔히 쓰는 위치) |
$XDG_CONFIG_HOME/tmux/tmux.conf 또는 ~/.config/tmux/tmux.conf | XDG 규격을 따르는 대안 위치 |
-f 파일경로 옵션으로 tmux를 실행하면 위 기본 탐색 대신 지정한 파일을 대신 읽는다. 여러 환경(작업용/개인용, 로컬/원격)에 서로 다른 설정을 쓰고 싶을 때 유용하다.
@SYSCONFDIR@의 실제 경로는 고정값이 아니라 tmux를 빌드·패키징할 때 정해지는 값이라, 같은 리눅스 배포판이라도 패키지 관리자마다, 또 macOS의 Homebrew 빌드에서도 서로 다를 수 있다(예: /etc/tmux.conf, /usr/local/etc/tmux.conf 등). 정확한 위치가 궁금하면 추측하지 말고 tmux -V와 함께 패키지 매니저의 파일 목록 조회 기능(예: dpkg -L tmux, brew list tmux)으로 직접 확인하는 것이 안전하다.
문법 규칙은 단순하다. 한 줄에 명령 하나가 기본이고, #로 시작하는 부분은 그 줄 끝까지 주석으로 무시된다. 여러 명령을 한 줄에 세미콜론으로 이어 쓸 수 있고, 줄 끝에 백슬래시(\)를 두면 다음 줄과 이어 붙는다(줄 잇기). 인자에 공백이나 특수문자가 들어가면 작은따옴표·큰따옴표 또는 중괄호({})로 감싼다.
옵션 범위: server / session / window / pane
05장에서 set -g prefix C-a를 실행하며 “전역으로 바뀐다"고만 설명했다. 실제로 tmux의 옵션은 서버 전체에 적용되는 것, 세션마다 다르게 줄 수 있는 것, 윈도우·패널마다 다르게 줄 수 있는 것으로 나뉜다.
| 플래그 | 범위 | 설명 |
|---|---|---|
-s | 서버(server) | 서버 전체에 적용되는 옵션(세션 구분 없음) |
| (생략) | 세션(session) | 옵션 이름으로 서버가 스스로 범위를 판단하되, 기본은 현재 세션에만 적용 |
-w | 윈도우(window) | 현재 윈도우에만 적용 |
-p | 패널(pane) | 현재 패널에만 적용 |
-g | 전역(global) | 세션 옵션이면 모든 세션에, 윈도우 옵션이면 모든 윈도우에 공통 기본값으로 적용 |
-g 없이 set prefix C-a를 실행하면 그 순간 접속해 있는 세션에만 적용되고, 다른 세션이나 앞으로 만들 세션에는 영향을 주지 않는다. tmux.conf에서 prefix처럼 항상 같은 값을 쓰고 싶은 옵션은 거의 항상 -g를 붙인다.
예시
첫 tmux.conf 작성하기
| |
변경사항 반영하기 (reload)
이미 실행 중인 서버는 파일을 다시 읽지 않으므로, 고친 뒤에는 source-file로 명시적으로 다시 실행시켜야 한다.
| |
매번 이렇게 전체 명령을 타이핑하기 번거로우므로, 아래처럼 단축키 하나에 reload 자체를 연결해 두는 것이 관례다(단축키를 새로 연결하는 bind 문법 자체는 07장에서 더 다룬다).
| |
반영 전에 문법부터 확인하기
설정이 복잡해지면 reload 전에 문법 오류가 없는지 먼저 확인하는 것이 안전하다.
| |
비교/트레이드오프
명령줄에서 그때그때 옵션을 바꾸는 것과, 파일로 관리하는 것은 서로 다른 상황에 맞는다.
| 구분 | 명령줄에서 직접 실행 | tmux.conf 파일로 관리 |
|---|---|---|
| 지속성 | 서버가 재시작되면 사라진다 | 서버를 새로 띄울 때마다 자동으로 적용된다 |
| 재현성 | 다른 서버·환경에 옮기려면 명령을 다시 타이핑해야 한다 | 파일 하나만 복사하면 동일한 환경을 재현할 수 있다 |
| 실험 | 즉시 효과를 확인하며 빠르게 시험해 볼 수 있다 | 매번 reload를 실행해야 반영을 확인할 수 있다 |
| 적합한 상황 | 지금 세션에서만 잠깐 필요한 임시 조정 | 앞으로 계속 쓸 기본 설정 |
실무에서는 두 방식을 함께 쓴다 — 새 옵션을 명령줄에서 즉시 시험해 마음에 들면 그 명령을 tmux.conf에 옮겨 적고 reload하는 흐름이 흔하다.
주의사항·함정
reload를 잊는 사고: 설정 파일을 고쳤는데 화면이 그대로라면, 가장 먼저 의심할 것은 문법 오류가 아니라 reload를 안 했다는 사실이다. 서버는 파일을 스스로 다시 읽지 않는다.
세미콜론 체인과 파일 전체의 오류 처리 차이: 한 줄 안에서 세미콜론으로 명령을 여러 개 이었다면, 앞 명령이 실패하는 순간 그 줄의 나머지 명령은 실행되지 않는다. 반면 파일의 다른 줄들은 그 오류와 무관하게 계속 처리된다. “설정 일부만 적용된 것 같다"는 증상은 대개 세미콜론으로 묶은 한 줄 안에서 앞부분이 실패했다는 신호다.
여러 위치에 설정 파일이 동시에 존재할 때: ~/.tmux.conf와 ~/.config/tmux/tmux.conf를 둘 다 만들어 두면 어느 쪽이 실제로 읽히는지 헷갈리기 쉽다. -f로 경로를 명시하거나, tmux source-file -v로 지금 어떤 파일이 파싱됐는지 확인하는 습관을 들인다.
흔한 오개념
“설정 파일을 고치면 실행 중인 tmux에 바로 반영된다”는 생각은 틀렸다. 서버는 시작 시점에만 파일을 읽으므로, source-file(또는 이를 연결한 reload 단축키)을 실행해야 변경사항이 지금 떠 있는 서버에도 적용된다.
“설정 파일에 오타가 하나 있으면 전체 설정이 무효가 된다”는 오해도 흔하다. 실제로는 오류가 난 그 줄만 건너뛰고, 파일의 나머지 줄은 계속 처리된다. 다만 오류 메시지는 그때 새로 만들어지는 세션에서만 보이므로, 이미 열려 있던 세션에서는 무엇이 잘못됐는지 바로 알기 어려울 수 있다.
"-g 없이 set을 쓰면 결국 모든 세션에 적용된다”는 생각도 정확하지 않다. -g가 없으면 옵션 종류에 따라 현재 세션·윈도우·패널에만 적용되고, 다른 세션에는 영향을 주지 않는다. 모든 세션에 공통으로 적용하려는 옵션은 명시적으로 -g를 붙여야 한다.
다음 장에서는
07장: 키바인딩 커스터마이징 - bind-key와 vim 스타일 재배치에서는 이 장에서 잠깐 맛본 bind/unbind 문법을 본격적으로 다뤄, 원하는 키에 원하는 동작을 자유롭게 연결하는 법을 배운다.
평가 기준
이 장을 읽은 후 다음을 할 수 있어야 한다.
- tmux.conf가 언제, 몇 번 읽히는지 설명하고, 그로부터 reload가 왜 필요한지 추론할 수 있다.
source-file의 기본 동작과-n(dry-run)·-v(상세 파싱 결과) 옵션의 용도를 구분할 수 있다.-g의 유무가 옵션 적용 범위(서버/세션/윈도우/패널)를 어떻게 바꾸는지 설명할 수 있다.- 세미콜론으로 묶은 한 줄과 파일 전체의 오류 처리 방식이 어떻게 다른지 설명할 수 있다.
- 사용자 설정 파일과 시스템 전역 설정 파일의 차이,
-f옵션의 용도를 설명할 수 있다.
참고 및 출처
- tmux(1) - OpenBSD Manual — 설정 파일 위치(FILES),
-f옵션, PARSING SYNTAX(주석·세미콜론·줄 잇기),source-file·set-option·display-message공식 설명. - tmux/tmux — tmux 공식 소스 저장소.
![Featured image of post [Tmux] 06. tmux.conf 기초 - 설정 문법과 reload](/post/tmux/tmux-conf-basics-set-options-reload/wordcloud_hu_d8215ca9a35f3c1c.webp)
![[Tmux] 04. 윈도우와 패널 기초 - 분할·전환·닫기·zoom](/post/tmux/tmux-window-pane-basics-split-zoom/wordcloud_hu_6095cfec32f1ef59.webp)
![[Tmux] 05. Prefix 키와 커맨드 모드](/post/tmux/tmux-prefix-key-command-mode/wordcloud_hu_dab9c354915cbeac.webp)
![[Tmux] 06. tmux.conf 기초 - 설정 문법과 reload](/post/tmux/tmux-conf-basics-set-options-reload/wordcloud_hu_6423898ad1f99547.webp)
![[Tmux] 07. 키바인딩 커스터마이징 - bind-key와 vim 스타일 재배치](/post/tmux/tmux-keybinding-customization-vim-style/wordcloud_hu_3a41ca99bbff6fff.webp)
![[Tmux] 08. 상태바(Status Line) 커스터마이징](/post/tmux/tmux-status-bar-customization-status-line/wordcloud_hu_f5e3ad599abd3b23.webp)
![[Tmux] 20. 트러블슈팅 - 클립보드·색상·중첩 세션](/post/tmux/tmux-troubleshooting-clipboard-colors-nested-sessions/wordcloud_hu_ceeade5033f9387c.webp)
![[Tmux] 03. 세션(Session) 다루기 - 생성·접속·분리·종료](/post/tmux/tmux-session-new-attach-detach-kill/wordcloud_hu_72c0b4b5b9c07154.webp)