TERM環境変数のデフォルトはどこに設定されますか?


26

デスクトップGUIでGNOMEターミナルエミュレーターを使用してターミナルウィンドウを開くと、シェルのTERM環境変数はデフォルトの値になりますxterm

CTL+ ALT+ を使用F1してコンソールTTYウィンドウに切り替えecho $TERM、値がに設定されている場合linux

私の質問の動機は、~/.bashrcファイル内で変数を使用して、カラーシェルが提供されているのか、古き良き時代のモノクロだけが提供されているのかを判断することです。

# 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ベース)を実行しています。


回答:


17

多くの場所で、

仮想端末および実際の端末では、TERM環境変数はにチェーンするプログラムによって設定され、login一度ログオンすると実行される対話型シェルに至るまですべて継承されます。正確には、これはシステムによって異なり、端末の種類によって異なります。

実際のシリアル端末は、ワイヤのもう一方の端に応じてタイプが異なる場合があります。そのため、通常、gettyプログラムは端末タイプを指定する引数で呼び出されるかTERM、サービスマネージャーのサービス構成データからプログラムを渡されます。

  • van Smoorenburg initシステムでは、/etc/inittabエントリーでこれを見ることができます。

    S0:3:respawn:/ sbin / agetty ttyS0 9600 vt100-nav
    最後の引数agettyその行では、vt100-nav、に設定された端末タイプです/dev/ttyS0。その/etc/inittabようなシステムの実際の端末の端末タイプを変更する場所もそうです。
  • systemdシステムでは、/usr/lib/systemd/system/serial-getty@.serviceユニットファイル(/lib/systemd/system/serial-getty@.serviceマージされていないシステム)でこれを確認できます。

    環境= TERM = vt100
    TERM渡される環境で変数を設定しますagetty。このサービスユニットファイルは、そのようなシステム上の実際の端末の端末タイプを変更する場所です。このサービスユニットテンプレートを使用するすべての実際の端末に適用されることに注意してください。(個々の端末のみで変更するには、テンプレートを手動でインスタンス化する必要があります。)
  • BSDではinit/etc/ttysデータベース内の各端末のエントリの3番目のフィールドから端末タイプを取得し、TERM実行する環境内の端末タイプから設定gettyします。その/etc/ttysため、BSD上の実際の端末の端末タイプを変更します。

前述のように、カーネル仮想端末には固定タイプがあります。カーネルの仮想端末タイプをオンザフライで変更できるNetBSDとは異なり、Linuxおよびその他のBSDには、カーネルの組み込み端末エミュレーションプログラムに実装された単一の固定端末タイプがあります。Linuxでは、そのタイプlinuxはterminfoデータベースから一致します。(FreeBSDのカーネルターミナルエミュレーションは、xtermバージョン9以降の限定されたサブセットです。)

  • システムで使用しmingettyたりvc-get-tty(間食パッケージから)プログラムは、プログラムのためにコンパイルされたことをオペレーティングシステムに適した、それが唯一の仮想端末に話をすることができ、それらは「既知」の仮想端末の種類をハードコーディングすることを「知っています」。
  • systemdシステムでは、/usr/lib/systemd/system/getty@.serviceユニットファイル(/lib/systemd/system/getty@.serviceマージされていないシステム)でこれを確認できます。

    Environment = TERM = linux
    TERM渡される環境で変数を設定しますagetty

カーネル仮想端末の場合、端末タイプ変更されません。結局のところ、カーネル内のターミナルエミュレータプログラムは変更されません。タイプを変更するのは正しくありません。特に、これはカーソル/編集キーのCSIシーケンス認識を台無しにします。linuxLinuxカーネルの端末エミュレータによって送られたCSIシーケンスはに異なっているxtermか、vt10012月VTモードでGUI端末エミュレータプログラムによって送信されたCSIシーケンス。

GUIターミナルエミュレータは、SSHデーモンからscreenに至るまで、疑似端末を使用する多くのプログラムの1つです。端末タイプは、擬似端末のマスター側で実行されている端末エミュレータプログラムと、その構成方法によって異なります。ほとんどのGUI端末エミュレーターはTERM、マスター側の端末エミュレーションと値が一致する変数を使用して、スレーブ側でプログラムを開始します。SSHサーバーなどのプログラムは、接続のクライアント側にある端末タイプを「パススルー」しようとします。通常、ターミナルエミュレーションから選択するメニューまたは構成オプションがあります。

握り手

カラー機能を検出する正しい方法は、スクリプト内の端末タイプのリストを配線することではありません。色をサポートする端末タイプは非常に多くあります。

正しい方法は、termcap / terminfoが端末タイプについて何を言っているかを調べることです。

色= 0
tput Co> / dev / null 2>&1の場合
それから
    テスト「 `tput Co`」-gt 2 && colour = 1
elif tputカラー> / dev / null 2>&1
それから
    テスト "` tput colors` "-gt 2 && colour = 1
fi

参考文献

  • ジョナサン・ド・ボイン・ポラード(2018)。TERM間食ガイド。ソフトウェア。

Debian jessieのデフォルトの.bashrcには次のものがあります[ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes。(ncurses 5.9)
thom_nic

2
tput CoJessieおよびXenialで「不明なterminfo機能」も返します。なぜか分からないことは認めますがtput colorstput setaf 1両方ともうまくいくようです。
-thom_nic

2

私が間違ったアプローチであり、Ubuntu が時代遅れであると思う理由についての詳細な回答については、https://askubuntu.com/a/614714/398785を参照してください。(gnome-terminal 3.16以降のデフォルトですが、古いgnome-terminalでも安全に使用できます)を使用し、それに応じて調整することをお勧めします。TERM=xterm-color.bashrcTERM=xterm-256color.bashrc


1
リンクの+1。マイナーな提案。次の文は紛らわしいかもしれません(最初は、using .bashrcは時代遅れだと言っていた印象を受けました)。「Ubuntuの.bashrcは廃止されました。」
IsaacS

@IsaacSそれを改善する方法はありますか?たとえば、「廃止された」を「時代遅れの」ヘルプに置き換えますか?
エグモント

1
これは、その表示されたxterm-256color原因をhtopそのレイアウトまで混乱にこのような Ubuntuの18.04インチ
ハーミングモニカを

@OrangeDogどの端末エミュレーターですか?ここでの質問、したがって私の回答はGNOMEターミナルに焦点を当てていますが、リンクしたページにはKonsoleが表示されています。このバグは、ncursesがその頃に使用を開始したREPエスケープシーケンスをターミナルエミュレータがまだサポートしていないようです。VTE(GNOMEターミナル)はすでにUbuntu 18.04でサポートを追加していましたが、Konsoleがサポートしていない可能性があります。htop breakのコメントはKonsoleには有効ですが、GNOMEターミナルには有効ではないと思われます。
エグモント

@egmontは元の問題について話すことはできませんが、WSLのターミナル(それが何であれ)で同じ結果が得られます。
ハーミングモニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.