ํฌ์ŠคํŠธ

๐Ÿงท tmux ์„ธ์…˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ โ€” ์„ธ์…˜ ๋งค๋‹ˆ์ €์™€ ๊ทธ ์†์‚ด(์…ธ ์Šคํฌ๋ฆฝํŠธ)

๊ฐ™์€ ์„ธ์…˜/์œˆ๋„์šฐ/ํŒจ๋„์„ ๋งค๋ฒˆ ์†์œผ๋กœ ์„ธํŒ…ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์„ธ์…˜ ๋งค๋‹ˆ์ €(tmuxpยทsmugยทtmuxinator)๊ฐ€ ์ •์„. ๊ทธ ๋„๊ตฌ๊ฐ€ ๋‚ด๋ถ€์—์„œ ๋ถ€๋ฅด๋Š” tmux ๋ช…๋ น์„ ์…ธ๋กœ ํ•ด๋ถ€ํ•ด ์›๋ฆฌ๊นŒ์ง€ ์žก๋Š”๋‹ค.

๐Ÿงท tmux ์„ธ์…˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ โ€” ์„ธ์…˜ ๋งค๋‹ˆ์ €์™€ ๊ทธ ์†์‚ด(์…ธ ์Šคํฌ๋ฆฝํŠธ)

๊ฐ™์€ ์ž‘์—… ํ™˜๊ฒฝ(์„ธ์…˜ยท์œˆ๋„์šฐยทํŒจ๋„)์„ ๋งค๋ฒˆ ์†์œผ๋กœ ์„ธํŒ…ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์„ธ์…˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์ด ๋‹ต์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๋‹ค โ€” tmuxinator(2011~)ยทtmuxpยทsmug ๊ฐ™์€ ์„ธ์…˜ ๋งค๋‹ˆ์ €๊ฐ€ YAML ํ•œ ์žฅ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์„ ์–ธํ•˜๋ฉด ์•Œ์•„์„œ ๋„์›Œ์ค€๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ: ์ด๊ฑธ ์จ๋ผ. ๋งค๋ฒˆ ์…ธ๋กœ ์ง์ ‘ ์งœ๋Š” ๊ฑด ๋ฐ”ํ€ด ์žฌ๋ฐœ๋ช…์ด๋‹ค.

๊ทธ๋Ÿผ ์ด ๊ธ€์€ ์™œ ์…ธ ์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ๋‹ค๋ฃจ๋‚˜ โ€” ์„ธ์…˜ ๋งค๋‹ˆ์ €๊ฐ€ ์•ˆ์—์„œ ํ•˜๋Š” ์ผ์ด ์ •ํ™•ํžˆ ๊ทธ๊ฑฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. smug๋„ tmuxinator๋„ ๊ฒฐ๊ตญ tmux new-sessionยทsplit-window๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ถ€๋ฅด๋Š” ๋ž˜ํผ๋‹ค. ๊ทธ ์†์‚ด์„ ์…ธ๋กœ ํ•œ ๋ฒˆ ์งœ๋ณด๋ฉด ๋„๊ตฌ๊ฐ€ ๋ญ˜ ๋Œ€์‹ ํ•ด ์ฃผ๋Š”์ง€, ์™œ YAML ๋ช‡ ์ค„์ด ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์†์— ์žกํžŒ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๊ธ€์€ (1) ์ •์„์ธ ์„ธ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ๋จผ์ € ์„ธ์šฐ๊ณ  โ†’ (2) ๊ทธ ์•„๋ž˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์…ธ๋กœ ํ•ด๋ถ€ํ•œ๋‹ค. ์“ฐ๋ผ๋Š” ๊ฑด ๋„๊ตฌ๊ณ , ์…ธ์€ ์›๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•œ ํ•ด๋ถ€์šฉ์ด๋‹ค.

