回答:
$TERM
ためですか?この$TERM
変数は、アプリケーションがその端末の機能を利用するために使用します。
たとえば、プログラムが色付きテキストを表示したい場合、使用している端末が色付きテキストをサポートしているかどうかを最初に確認し、サポートしている場合は色付きテキストの実行方法を確認する必要があります。
これが機能する方法は、システムが既知の端末とその機能のライブラリを保持することです。ほとんどのシステムではこれがあります/usr/share/terminfo
(termcapもありますが、これ以上使用されないレガシーです)。
したがって、赤いテキストを表示したいプログラムがあるとしましょう。基本的に、「xterm端末用の赤いテキスト用に送信する必要があるバイトシーケンスを教えてください」というterminfoライブラリを呼び出します。次に、それらのバイトを取得して出力します。
これを自分で試すことができますtput setf 4; echo hi
。これにより、setf
terminfo機能が取得され、4
必要な色であるのパラメーターが渡されます。
さて、リリースされたばかりの新しい端末エミュレーターがあり、システムのterminfoライブラリーにはまだ定義がないとしましょう。アプリケーションが何かを行う方法を調べようとすると、端末が不明なために失敗します。
端末がこれを回避する方法は、それがだれであるかについて嘘をつくことです。あなたのgnome端末は「I'm xterm」と言っています。
XtermはX11のd明期から存在していた非常に基本的な端末であるため、ほとんどの端末エミュレーターはサポート対象をサポートしています。したがって、gnome端末がxtermであると言うことで、terminfoライブラリに定義がある可能性が高くなります。
端末の種類についての欠点は、端末が実際にxtermよりも多くをサポートする可能性があることです(たとえば、多くの新しい端末は256色をサポートしますが、古い端末は16のみをサポートします)。したがって、トレードオフ、より多くの機能、またはより多くの互換性があります。ほとんどの端末はより多くの互換性を選択するため、自分自身をとしてアドバタイズすることを選択しますxterm
。
これを上書きしたい場合、多くの端末は動作を設定する何らかの方法を提供します。しかし、あなたもすることができますexport TERM=gnome-terminal
。
$TERM
にセットxterm
正当な理由のために
TERM
環境変数は、端末を示しているタイプではなく、ターミナルアプリケーションを。TERM
特定の目的があります:それはそのターミナルで実行しているアプリケーションにターミナルと対話する方法を伝えます。
アプリケーションは、エスケープシーケンスを書き込むことで端末と対話します。印刷できない文字を含む文字のシーケンスは、カーソルの移動、画面の一部の消去、現在の色の変更などの効果があります。エスケープシーケンスのセット。したがって、オペレーティングシステムは、端末タイプとその特性のデータベースを維持します。従来のデータベースはtermcap(「ターミナル機能」)です。多くの最新のシステムとアプリケーションがterminfoに切り替わりました。両方のデータベースは端末タイプの名前でインデックス付けされ、アプリケーションはTERM
環境変数の端末タイプ名を使用してそれらを照会します。
現在、ほとんどの端末では、いくつかの一般的な拡張機能セットを含む標準のエスケープシーケンスセットが使用されているため、のさまざまな値は表示されませんTERM
。ほとんどのGUIターミナルエミュレータは、従来のXターミナルであるxtermと互換性があります(これは現在も使用および保守されています)。
xtermとは異なる端末エミュレーターは、独自の名前で独自のエントリを端末データベースに追加する場合があります。ただし、これはリモートシェルとうまく噛み合いません。マシンAで実行されているが、たとえばBからAへのsshを介して起動されたためにマシンBで表示されるプログラムは、マシンAの端末データベースを照会する必要があります。sshなどのリモートログインメソッドはTERM
環境変数を引き継ぎますが、これは、Bの端末データベースにもAの値ユーザーのエントリがある場合にのみ役立ちます。したがって、多くの端末エミュレータTERM=xterm
は、ほとんどの場合広く知られています。
端末全体の違いは、アプリケーションが端末と対話する方法に起因するのではなく、端末がユーザーと対話して環境に適合する方法に起因するものです。たとえば、GnomeターミナルはGnomeで見栄えがよく、タブやその他の機能を提供します。KonsoleはKDEでは見栄えがよく、タブやその他の機能を提供します。urxvtのメモリ要件はわずかです。Console2はWindowsで実行されます。screenおよびtmuxは、異なる親端末に接続できるセッションを提供します。等々。これらの機能はいずれも端末で実行されているアプリケーションに影響を与えないため、ほとんどの端末エミュレータはを使用しますTERM=xterm
。
シェルがそれを実行している端末を確認するには、シェルの親を見てください。
ps -p$PPID
ps -p$PPID
は、実行中の端末を教えてくれないようです。または少なくとも私が理解する方法ではありません。出力/応答の例はありますか?
環境変数TERMは、使用している端末を意味するものではありません。
環境変数TERMには、テキストウィンドウの機能の識別子が含まれています。これらの機能の詳細なリストを取得するには、「man 5 terminfo」を参照として使用し、「infocmp」コマンドを使用します。
カラーディレクティブが埋め込まれたテキストを生成する場合、msgcatはTERM変数を調べます。現在のテキストウィンドウは、通常少なくとも8色をサポートしています。ただし、多くの場合、TERM変数は8色のみを示す識別子に設定されていますが、テキストウィンドウは16色以上をサポートしています。これらの場合、TERM変数を異なる値に設定する価値があります。
ほとんどの場合、xtermは16色をサポートして構築されています。また、88色または256色をサポートするように構築することもできます(両方ではありません)。TERMをxterm-16color、xterm-88color、またはxterm-256colorに設定してみてください。rxvt
rxvtは多くの場合、16色をサポートして構築されています。TERMをrxvt-16colorに設定してみてください。コンソール
konsoleも多くの場合、16色をサポートして構築されています。TERMをkonsole-16colorまたはxterm-16colorに設定してみてください。
TERMを設定したら、「msgcat --color = test」を呼び出して、出力が適切なカラーマップのように見えるかどうかを確認することで確認できます。環境変数TERMには、テキストウィンドウの機能の識別子が含まれています。これらの機能の詳細なリストを取得するには、「infocmp」コマンドを使用し、「man 5 terminfo」を参照として使用します。