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.
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
- Terminal I/O — Operaciones stdin/stdout/stderr
- TTY — Eventos de entrada, superficies, canvases y viewports
- Ejecución de Comandos — Procesos PTY y sesiones de terminal
- UI de Terminal — construya un shell que aloje un hijo en un viewport