์ด ๊ธ€์€ tmux ๋กœ๋“œ๋งต์˜ 3๋‹จ๊ณ„(์„ธ์…˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ž๋™ํ™”) ๋‹ค. ์ž…๋ฌธยท์„ค์ •ยทํ”Œ๋Ÿฌ๊ทธ์ธ ๋‹จ๊ณ„๋Š” ๋กœ๋“œ๋งต์—์„œ. ์—ฌ๊ธฐ ๋‚˜์˜ค๋Š” ์„ธ์…˜ ๋งค๋‹ˆ์ €๋Š” 2๋‹จ๊ณ„ TPM ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋‹ค๋ฅธ ์ถ• โ€” tmux ์•ˆ์—์„œ ๋„๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•„๋‹ˆ๋ผ tmux ๋ฐ–์˜ ์™ธ๋ถ€ CLI๋‹ค.


1. ์ •์„ โ€” ์„ธ์…˜ ๋งค๋‹ˆ์ €๋กœ ์„ ์–ธํ•˜๊ธฐ

๋ ˆ์ด์•„์›ƒ์„ โ€œ์ด๋Ÿฐ ๋ชจ์–‘โ€์ด๋ผ๊ณ  YAML๋กœ ์ ์œผ๋ฉด ๋์ด๋‹ค. main ์„ธ์…˜(์ขŒ 1 + ์šฐ 2, 3-pane + secondary ์œˆ๋„์šฐ)์„ tmuxp๋กœ ์˜ฎ๊ธฐ๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
# ~/.config/tmuxp/main.yaml
session_name: main
start_directory: ~/         # ๋ชจ๋“  pane ์‹œ์ž‘ ๋””๋ ‰ํ† ๋ฆฌ โ€” ์…ธ์˜ `cd ~/`๊ฐ€ ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„๋‹ค
windows:
  - window_name: main
    layout: main-vertical   # ์ขŒ 1 + ์šฐ 2 ๋ถ„ํ• 
    panes:                  # ๋นˆ pane 3๊ฐœ ๋‚˜์—ด = 3-pane
      -
      -
      -
  - window_name: secondary
    panes:
      -

tmuxp load main ํ•œ ์ค„์ด๋ฉด ์ด ์„ธ์…˜์ด ๋œฌ๋‹ค(Python ํŒจํ‚ค์ง€, pip install tmuxp). ์„ธ ๋„๊ตฌ ๋‹ค ์ด๋ฏธ ๋–  ์žˆ์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  attachํ•œ๋‹ค โ€” ์•„๋ž˜ ์…ธ ์Šคํฌ๋ฆฝํŠธ์˜ has-session ๋ถ„๊ธฐ(ยง2)๊ฐ€ ๋„๊ตฌ์—์„  ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋“ค์–ด ์žˆ๋‹ค.

smugยทtmuxinator๋„ ๊ฑฐ์˜ ๊ฐ™์€ YAML์ด๋‹ค โ€” ํ‚ค ์ด๋ฆ„๊ณผ ์„ค์น˜ยท๋Ÿฐํƒ€์ž„๋งŒ ๋‹ค๋ฅด๋‹ค(์•„๋ž˜ ํ‘œ). smug๋Š” session:/root:์— brew install smug(Go ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ, ๋Ÿฐํƒ€์ž„ 0), tmuxinator๋Š” name:์— gem install(Ruby)์ด๋‹ค.

์–ด๋А ๊ฑธ ๊ณ ๋ฅด๋‚˜ โ€” ์กฐ๊ฑด๋ถ€ ์ˆœ์œ„

ย smugtmuxptmuxinator
๋Ÿฐํƒ€์ž„Go ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ (๋ฌด์˜์กด)PythonRuby
์„ค์น˜brew install smugpip install tmuxpgem install tmuxinator
์‹คํ–‰smug start maintmuxp load mainmux start main
๊ฐ•์ ์ด์‹์„ฑ โ€” ์„œ๋ฒ„ยท์ปจํ…Œ์ด๋„ˆ ์–ด๋””์„œ๋“ freeze๋กœ ์„ธ์…˜โ†’config ์—ญ์ถ”์ถœ์ž๋ฃŒยท์˜ˆ์ œ ์ตœ๋‹ค, ํด๋ž˜์‹
ํ™œ์„ฑยท๋ชจ๋ฉ˜ํ…€๋‹ˆ์น˜ยท์ €ํ™œ๋™ (โ˜…0.9k, ~16์ปค๋ฐ‹/๋…„)์ตœ๋‹ค ํ™œ๋™์ด๋‚˜ ์‚ฌ์‹ค์ƒ 1์ธ ๋ฉ”์ธํ…Œ์ด๋„ˆ โš ๏ธ (โ˜…4.5k, ~690์ปค๋ฐ‹/๋…„)์„ฑ์ˆ™ยท๊ธฐ๋“๊ถŒ, ํ™œ๋™ ์ €์กฐํ•˜๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋„“์Œ (โ˜…13.7k, ~31์ปค๋ฐ‹/๋…„)

