TTY
Teletypewriter
元々はテレタイプ端末を指す言葉
現在はターミナルデバイス全般の抽象概念として使われる
「TTY」は文脈で意味が変わる
table:_
文脈 意味
歴史的 物理的なテレタイプ端末
デバイスファイル /dev/tty* — カーネルが提供する端末インターフェース
tty コマンド 今自分が接続している端末デバイスのパスを返す
「TTYドライバ」 カーネル内の端末I/O処理層 (line discipline)
概念として 「端末」全般を漠然と指す
元々は1つの物理装置を指す言葉だったが、その装置が担っていた機能がソフトウェアに分解された結果、名前だけが各所に残った。
#wip
普通にコマンドを実行した時、stdoutはTTYに繋がっている
ので、ターミナルの画面に結果が表示される
(まともな) CLIツールは、stdoutがTTYかどうかを判定して結果を出し分ける
判定方法
$ tty
または
code:bash
-t 1 && echo "TTYです"
-t 1 は「標準出力がTTYか?」を意味する。
例えば、git logを見た時
普通にgit logを実行すると、stdoutはTTYなので、
内部で自動的にlessコマンドを使ったり、
色をつけたりする
ANSIカラーコード
|を使ったりして実行すると、stdoutはTTYではなくpipeになるので
lessは不要
制御コードが混ざるため色は不要
という風に出力を出し分ける
レイヤ
code:_
ユーザー入力 (キーボード)
↓
① ターミナルエミュレータ ← 「画面の描画」と「キー入力の受付」担当
↓ 物理端末の代替。フォントレンダリング、
↓ スクロール、ウィンドウ管理など
↓
② PTY master ← カーネルとの接続口。
↓ エミュレータは普通のユーザプロセスなので、
↓ カーネル側に入口が必要
↓
③ line discipline ← 「行編集」と「シグナル変換」担当
↓ Ctrl+C → SIGINT、Backspaceの処理、エコーなど。
↓ 全アプリが個別に実装せずに済むように
↓ カーネルが共通処理として提供
↓
④ PTY slave ← シェルから見た「端末デバイス」
↓ /dev/pts/N というファイルとして見える。
↓ isatty() がtrueを返す。
↓ シェルやアプリはこれが本物の端末だと思っている
↓
⑤ シェル / アプリ