터미널

terminal.host는 표준 입력, 출력 및 오류 stream에 접근할 수 있는 Lua script를 실행합니다. 이 페이지는 설정 레퍼런스이며 Lua 블록은 해당 host에서 실행된다고 가정하는 handler fragment입니다.

터미널 호스트는 한 번에 정확히 하나의 프로세스만 실행합니다. 프로세스 자체는 터미널 I/O 컨텍스트에 접근할 수 있는 일반 Lua 프로세스입니다.

엔트리 종류

종류 설명
terminal.host 터미널 세션 호스트

설정

- name: cli_host
  kind: terminal.host
  hide_logs: false
  lifecycle:
    auto_start: true
필드 타입 기본값 설명
hide_logs bool false downstream log propagation을 억제하면서 event bus로 log stream

터미널 컨텍스트

터미널 호스트에서 실행되는 스크립트는 다음을 포함한 터미널 컨텍스트를 받습니다:

  • stdin - 표준 입력 리더
  • stdout - 표준 출력 라이터
  • stderr - 표준 에러 라이터
  • args - 커맨드라인 인자

조합 가능한 터미널

프로세스가 보는 터미널은 장치가 아니라 포트입니다. 덕분에 터미널 소유권을 조합할 수 있습니다.

터미널 호스트의 프로세스는 물리 포트를 보유합니다. tty.surface()를 호출해 포트의 표시 리스를 가져오고 완성된 프레임을 발행합니다 — 화면 전체를 소유합니다.

셸 프로세스는 tty.viewport()로 가상 터미널을 만들어 다른 프로세스를 호스팅합니다. terminal 스폰 옵션을 통해 viewport:grant()를 자식에게 전달하면; 자식은 그 grant를 일반 터미널 포트로 해석하고, 장치에 연결되어 있지 않다는 사실을 모른 채 변경 없이 실행됩니다. 셸은 viewport:snapshot()으로 자식의 프레임을 읽어 자신의 레이아웃 어디에든 배치하고, viewport:send()로 입력을 자식의 좌표로 변환합니다.

local view = assert(tty.viewport({width = 78, height = 20}))
local child = assert(process.with_options({terminal = assert(view:grant())})
    :spawn_monitored("app:child", "app:workers"))

grant는 일회성입니다: 프로세스 승인이 이를 소비하고, 시작이 거부되면 해석되지 않은 채 남으며, 터미널을 연결할 수 없는 호스트는 옵션을 무시하는 대신 스폰을 거부합니다.

바이트 지향 프로그램은 exec를 통해 동일한 모델에 합류합니다. 자식이 PTY 프로세스를 할당하고 process:attach_terminal()을 호출하면; 그 어댑터가 PTY 에뮬레이션, 입력 인코딩, 크기 조정, 종료를 소유하고 자식이 보유한 포트가 물리든 가상이든 그 포트에 표시합니다.

physical terminal -> shell surface -> viewport -> child process -> PTY proxy

Lua API

IO 모듈은 라인 지향 터미널 작업을 제공합니다:

local io = require("io")

local _, write_err = io.write("Enter name: ")
if write_err then return nil, write_err end

local name, read_err = io.readline()
if read_err then return nil, read_err end

local _, print_err = io.print("Hello, " .. name)
if print_err then return nil, print_err end

local args = io.args()

io.write, io.print, io.readline은 terminal context 밖에서 오류를 반환합니다. terminal context가 없으면 io.args()는 빈 table을 반환합니다.

원시 입력 이벤트, 스타일이 적용된 렌더링, 서피스, 뷰포트는 TTY를 참조하세요. PTY 프로세스와 터미널 세션은 명령 실행을 참조하세요.

참고

  • Terminal I/O — stdin/stdout/stderr 작업
  • TTY — 입력 이벤트, 서피스, 캔버스, 뷰포트
  • 명령 실행 — PTY 프로세스와 터미널 세션
  • 터미널 UI — 뷰포트에서 자식을 호스팅하는 셸 만들기