์…‹ ๋‹ค ์„ค์น˜ ๋ช…๋ น์ด ์ œ๊ฐ๊ฐ(brew/pip/gem)์ธ ๋ฐ์„œ ๋“œ๋Ÿฌ๋‚˜๋“ฏ, TPM @plugin์œผ๋กœ ๊นŒ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ž ๋…๋ฆฝ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์…ธ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•ด tmux๋ฅผ ๋ฐ–์—์„œ ๋ถ€๋ฆฐ๋‹ค.

  1. ๋ฌด๋‚œํ•œ ๊ธฐ๋ณธ๊ฐ’์€ tmuxp โ€” ํ™œ๋™ ์ตœ๋‹ค์— freeze๋กœ ์ง€๊ธˆ ๋–  ์žˆ๋Š” ์„ธ์…˜์„ ๊ทธ๋Œ€๋กœ config๋กœ ์—ญ์ถ”์ถœํ•œ๋‹ค. Python๋งŒ ์žˆ์œผ๋ฉด(๋Œ€๋ถ€๋ถ„ ์žˆ๋‹ค) ๊ฐ€์žฅ ๋„“๊ฒŒ ๋งž๋Š”๋‹ค. ๋‹จ ์‚ฌ์‹ค์ƒ 1์ธ ๋ฉ”์ธํ…Œ์ด๋„ˆ์ธ ๊ฑด ๊ฐ์•ˆ.
  2. ๋ฌด์˜์กดยท์ด์‹์„ฑ์ด ์ตœ์šฐ์„ (์„œ๋ฒ„ยท์ปจํ…Œ์ด๋„ˆ ์˜ค๊ฐ)์ด๋ฉด smug โ€” ๋Ÿฐํƒ€์ž„ 0, ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ. ํ™œ๋™์€ ๋‚ฎ์ง€๋งŒ ์„ค์ •์ด ๋‹จ์ˆœํ•ด ๊นจ์งˆ ๊ฒŒ ๋ณ„๋กœ ์—†๋‹ค.
  3. ๋ ˆํผ๋Ÿฐ์Šคยท์˜ˆ์ œ๊ฐ€ ๋งŽ์•„์•ผ ํ•˜๋ฉด tmuxinator โ€” ์Šคํƒ€ 1์œ„ยท์ž๋ฃŒ ์ตœ๋‹ค์ง€๋งŒ Ruby ์˜์กด์— ์ €ํ™œ๋™์ด๋ผ ์ง€๊ธˆ ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ๊ฒฐ์ •์  ์ด์œ ๋Š” ์•ฝํ•˜๋‹ค.

smug๋ฅผ ๊ณจ๋ž๋‹ค๋ฉด โ€” ์‹ค์ „ config์™€ ํ”„๋ฆฌ์…‹์— ์—†๋Š” ์ปค์Šคํ…€ ๋ ˆ์ด์•„์›ƒ ์žก๋Š” ๋ฒ•์€ smug ์‹ฌํ™” ๊ธ€์—์„œ ์ด์–ด์ง„๋‹ค.


2. ์†์‚ด โ€” ๋„๊ตฌ๊ฐ€ ๋ถ€๋ฅด๋Š” tmux ๋ช…๋ น

