$ TERMはどのように、どこで解釈されますか?

$ TERMはどのように、どこで解釈されますか?

少し知りたいです。ターミナルマジック内部作業。

Dockerコンテナを使用している場合、$TERM環境変数は設定されません。これにより、vimやtmuxなどの奇妙に見えるコンソールアプリケーションが作成され、CTRL + l(画面の消去)も無視されました。

私はほぼすべて確信しています特徴一部の画面更新、色、画面リセットなどのコマンドは、すべてエスケープコードを使用して実装されています。

では、この変数はどこで解釈され、正しい値を設定したらCtrl + lを使用して端末画面をリセットできますか? WHO調査するたとえば、どの色がサポートされていますか(xterm対xterm-256color)?シェル? ncursesのようなアプリケーションやライブラリ?可能な値/端末タイプはどこで定義されていますか?

答え1

$TERMterminfoシステムによって読み取られ解釈されます。 terminfoはまた、ほとんどのシステムで見つけることができる端末記述データベースも参照します/usr/share/terminfo$TERMこのデータベースのエントリのいずれかと一致する必要があります。機能が少ないtermcapという古いライブラリもありますが、terminfoはそれを置き換えました。最新のシステムでは、terminfoはncursesライブラリの一部です。

アプリケーションは通常、ライブラリ機能を直接使用して端末機能を取得します。tigetstr()または、より高いレベルの Curses インターフェイスを使用して画面レイアウトを管理します。どちらも$TERMterminfoデータベースを参照します。

答え2

TERM各アプリケーションはシステムライブラリを介してこの変数を解釈します。その値はデータベースから照会された名前です。 Unixのバージョンとその期間に応じて、データベースは次のようになります。用語キャップ(伝統的な方法、現在は一般的に使用されていない方法)または用語情報(termcapが改善され、現在ほとんどのシステムで使用されているため、最新です。)

termcapデータベースとterminfoデータベースは両方とも関数名を値に関連付けます。関数は、端末が実行できるアクション(行数、アンダースコア機能など)の説明、または端末と交換できる文字列(テキストフォーマット、カーソル移動などのエスケープシーケンス)です。もう一つは、ファンクションキー方向エスケープシーケンスで表されます)。あなたは見ることができますman 5 termcapそしてman 5 terminfoシステムにどの機能が知られているかを確認してください。

たとえば、Ctrl+をL押して画面を再描画すると、ターミナルデータベースの機能を読み取ってカーソルを移動するために使用するエスケープシーケンスを見つけます。設定されていない、またはTERM誤って設定されている場合は、画面上でカーソルを移動する方法がわかりません。

あなたはそれを使用することができますtput注文するterminfo データベースから項目を検索します。たとえば、tput lines端末の行数を印刷します。tput clear画面を消去します(その出力が端末に印刷されるため)。そのエスケープシーケンスが何であるかを確認するには、読みやすい形式で印刷してくださいtput clear | cat -v

色数には歴史がかなりあり、正常に動作しません。端末エミュレータは、一部のアプリケーションがクラッシュするのを防ぐために、色数を少なく報告する傾向があります。バラよりtmux、TERM、256色のサポート特にtmuxの文脈でこれに関する詳細情報です。xterm-256colorsとの違いは、xterm前者はterminfoに256色を報告し、後者は伝統的な8色を報告することです。

答え3

TERM、通過習慣端末の説明を参照してください。もともとこれはaの一部と命名されました。用語キャップテキストファイル(1970年代後半以降)。 1980年代半ば、用語情報端末記述を取得する時間を節約するために、コンパイルされた(バイナリ)ファイルとして導入されました。どちらもすべてのUnixファミリープラットフォームで使用できますが、termcapは現在terminfoを使用したエミュレーションを除いてほとんど使用されません。

どちらのデータ型も、アプリケーションは通常、再利用可能なプログラミングライブラリを使用して端末データベースからデータを抽出します。 terminfoプログラミングライブラリは別々のライブラリファイルとして提供することができます(たとえば、オプションでncursesなど)、通常は高レベルのCursライブラリの一部です。 terminfoライブラリが別々に提供されているかどうかにかかわらず、そのような場合はcursesライブラリの一部と見なされます。 (スラングなどの他の高度なライブラリもあります)。

各端末の端末データベース項目に能力。これは、Cursライブラリ(またはtermcap / terminfoを直接使用するアプリケーション)に画面を消去するなどの便利なタスクを実行する方法を教えてくれます。ほとんどの端末では、これはエスケープシーケンスです。一部の端末は、この目的のためにエスケープシーケンスをサポートしていない場合があります。 Cursesライブラリは、画面を消去する(たとえば、各行を消去する)機能と組み合わせることもできます。すべての関数がエスケープシーケンスであるわけではありません。持つブール値そして数字たとえば、次のように話すことができます。~に関係なく機能をサポートし、数歳何か(画面サイズなど)。

termcap / terminfoを使用するすべてのアプリケーションは、そのライブラリを使用して端末記述を取得し、引数を特定の関数に置き換えるなどの操作を実行します。例えば、ほとんどの端末は、現在の位置で所与の数の列または行だけカーソルを移動する機能を提供する。tparm(または)tiparm数値を実際のエスケープシーケンスを取得する機能に置き換える関数。

cursesライブラリには、ターミナルデータベースを維持するコマンドラインアプリケーションがあります(チック情報CMP)とターミナルデータベースを照会したり、ターミナル機能を使用して低レベルの操作を実行するためにシェルスクリプトで使用されるいくつかのコマンド(出力tセット/リセット)。

持つフレームに縛られないTERM端末データベースを使用せずに使用されるアプリケーションです。ほとんどは独自の動作(GNU grep、groff、link/links2/elinks テキスト Web ブラウザなど)をハードコードします。珍しい独自のターミナルデータベース(例:GNU ls)と同じですが、他の規則と動作を使用してください。

質問に戻って:

  • では、この変数はどこで解釈され、正しい値を設定したらCtrl + lを使用して端末画面をリセットできますか?

    アプリそしてデフォルトライブラリはこの値を解釈します。 Bashの場合、controlLreadlineライブラリでこれを行うことができます(termcapプログラミングインタフェースを使用)。

  • たとえば、サポートされている色(xterm対xterm-256color)は誰が確認できますか?

    端末データベースには、色数を機能として保存し、前景色と背景色を設定し、色をリセットする機能も保存します。一部のアプリケーションは、これらの機能を開発者の「xterm本当に」主張などの追加情報と組み合わせます。xterm-256color

  • シェル?

    ほとんどのシェルは、ターミナル情報を取得するためにtermcapプログラミングインターフェースを使用します。ただし、これは独自の動作を持つアプリケーションです(必ずしも呪いと同じである必要はありません)。

  • ncursesのようなアプリケーションやライブラリ?

    (上記参照:シェルは特定の種類のアプリケーションです)

  • 可能な値/端末タイプはどこで定義されていますか?

    通常、これは、呪いライブラリまたはスラングライブラリを使用するアプリケーションが共有するターミナルデータベースにあります。一部のアプリケーションはハードコーディングされているか、プライベートデータベースを使用しています。

追加資料:

関連情報