Terminal

Un terminal.host ejecuta scripts Lua con streams de entrada, salida y error estándar. Esta página es una referencia de configuración; el bloque Lua es un fragmento de handler que presupone que se ejecuta mediante ese host.

Un host de terminal ejecuta exactamente un proceso a la vez. El proceso en sí es un proceso Lua regular con acceso al contexto de I/O del terminal.

Tipo de Entrada

Tipo Descripción
terminal.host Host de sesión de terminal

Configuración

- name: cli_host
  kind: terminal.host
  hide_logs: false
  lifecycle:
    auto_start: true
Campo Tipo Por Defecto Descripción
hide_logs bool false Transmitir logs al bus de eventos y suprimir su propagación downstream

Contexto del Terminal

Los scripts ejecutándose en un host de terminal reciben un contexto de terminal con:

  • stdin - Lector de entrada estándar
  • stdout - Escritor de salida estándar
  • stderr - Escritor de error estándar
  • args - Argumentos de línea de comandos

Terminales Componibles

El terminal que ve un proceso es un puerto, no un dispositivo. Eso hace que la propiedad del terminal sea componible.

Un proceso en un terminal host posee el puerto físico. Llama a tty.surface() para tomar el lease de presentación del puerto y publica frames completos — es dueño de toda la pantalla.

Un proceso shell aloja otros procesos creando terminales virtuales con tty.viewport(). Pasa viewport:grant() a un hijo a través de la opción de spawn terminal; el hijo resuelve esa concesión en un puerto de terminal ordinario y se ejecuta sin cambios, ignorando que no está conectado a un dispositivo. El shell lee los frames del hijo con viewport:snapshot(), los coloca en cualquier lugar de su propio layout, y traduce la entrada a las coordenadas del hijo con 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"))

Una concesión es de un solo uso: la admisión del proceso la consume, un inicio rechazado la deja sin resolver, y un host que no puede asociar terminales rechaza el spawn en lugar de descartar la opción.

Los programas orientados a bytes se integran en el mismo modelo a través de exec. Un hijo asigna un proceso PTY y llama a process:attach_terminal(); ese adaptador es dueño de la emulación de PTY, la codificación de entrada, el redimensionado y la terminación, y presenta sobre el puerto que el hijo posea — físico o virtual.

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

API Lua

El Módulo IO proporciona operaciones de terminal orientadas a líneas:

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 e io.readline devuelven errores fuera de un contexto de terminal. io.args() devuelve una tabla vacía cuando no hay disponible un contexto de terminal.

Para eventos de entrada en bruto, renderizado estilizado, superficies y viewports, consulte TTY. Para procesos PTY y sesiones de terminal, consulte Ejecución de Comandos.

Ver También