์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” โ€œ์“ฐ๋Š” ๋ฒ•โ€์ด ์•„๋‹ˆ๋ผ โ€œ์›๋ฆฌโ€๋‹ค. ์œ„ YAML์ด ์‹คํ–‰๋˜๋ฉด ์„ธ์…˜ ๋งค๋‹ˆ์ €๊ฐ€ ๋‚ด๋ถ€์—์„œ ํ•˜๋Š” ์ผ์ด ๊ฒฐ๊ตญ ์ด๊ฑฐ๋‹ค โ€” tmux ๋ช…๋ น์„ ์ˆœ์„œ๋Œ€๋กœ ๋ถ€๋ฅด๋Š” ๊ฒƒ๋ฟ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env bash

set -euo pipefail

MAIN_SESSION="main"
SUB_SESSION="sub"

# ์ด๋ฏธ main ์„ธ์…˜์ด ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๋ถ™๊ธฐ (๋„๊ตฌ์˜ "๋–  ์žˆ์œผ๋ฉด attach"์— ํ•ด๋‹น)
if tmux has-session -t "$MAIN_SESSION" 2>/dev/null; then
  tmux attach -t "$MAIN_SESSION"
  exit 0
fi

# 1) main ์„ธ์…˜ ์ƒ์„ฑ + ์ฒซ ์œˆ๋„์šฐ
tmux new-session -d -s "$MAIN_SESSION" -n "main"

# 2) ์ฒซ ์œˆ๋„์šฐ: ์ขŒ/์šฐ ๋ถ„ํ•  + ์˜ค๋ฅธ์ชฝ ์ƒ/ํ•˜ ๋ถ„ํ•  (์ด 3 panes) โ†’ ์„ธ์…˜ ๋งค๋‹ˆ์ €์˜ layout: main-vertical
tmux split-window -h -t "$MAIN_SESSION":0
tmux split-window -v -t "$MAIN_SESSION":0.1

# ์‹œ์ž‘ ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ • โ†’ tmuxp์˜ start_directory: ~/(smugยทtmuxinator์€ root:) ํ•œ ์ค„์ด ๋Œ€์‹ ํ•˜๋Š” ๋ถ€๋ถ„
tmux send-keys -t "$MAIN_SESSION":0.0 "cd ~/" C-m
tmux send-keys -t "$MAIN_SESSION":0.1 "cd ~/" C-m
tmux send-keys -t "$MAIN_SESSION":0.2 "cd ~/" C-m

# 3) main ๋‘ ๋ฒˆ์งธ ์œˆ๋„์šฐ โ†’ windows: ๋ชฉ๋ก์˜ secondary ํ•ญ๋ชฉ
tmux new-window -t "$MAIN_SESSION" -n "secondary"
tmux send-keys -t "$MAIN_SESSION":1 "cd ~/" C-m

# 4) sub ์„ธ์…˜ ์ƒ์„ฑ โ†’ ๋„๊ตฌ์—์„  ๋ณดํ†ต ํŒŒ์ผ ํ•˜๋‚˜ = ์„ธ์…˜ ํ•˜๋‚˜๋ผ, ๋ณ„๋„ config๊ฐ€ ๋œ๋‹ค
tmux new-session -d -s "$SUB_SESSION" -n "sub"
tmux send-keys -t "$SUB_SESSION":0 "cd ~/" C-m

# 5) main ์ฒซ ์œˆ๋„์šฐ๋กœ ์ด๋™ ํ›„ attach
tmux select-window -t "$MAIN_SESSION":0
tmux attach -t "$MAIN_SESSION"

