私が理解したところ、pty(マスター/スレーブペア)を生成するアプリケーションは2つのカテゴリに分けられます。
- グラフィック出力を生成するという端末エミュレータ(
xterm
, , ...)urxvt
- 残り(、、、、
docker
… )はテキスト出力を生成するとします。ssh
tmux
screen
これは、電子がグラフィックディスプレイにある程度描画する必要があることを意味する。後者は前者のテキスト出力(オプションでエスケープシーケンスを含む)を生成します。あなたが得る必要があるのは、一連の端末エミュレータです(例:xterm
<-> ssh
<-> tmux
<-> docker
)。チェーンのさまざまな部分は、エスケープシーケンスをある言語から別の言語に変換します。あるいは、より正確にはエスケープシーケンスを処理し、terminfo
データベースを使用してそれを次の端末エミュレータに変換します。
下の写真はソースです「TTY公開」次も順番にあります。
それでは、その原因は何ですかxterm
xterm
?エスケープシーケンスを処理しますかxterm
、それともカーネルにアクションを実行させますか?つまり、xterm
terminfo
データベースエントリは...カーネルに対応していますか、それともxterm
?まあ、そう言うと答えははっきりしているようです。カーネルがterminfo
どのようにしてデータベースエントリに影響を与えるかはまだわかりません。
他のプログラムはどうですか? ptyを生成すると、エスケープシーケンスを処理しない空の端末が提供され、これらの処理を追加する責任がありますか?これは、あなたが扱っているエスケープシーケンスがTERM
反対側の変数値を決定することを意味しますか?ここで何か抜けましたか?
この質問は以下からインスピレーションを得ました。以下の回答、著者はこのTERM
値が重要ではないと主張します。
答え1
画像が正しいです。カーネルは(少なくともこの質問の文脈で)次のことを行います。いいえ端末エミュレータとして機能します。ライン規律を扱い、ライン規律が何を意味するのかを理解するために、リファレンスstty(1)
とマニュアルを扱います。termios(3)
これには、CR-LF変換、^C
(割り込み)処理、いくつかの最小限の行編集機能(^W
実行するコマンドにcat
独自の行編集機能がない場合はバックスペースキー処理を実装する「料理」モードと呼ばれる)が含まれており、転送のみ可能です。 Enterキーを押すと、行全体)、制御フロー、シリアルポート属性(ほとんど使用されていません)などが、\e
エスケープ文字は処理されません。
Linux カーネルは、イメージの「xterm」ノードに似た端末エミュレータを実装します。vt
コンポーネントではなく、Linuxカーネルのコンポーネントである仮想コンソール(通常はCtrl + Alt + F1など)ですtty
。質問に関する限り、これは無関係であり、あなたの質問はLinuxに限定されず、これに関して他のUnixのバリエーションに精通していません。
エスケープシーケンスを処理しますか
xterm
、それともカーネルにアクションを実行させますか?
これはxterm
。過度に単純化されたストーリー:xtermが起動すると、ttyライン(マスターとスレーブ)を設定し、そのttyに接続されているコマンドを起動します(通常はシェル、正しく設定されているTERM
場合は図の「ユーザープロセス」)、次のグラフィックウィンドウが表示されます。します。カーソルを左上に置きます。その後、双方向で通信します。
キーを押すと、矢印で示された順序で送信されます。行の規則によっては、カーネルはそれ自体を処理できます(たとえば、実行中でcat
文字「x」を押すと送信されませんでした。cat
デフォルトの行編集を処理するのはカーネルです)。この場合、カーネルは次のように通知します。端末はディスプレイを更新したり(おそらく「x」を印刷したり)、関連するユーザープロセスにキーストロークを渡すことができます。
他の方向では、ユーザープロセスがディスプレイを更新したくない場合や望ましくない場合があります(受信したキーを押しても関係なくこれを実行したい場合があります)、データは反対方向のパスを通過します。
アプリケーションが.lineにx\e[31my\n
変換される.lineルールを出力します(それ以外の場合は「階段効果」が発生します)、文字を気にしないので、端末エミュレータは。\n
\r\n
\e
x\e[31my\r\n
xterm
x
このメッセージを受け取り、次のように言いました。カーソルにanを印刷する必要があります。これは、赤に切り替えてから(赤)を印刷してから、カーソルを1行前後に移動する必要があることを意味し\e[31m
ます。y
そうし、それに応じてディスプレイを更新します。
つまり、
xterm
terminfo
データベースエントリは...カーネルに対応していますか、それともxterm
?
用語情報説明するユーザーアプリケーションに対するさまざまなターミナルエミュレータの動作(すべてのターミナルエミュレータがエスケープシーケンスを少し異なる方法で処理するため)、カーネルはこれについて何も知りません。
カーネルとterminfoが何を言っているのかは少し重複していますが(たとえば、terminfoにはバックスペース文字(または^H
)のエントリを含めることができますが、^?
この動作はターミナルエミュレータではなく行規則で実装されています。)ターミナルエミュレータはターミナルエミュレータ自体でなくても有効になるようにターミナルエミュレータの動作を説明しますが、これをカーネルのラインルールに委任するという意味で、それに応じてラインルールを構成しなければなりません。動作を説明する用語情報です。
疑似端末を生成するプログラムは端末をシミュレートしますか?
いいえ、必ずしもそうではありません。ターミナルラインを生成するためのアプリケーションを次のように分類します。
- ターミナルエミュレータ(
xterm
、、、、、... )urxvt
screen
tmux
- ターミナルエミュレータではない(
ssh
(対話式または-t
提供されている場合)、、、script
...luit
)
私はそれに慣れていませんが、docker
2番目のグループに属すると思います。
2番目のグループには、デフォルトでtty行を作成する必要がありますが、エスケープシーケンスに関連しないデータを渡したり、記録したり、単に操作するためにのみ必要なアプリケーションが含まれています。これらのアプリケーションは\e
それが何を意味するのか、赤が何を意味するのかわからず、\e[31m
「赤」が何を意味するのかさえ知らず、与えられた瞬間にターミナルのキャンバスがどんな姿でなければならないのかもしれません。
最初のグループは、これらのエスケープシーケンスに注意を払う必要があるアプリケーションです。最初は驚くscreen
かもしれませんが、tmux
これらのアプリが盲目的にデータを配信して動作を達成する可能性はまったくありません。タブを再接続したりタブを切り替えたりするとキャンバスを復元したり、同時に複数の端末のウィンドウレイアウトを処理したりすることはできません。 。これらのツールは各エスケープシーケンスを解析し、完全に理解し、キャンバスがどのように見えるかを正確にメモリに追跡する必要があります。
私はWindowsscreen
とtmux
Windowsをターミナルエミュレータとして考えることを好みます。 WindowsとFriendsとの主な違いxterm
は、ユーザーにコンテンツを提供するキャンバスであるバックエンドがウィンドウのピクセルではなく、別のターミナルエミュレータの文字グリッドであることです。 GUI。 (他の主な違いは分離と再接続機能ですが、ここでは関係ありません。)
これらすべてが理解されることを願っています。