デスクトップGUIでGNOMEターミナルエミュレーターを使用してターミナルウィンドウを開くと、シェルのTERM環境変数のデフォルト値はxterm
になります。 。
CTLを使用する場合 + ALT + F1 コンソールのTTYウィンドウに切り替えてecho $TERM
値はlinux
に設定されます 。
私が尋ねる動機は、私の~/.bashrc
の内部にあることです。 file変数は、カラーシェルが提供されているのか、古き良きモノクロであるのかを判断するために使用されます。
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac
次のように入力すると、コンソールシェルとGnomeターミナルエミュレータシェルの両方で
export TERM=xterm-color
source /.bashrc
両方のシェルがカラーモードに変わります(両方で常に発生したいことです)。
デフォルトのTERM
はどこにありますか 値を設定してください。可能な場合は、デフォルトを変更するのに最適な場所はどこですか。ターミナルエミュレータのGUIには、デフォルトのTERM値を選択または設定するものが何もないようです。
export TERM=xterm-color
という行を追加することを検討しました ~/.bashrc
の先頭に ファイルを作成しましたが、私の本能はこれが最善の解決策ではなく、Google検索でまだ良い答えが得られていないことを示しています。
Ubuntu 15.04 Desktop Edition(Debianベース)を実行しています。
承認された回答:
多くの場所で、依存します
仮想端末と実際の端末では、TERM
環境変数は、login
にチェーンするプログラムによって設定されます 、およびログオンすると実行されるインタラクティブシェルに至るまで継承されます。正確には、これが発生する場所はシステムごとに、また端末の種類によって異なります。
実際の端末
実際のシリアル端子は、ワイヤのもう一方の端にあるものに応じて、タイプが異なる場合があります。したがって、従来はgetty
プログラムは、端末タイプを指定する引数で呼び出されるか、TERM
が渡されます サービスマネージャーのサービス構成データからのプログラム。
- vanSmoorenburgの
init
システムの場合、これは/etc/inittab
で確認できます。 エントリ。の行に沿って何かを読み取ります。S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
agetty
の最後の引数 その行で、vt100-nav
、は/dev/ttyS0
に設定された端末タイプです 。したがって、/etc/inittab
このようなシステムで実際の端末の端末タイプを変更する場所です。 - systemdシステムでは、これは
/usr/lib/systemd/system/[email protected]
で確認できました。 ユニットファイル(/lib/systemd/system/[email protected]
マージされていないシステムの場合)、以前は読み取りを行っていましたEnvironment=TERM=vt100
TERM
の設定agetty
に渡される環境内の変数 。 - BSDでは、
init
/etc/ttys
の各端末のエントリの3番目のフィールドから端末タイプを取得します データベース、およびTERM
を設定します それからgetty
を実行する環境で と。したがって、/etc/ttys
ここで、BSD上の実際の端末の端末タイプを変更します。
systemdの変動性
[email protected]
サービスユニットファイル、またはそれに適用されるドロップインファイルは、systemdシステム上の実際の端末の端末タイプを変更する場所です。このような変更はすべてに適用されることに注意してください このサービスユニットテンプレートを使用するターミナルログインサービス。 (個々の端末に対してのみ変更するには、テンプレートを手動でインスタンス化するか、インスタンス化にのみ適用されるドロップインを追加する必要があります。)
systemdには、TERM
の値を取得するために、その存続期間中に少なくとも4つのメカニズムがありました。 環境変数。この回答を最初に書いた時点で、ご覧のとおり、Environment=TERM=something
テンプレートサービスユニットファイルの行。それ以外の場合、タイプはlinux
およびvt102
getty
に組み込まれていました およびserial-getty
それぞれサービスユニットファイル。最近では、環境変数がプロセス#1から継承され、さまざまな方法で設定されています。
2020年の時点で、systemdがサービスのTERM
で指定する端末タイプを決定する方法 環境変数は非常に複雑であり、まったく文書化されていません。これを変更する方法は、Environment=TERM=something
。ただし、デフォルト値の出所 かなり可変です。 TTYPath=
を含むルールを説明するのにかなり複雑な条件があります 個々のサービスユニットの設定。ハードワイヤードのlinux
の3つの値のいずれかになります。 、ハードワイヤードvt220
(vt102
ではなくなりました )、またはTERM
の値 プロセス#1が継承する環境変数。通常はカーネル/ブートストラップローダーから継承されます。
(皮肉なことに、getttyent()
メカニズムはGNUCライブラリにまだ存在しており、systemdは/etc/ttys
を再利用できた可能性があります。 メカニズム。)
カーネル仮想端末
お気づきのように、カーネル仮想端末のタイプは固定されています。カーネル仮想端末タイプをオンザフライで変更できるNetBSDとは異なり、Linuxおよびその他のBSDには、カーネルの組み込み端末エミュレーションプログラムに実装された単一の固定端末タイプがあります。 Linuxでは、そのタイプはlinux
と一致します terminfoデータベースから。 (バージョン9以降のFreeBSDのカーネルターミナルエミュレーションはteken
。バージョン9より前は、cons25
でした。 OpenBSDはpccon
です 。)
-
mingetty
を使用するシステムの場合 またはvc-get-tty
(noshパッケージから)プログラムは、仮想端末とのみ通信できることを「認識」し、プログラムがコンパイルされたオペレーティングシステムに適した「既知の」仮想端末タイプを配線します。 - systemdシステムでは、これは
/usr/lib/systemd/system/[email protected]
で確認できました。 ユニットファイル(/lib/systemd/system/[email protected]
マージされていないシステムの場合)、読み取りますEnvironment=TERM=linux
TERM
の設定agetty
に渡される環境内の変数 。
カーネル仮想端末の場合、1つは 端末タイプを変更します。結局のところ、カーネルのターミナルエミュレータプログラムは変更されません。 正しくない タイプを変更します。特に、これはカーソル/編集キーのCSIシーケンス認識を台無しにします。 linux
Linuxカーネルターミナルエミュレータによって送信されるCSIシーケンスは、xterm
とは異なります。 またはvt100
DECVTモードのGUI端末エミュレータプログラムによって送信されるCSIシーケンス。 (実際、これらは非常に特異で非標準であり、私が知っているすべての実際の端末と、Linuxに組み込まれているものを除く他のほとんどすべてのソフトウェア端末エミュレーターとは異なります。)
GUIターミナルエミュレータ
GUIターミナルエミュレータは、SSHデーモンからscreen
までの多くのプログラムの1つです。 、疑似端末を使用します。端末の種類は、疑似端末のマスター側で実行されている端末エミュレータプログラムと、その構成方法によって異なります。ほとんどのGUIターミナルエミュレータは、TERM
を使用してスレーブ側でプログラムを起動します。 値がマスター側の端末エミュレーションと一致する変数。 SSHサーバーなどのプログラムは、接続のクライアント側にある端末タイプを「パススルー」しようとします。通常、端末エミュレーションの中から選択できるメニューまたは構成オプションがいくつかあります。
握る手
色の機能を検出する正しい方法はではありません スクリプト内の端末タイプのリストを配線します。色をサポートする端末タイプは非常にたくさんあります。
正しい方法は、termcap/terminfoが端末タイプについて何を言っているかを確認することです。
colour=0 if tput Co > /dev/null 2>&1 then test "`tput Co`" -gt 2 && colour=1 elif tput colors > /dev/null 2>&1 then test "`tput colors`" -gt 2 && colour=1 fi
さらに読む
- ジョナサンデボインポラード(2018)。
TERM
。 noshガイド 。ソフトウェア。