ํ•œ ์ค„์”ฉ ๋ณด๋ฉด ๋„๊ตฌ์˜ ์ •์ฒด๊ฐ€ ๋“œ๋Ÿฌ๋‚œ๋‹ค โ€” new-session์œผ๋กœ ์„ธ์…˜์„ ๋งŒ๋“ค๊ณ , split-window๋กœ ์ชผ๊ฐœ๊ณ , send-keys๋กœ ๋ช…๋ น์„ ๋ฐ€์–ด๋„ฃ๊ณ , attach๋กœ ๋ถ™๋Š”๋‹ค. tmuxp์˜ layout: main-vertical์€ ์ € split-window ๋‘ ์ค„์ด๊ณ , start_directory: ~/๋Š” ์ € send-keys "cd ~/" ์„ธ ์ค„์ด๋ฉฐ, load ์‹œ ์ž๋™ attach๋Š” ๋งˆ์ง€๋ง‰ tmux attach๋‹ค. ๋งจ ์œ„ has-session ๋ถ„๊ธฐ๊ฐ€ โ€œ์ด๋ฏธ ๋–  ์žˆ์œผ๋ฉด attachโ€์— ํ•ด๋‹นํ•œ๋‹ค. ๋„๊ตฌ๋Š” ์ด ๋‚˜์—ด์„ YAML ๋’ค์— ์ˆจ๊ฒจ ์ค„ ๋ฟ, ํ•˜๋Š” ์ผ์€ ๋˜‘๊ฐ™๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ฐจ์ด โ€” ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” mainยทsub ๋‘ ์„ธ์…˜์„ ํ•œ ํŒŒ์ผ์— ๋„ฃ์—ˆ๋Š”๋ฐ, ์„ธ์…˜ ๋งค๋‹ˆ์ €๋Š” ๋ณดํ†ต ํŒŒ์ผ ํ•˜๋‚˜ = ์„ธ์…˜ ํ•˜๋‚˜๋‹ค. ๋„๊ตฌ๋กœ ์˜ฎ๊ธฐ๋ฉด main.ymlยทsub.yml ๋‘˜๋กœ ๊ฐˆ๋ผ์ง€๋Š”๋ฐ, ์šฉ๋„๋ณ„๋กœ ๋ถ„๋ฆฌ๋˜๋‹ˆ ์˜คํžˆ๋ ค ๊ด€๋ฆฌ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค.

์‹คํ–‰ ๋ฐฉ๋ฒ• (์…ธ ๋ฒ„์ „)

1
2
3
4
mkdir -p ~/bin
vi ~/bin/tmux-work.sh
chmod +x ~/bin/tmux-work.sh
~/bin/tmux-work.sh

3. ๋งŒ์ ธ๋ณด๋Š” tmux ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ

๋„๊ตฌ๊ฐ€ ๊ฐ์‹ธ๋Š” ๋ช…๋ น๋“ค์„ ์ง์ ‘ ๋ฐ”๊ฟ” ๋ณด๋ฉด ์›๋ฆฌ๊ฐ€ ๋” ๋ถ™๋Š”๋‹ค.

โ— ์œˆ๋„์šฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ

1
2
3
tmux new-session -d -s "$MAIN_SESSION" -n "editor"
tmux new-window -t "$MAIN_SESSION" -n "api"
tmux new-window -t "$MAIN_SESSION" -n "ops"

โ— ํŒจ๋„ ์ด๋ฆ„(ํƒ€์ดํ‹€) ์ง€์ •

pane ์ž์ฒด์— โ€œ์ด๋ฆ„โ€์„ ๋ถ™์ด๋Š” ๊ฐœ๋…์€ ์—†๊ณ , ๋Œ€์‹  pane title์„ ์„ค์ •ํ•ด ํ‘œ์‹œํ•œ๋‹ค. ํ‘œ์‹œ ์œ„์น˜๋Š” pane-border-format์œผ๋กœ ์ œ์–ดํ•œ๋‹ค.

1
2
3
4
5
6
7
8
# pane title ์ง€์ •
tmux select-pane -t "$MAIN_SESSION":0.0 -T "editor"
tmux select-pane -t "$MAIN_SESSION":0.1 -T "logs"
tmux select-pane -t "$MAIN_SESSION":0.2 -T "shell"

# ํƒ€์ดํ‹€ ํ‘œ์‹œ(ํ•˜๋‹จ). ํ•„์š”ํ•˜๋ฉด .tmux.conf์— ๋„ฃ์–ด๋„ ๋จ
tmux set -g pane-border-status bottom
tmux set -g pane-border-format " #P: #T "

โ— ํŒจ๋„ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ (์ขŒ์šฐ 2๋ถ„ํ• )

1
tmux split-window -h -t "$MAIN_SESSION":0

โ— ํŠน์ • ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™

