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


9

ターミナルマジックが内部でどのように機能するのかと思います。

Dockerコンテナーで遊んでいるときに、環境変数$TERMが設定されていませんでした。これにより、vimやtmuxなどの奇妙に見えるコンソールアプリケーションだけでなく、CTRL + l(画面のクリア)も無視されました。

部分的な画面の更新、色、画面のリセットなどのコマンドなどのすべての機能がエスケープコードを使用して実現されていると確信していますよね?

それで、この変数はどこで解釈され、たとえば、適切な値をそこに設定した場合、CTRL + lを使用して端末画面をリセットすることができますか?サポートされている色(xtermとxterm-256colorなど)を確認するのは誰ですか?シェル?アプリケーションまたはncursesのようなライブラリ?そして、可能な値/ターミナルタイプはどこに定義されていますか?

回答:


8

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

アプリケーションは通常、ライブラリ機能を使用して端末機能を直接フェッチするかtigetstr()、画面のレイアウトを管理するために高レベルのcursesインターフェイスを使用します。どちらにしても$TERM、terminfoデータベースが参照されます。


5

TERM変数は、システム・ライブラリを介して、各アプリケーションによって解釈されます。その値は、データベースで検索される名前です。Unixのフレーバーとその時代に応じて、データベースはtermcap(従来の、最近はあまり使用されていません)またはterminfo(現代、termcapの改善として意図されており、現在ほとんどのシステムで使用されているため)のいずれかになります。

termcapデータベースとterminfoデータベースの両方で、機能名を値に関連付けます。機能は、端末が実行できること(行数、下線など)の説明、または端末と交換できる文字列(エスケープシーケンスによるテキストのフォーマット、カーソルの移動など)、およびその他の機能です。ファンクションキーによって送信される方向エスケープシーケンス)。システムで認識されている機能を確認man 5 termcapman 5 terminfoて確認できます。

たとえば、Ctrl+ Lを押して画面を再描画すると、端末データベースの機能が読み取られ、カーソルを移動するために使用する必要のあるエスケープシーケンスが検出されます。TERMが設定されていないか、正しく設定されていない場合、画面にはカーソルを移動する方法がわかりません。

tputコマンドを使用して、terminfoデータベースのエントリを取得できます。たとえばtput lines、端末の行数を出力します。tput clear画面をクリアします(出力が端末に出力されるため)。対応するエスケープシーケンスを確認するには、それを読み取り可能な形式で出力しtput clear | cat -vます。

色の数にはかなりの歴史があり、権利によって正常に機能しません。ターミナルエミュレータは、一部のアプリケーションの破損を避けるために、色の数を過小報告する傾向があります。この詳細については、特にtmuxのコンテキストで、tmux、TERM、および256色のサポートを参照してください。差xterm-256colorsとは、xterm前者レポートterminfoの256色伝統的な8後者レポートながらということです。


2

TERM慣例により端末の説明を指します。当初、これはtermcapテキストファイルのセクションに名前を付けました(1970年代後半に開始)。1980年代半ば、terminfoはコンパイルされた(バイナリ)ファイルとして導入され、端末の説明を取得する際の時間を節約しました。どちらもすべてのUnixライクなプラットフォームで使用できますが、terminfoを使用したエミュレーションを除いて、termcapは現在ほとんど使用されていません。

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

各ターミナルのターミナルデータベースエントリには、機能と呼ばれるプロパティが含まれています。それらはcursesライブラリー(または直接termcap / terminfoを使用するアプリケーション)に、画面をクリアするなどの便利な操作を行う方法を伝えます。ほとんどの端末ではエスケープシーケンスです。一部の端末では、この目的でエスケープシーケンスをサポートしていない場合があります。画面をクリアするためにcursesライブラリによって組み合わせることができる他の機能があります(各行をクリアするなど)。すべての機能がエスケープシーケンスであるとは限りません。ありブール番号機能が伝えるために、例えば、同様かどうかの機能がサポートされ、そしてどのように大規模なものは、(画面サイズなど)です。

termcap / terminfoを使用する各アプリケーションは、対応するライブラリを使用して端末の説明を取得し、特定の機能にパラメーターを代入するなどの操作を実行します。たとえば、ほとんどの端末は、現在の位置から指定された数の列または行だけカーソルを移動する機能を提供します。tparm(またはtiparm)関数は、実際のエスケープシーケンスを取得するために能力に数値を代入します。

cursesライブラリには、ターミナルデータベースを維持するコマンドラインアプリケーション(ticinfocmp)と、ターミナルデータベースにクエリを実行するか、ターミナル機能で低レベルの操作を実行するためのシェルスクリプトで使用されるコマンドラインアプリケーション(tputtset / reset)があります。

端末データベースを使用せずに使用する従来と異なるアプリケーションがありTERMます。これらのほとんどは単にその動作(GNU grep、groff、links / links2 / elinksテキストWebブラウザーなど)をハードコーディングしますが、いくつかは独自のターミナルデータベース(GNU lsなど)に相当するものもありますが、異なるルールと動作。

質問に戻る:

  • では、この変数はどこで解釈され、たとえば、正しい値を設定した場合にCTRL + lを使用して端末画面をリセットできるようにしますか?

    アプリケーション基になるライブラリがこの値を解釈します。の場合controlL、それはreadlineライブラリ(termcapプログラミングインターフェースを使用)のbashで実行できます。

  • サポートされている色(xtermとxterm-256colorなど)を確認するのは誰ですか?

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

  • シェル?

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

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

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

  • そして、可能な値/ターミナルタイプはどこに定義されていますか?

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

参考文献:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.