Terminal
Um terminal.host executa scripts Lua com os streams padrão de entrada, saída e erro. Esta página é uma referência de configuração; o bloco Lua é um fragmento de handler que pressupõe execução por esse host.
Tipo de Entrada
| Tipo | Descrição |
|---|---|
terminal.host |
Host de sessão de terminal |
Configuração
- name: cli_host
kind: terminal.host
hide_logs: false
lifecycle:
auto_start: true
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
hide_logs |
bool | false | Envia logs ao event bus enquanto suprime a propagação posterior desses logs |
Contexto de Terminal
Scripts executando em um host de terminal recebem um contexto de terminal com:
- stdin - Leitor de entrada padrão
- stdout - Escritor de saída padrão
- stderr - Escritor de erro padrão
- args - Argumentos de linha de comando
Terminais Componíveis
O terminal que um processo enxerga é uma porta, não um dispositivo. Isso torna a posse do terminal componível.
Um processo em um host de terminal detém a porta física. Ele chama tty.surface() para tomar o lease de apresentação da porta e publica frames completos — ele é dono da tela inteira.
Um processo shell hospeda outros processos criando terminais virtuais com tty.viewport(). Ele passa viewport:grant() a um processo filho através da opção de spawn terminal; o filho resolve essa concessão em uma porta de terminal comum e executa sem alterações, sem saber que não está conectado a um dispositivo. O shell lê os frames do filho com viewport:snapshot(), os posiciona em qualquer lugar do seu próprio layout, e traduz a entrada para as coordenadas do filho com 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"))
Uma concessão é de uso único: a admissão do processo a consome, um start rejeitado a deixa não resolvida, e um host que não pode anexar terminais rejeita o spawn em vez de descartar a opção.
Programas orientados a bytes entram no mesmo modelo através de exec. Um processo filho aloca um processo PTY e chama process:attach_terminal(); esse adaptador é dono da emulação de PTY, codificação de entrada, redimensionamento e término, e apresenta na porta que o filho detiver — física ou virtual.
physical terminal -> shell surface -> viewport -> child process -> PTY proxy
API Lua
O Módulo IO fornece operações de terminal orientadas a linha:
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 retornam erros fora de um contexto de terminal. io.args() retorna uma tabela vazia quando não há contexto de terminal disponível.
Para eventos de entrada raw, renderização estilizada, surfaces e viewports, veja TTY. Para processos PTY e sessões de terminal, veja Execução de Comandos.
Veja Também
- Terminal I/O — Operações stdin/stdout/stderr
- TTY — Eventos de entrada, surfaces, canvases e viewports
- Execução de Comandos — Processos PTY e sessões de terminal
- UI de Terminal — construa um shell que hospeda um filho em um viewport