1
2
tmux send-keys -t "$MAIN_SESSION":0.0 "cd ~/project" C-m
tmux send-keys -t "$MAIN_SESSION":1 "cd ~/project" C-m

4. ์ฐธ๊ณ 

  • ์„ธ์…˜ ๋งค๋‹ˆ์ €๋Š” 2๋‹จ๊ณ„ TPM ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋‹ค๋ฅธ ์ถ•์ด๋‹ค. tmux ๋ฐ–์˜ ์™ธ๋ถ€ CLI์ด๊ณ , tmux-resurrect/continuum(๋–  ์žˆ๋˜ ์„ธ์…˜์„ ์ €์žฅโ†’๋ณต์›)๊ณผ๋„ ๋ชฉ์ ์ด ๋‹ค๋ฅด๋‹ค โ€” ์„ธ์…˜ ๋งค๋‹ˆ์ €๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ ์–ธโ†’์ƒ์„ฑํ•œ๋‹ค.
  • ์„ ์–ธํ˜• 3์ข…์€ ๋‹ค ์„ฑ์ˆ™๊ธฐ โ€” ์š”์ฆ˜ ๋ชจ๋ฉ˜ํ…€์€ ๋‹ค๋ฅธ ๋ฒ”์ฃผ๋‹ค. sesh ๊ฐ™์€ ์˜จ๋””๋งจ๋“œ ์„ธ์…˜ ์Šค์œ„์ฒ˜(fzfยทzoxide๋กœ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฆ‰์„ ์„ธ์…˜ ์ƒ์„ฑ)๋กœ ์‹ค๋ ฅ์ž๋“ค์ด ์˜ฎ๊ฒจ๊ฐ€๋Š” ์ค‘์ด๋‹ค โ€” ์ƒ์„ฑ 2.5๋…„์— โ˜…2.7k, ๋‚˜์ด ๋Œ€๋น„ ์„ฑ์žฅ๋ฅ ์ด ์ด ์…‹๋ณด๋‹ค ๋†’๋‹ค. ๊ณ ์ • ๋ ˆ์ด์•„์›ƒ์„ ์„ ์–ธํ•˜๋Š” ์ด ๊ธ€๊ณผ ๋ชฉ์ ์ด ๋‹ฌ๋ผ ์Šค์ฝ”ํ”„ ๋ฐ–์ด์ง€๋งŒ, ๋ฐฉํ–ฅ์€ ์•Œ์•„๋‘˜ ๊ฒƒ. โ†’ ์ด ํ”ผ์ปค ๋ฒ”์ฃผ์˜ ์„ค์น˜ยท๋ฐ”์ธ๋”ฉยท์‹ค์ „์€ sesh โ€” ์ฆ‰์„ tmux ์„ธ์…˜ ์ „ํ™˜์—์„œ ์ด์–ด์ง„๋‹ค.
  • tmux has-session์€ ์„ธ์…˜ ์กด์žฌ ์—ฌ๋ถ€๋งŒ ํ™•์ธํ•œ๋‹ค. ๋„๊ตฌ์˜ โ€œ์ด๋ฏธ ์žˆ์œผ๋ฉด attachโ€๊ฐ€ ์ด๊ฑธ ๋Œ€์‹ ํ•œ๋‹ค.
  • ์…ธ๋กœ ์ง์ ‘ ์งœ๋Š” ๊ฒŒ ์œ ์ผํ•ด์ง€๋Š” ๊ฑด ๋ฐ”์ด๋„ˆ๋ฆฌ ํ•˜๋‚˜๋„ ๋ชป ๊นŒ๋Š” ๊ทนํ•œ ํ™˜๊ฒฝ(๋ฝ๋‹ค์šด๋œ ์„œ๋ฒ„, ์ž„์‹œ ์ปจํ…Œ์ด๋„ˆ) ์ •๋„๋‹ค. ๊ทธ ์™ธ์—” ์„ธ์…˜ ๋งค๋‹ˆ์ €๊ฐ€ ์ƒ์œ„ํ˜ธํ™˜์ด๋‹ค.
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.