ターミナル
terminal.host は、標準入力、標準出力、標準エラー出力のストリームを使用して Lua スクリプトを実行します。このページは設定リファレンスです。Lua ブロックは、そのホストを通じて実行されることを前提としたハンドラーの断片です。
エントリ種別
| 種別 | 説明 |
|---|---|
terminal.host |
ターミナルセッションホスト |
設定
- name: cli_host
kind: terminal.host
hide_logs: false
lifecycle:
auto_start: true
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
hide_logs |
bool | false | イベントバスにログをストリーミングしながら、下流へのログ伝播を抑制 |
ターミナルコンテキスト
ターミナルホストで実行されるスクリプトは、次の値を持つターミナルコンテキストを受け取ります。
- stdin — 標準入力リーダー
- stdout — 標準出力ライター
- stderr — 標準エラー出力ライター
- args — コマンドライン引数
合成可能なターミナル
プロセスから見えるターミナルはデバイスではなくポートです。これによりターミナルの所有権を合成できます。
ターミナルホスト上のプロセスは物理ポートを保持します。tty.surface()を呼び出してポートのプレゼンテーションリースを取得し、完成したフレームを公開します — 画面全体を所有します。
シェルプロセスはtty.viewport()で仮想ターミナルを作成して他のプロセスをホストします。viewport:grant()をterminalスポーンオプションで子プロセスに渡すと、子プロセスはそのグラントを通常のターミナルポートとして解決し、デバイスに接続されていないことを意識せずそのまま動作します。シェルは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"))
グラントはワンショットです。プロセスのアドミッションがこれを消費し、起動が拒否された場合は未解決のまま残り、ターミナルをアタッチできないホストはオプションを黙って破棄するのではなくスポーンを拒否します。
バイト指向のプログラムは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 は、ターミナルコンテキスト外ではエラーを返します。io.args() は、ターミナルコンテキストを利用できない場合に空のテーブルを返します。
生の入力イベント、スタイル付きレンダリング、サーフェス、ビューポートについてはTTYを参照してください。PTYプロセスとターミナルセッションについてはコマンド実行を参照してください。
関連項目
- Terminal I/O — stdin/stdout/stderr操作
- TTY — 入力イベント、サーフェス、キャンバス、ビューポート
- コマンド実行 — PTYプロセスとターミナルセッション
- ターミナルUI — ビューポートで子プロセスをホストするシェルを構築する