본문 바로가기
C.W.K.
Lesson 01 of 04 · published

프로그램 둘이랑 바이트 스트림

~12 min · seam, iterm, tmux, pty, ownership

Level 0불씨
0 XP0/48 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"smolder 만으로도 iterm을 쓸 이유가 없어야 해." — 아빠

내가 소유하지 않은 일일 드라이버

살면서 쓰는 터미널은 텍스트 뷰가 아니야. 탭, 분할, 검색하는 스크롤백, 점심 먹고 돌아와도 살아 있을 세션. 이 가족에선 다른 앱이 너인 척하지 않고도 폴더나 자리를 여는 길도 있어. 몇 년 동안 그 일일 드라이버는 iTerm 이었고, 한 창에 일이 둘 이상이면 판이랑 픽셀 사이에 tmux 가 앉았어.

멀리서 보면 그 짝은 완전해 보여. iTerm 이 그리고, tmux 가 나누고, 셸이 돌아. 분할도 되고 떨어졌다 다시 붙기도 해. 문제는 그중 하나가 나빠서가 아니야. 문제는 이음새야. 내가 소유하지 않은 프로그램 둘이 직렬화된 스트림으로 말해. 평소엔 화면 스트림이고, tmux 의 control mode 에선 판 출력과 명령 스트림이야. 가족이 필요한 건 전부 그 스트림의 잘못된 쪽에 앉아 있어.

이음새가 실제로 받아 가는 값

네이티브 앱에게 판은 객체야. 옮기고, 프로세스를 붙이고, 전경에 뭐가 있는지 묻고, 선택을 셀 사각형이 아니라 텍스트로 복사해. tmux 에게 판은 tmux 자신의 서버 안에 살고, tmux 자신의 프로토콜을 거쳐 유리에 닿아. 평소엔 그 프로토콜이 셀로 된 화면이라서 선택은 파서가 돼. tmux 의 control mode 는 더 나아. iTerm2 에 판 ID, 판마다의 출력, 명령 통로를 넘겨 주고, iTerm2 는 tmux 판을 자기 네이티브 분할로 그려. 그래도 파싱하는 곳이 옮겨 갈 뿐이야. 판은 여전히 가족이 소유하지 않은 프로그램 안의 객체고, 복원은 여전히 그 서버가 아직 뭘 들고 있느냐는 질문이야. 새 분할에 폴더를 열고 싶은 형제는 세 번째 프로그램을 거쳐 tmux 의 명령어로 말하거나, 사람인 척 타이핑해야 해.

손을 다시 iTerm 으로 보낸 마찰은 전부 이 모양이었지. 한 창에 하네스 네 개가 느려졌는데, 프로세스에서 픽셀로 가는 길이 여기서 계측할 수 없는 멀티플렉서를 건너서 원인을 못 쟀어. 네이티브 파일 앱이 터미널에 폴더를 열고 싶은데 Launch Services 로 가야 했고, 그건 앱은 알아도 판은 몰라. 대회 엔진이 탭 하나에 자리 넷을 원했는데 창 넷이 뜨거나, 심판이랑 저자를 구별 못 하는 tmux 배치가 됐어.

경계에 이름을 붙여

Smolder 의 대답은 "우리 집 iTerm"이 아니야. "판 경계를 소유한다"야. 판마다 PTY 스트림 하나, 그 스트림을 픽셀로 바꾸는 임베드된 에뮬레이터, 네이티브 배치와 선택, 프로세스를 실제로 소유하는 데몬으로의 사설 부착. 바깥 멀티플렉서가 로컬 판을 합성하지 않아. 먼 호스트의 원격 tmux 는 나중의, 다른 문장이야. 로컬 창을 남의 화면 프로토콜로 감싸도 된다는 허가가 아니야.

이음새는 빠진 기능이 아니야. 잘못된 자리에 그어진 소유 선이야. iTerm 에 설정을 더하거나 tmux 에 플러그인을 더해도 선은 그대로야. 가족에게 필요했던 건 가족이 소유한 네이티브 객체로서의 판이었어. control mode 로 iTerm 이 네이티브처럼 보이는 분할을 그릴 수는 있어도, 그 판은 여전히 tmux 와 iTerm 의 것이야. 판을 소유하려면 로컬 경로에서 멀티플렉서를 빼야 했어.

Code

이음새, 그리고 소유한 길·text
# THE SEAM — two programs you do not own

  shell  ->  PTY  ->  tmux  ->  serialized stream  ->  iTerm  ->  pixels
           (a screen in ordinary use; pane output and commands in control mode)
                         ^
                         |
              every family need fights this stream:
              selection, restore, sibling open, seat identity

# OWNED PATH — one stream per pane

  shell  ->  PTY  ->  daemon attachment  ->  embedded emulator  ->  pixels
                         ^                      ^
                         |                      |
                    process owner          native pane object

# Local panes are never wrapped in tmux.
# A far host may still run tmux until remote daemons exist.
# That is a different sentence, not a loophole.

External links

Exercise

명령 치기가 아닌, 터미널에서 매일 하는 일 하나를 골라. 선택 복사, 판 나누기, 어제 배치 다시 열기, 다른 앱더러 여기 폴더 열라고 하기. 그 행위가 가족이 소유한 네이티브 객체를 원하는지, 남의 프로그램이 묘사하는 스트림이면 되는지 한 문장으로 써. 객체를 원하면, 프로세스랑 픽셀 사이에 멀티플렉서가 앉을 때 뭐가 깨지는지 두 번째 문장으로 써.
Hint
셀을 파싱하거나 남의 프로그램 명령 프로토콜로 말해야 하면, 객체를 원한 거야. 스크린샷이면 충분했으면 스트림으로도 됐을 거고. 가족 마찰 거의 전부가 스크린샷이 아니었어.

Progress

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

댓글 0

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

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