web-dev-qa-db-ja.com

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

terminal magicが内部でどのように機能するのか疑問に思っています。

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

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

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

8
muffel

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

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

7
Celada

TERM変数は、システムライブラリを介して、各アプリケーションによって解釈されます。その値は、データベースで検索される名前です。 Unixのフレーバーとその古さに応じて、データベースは termcap (伝統的なもので、最近はあまり使用されていません)または terminfo (最新のものであり、改良を意図したものです) termcapで、今日ほとんどのシステムで使用されています)。

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

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

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

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

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

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

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

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

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

端末データベースを使用せずにTERMを使用する型破りなアプリケーションがあります。これらのほとんどは単に動作をハードコードします(GNU grep、groff、and links/links2/elinks textual web browsers)など)、一方few独自の端末データベース(GNU lsなど)に相当するものを持っていますが、異なるルールと動作を使用しています。

質問に戻る:

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

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

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

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

  • シェル?

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

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

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

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

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

参考文献:

2
Thomas Dickey