web-dev-qa-db-ja.com

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

デスクトップ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デスクトップエディション(Debianベース)を実行しています。

26
Andy Fusniak

多くの場所で

仮想端末と実際の端末では、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/[email protected]_ユニットファイル(マージされていないシステムでは_/lib/systemd/system/[email protected]_)でこれを見ることができました
    環境= TERM = vt100
    TERMに渡された環境でagetty変数を設定します。
  • BSDでは、initは、_/etc/ttys_データベース内の各端末のエントリの3番目のフィールドから端末タイプを取得し、TERMをそれが実行する環境内のgettyに設定しますvar] _ with。したがって、_/etc/ttys_は、BSD上の実際の端末の端末タイプを変更する場所です。

systemdの変動性

_[email protected]_サービスユニットファイル、またはそれに適用されるドロップインファイルは、systemdシステム上の実際の端末の端末タイプを変更する場所です。このような変更は、このサービスユニットテンプレートを使用するall端末ログインサービスに適用されることに注意してください。 (個々の端末のみを変更するには、テンプレートを手動でインスタンス化するか、インスタンス化にのみ適用されるドロップインを追加する必要があります。)

systemdには、存続期間中、TERM環境変数の値を取得するための少なくとも4つのメカニズムがありました。この回答を最初に書いた時点で、ご覧のとおり、テンプレートサービスユニットファイルに_Environment=TERM=something_行がありました。他の場合には、タイプlinuxおよび_vt102_が、それぞれgettyおよび_serial-getty_サービスユニットファイルにハードワイヤードされていました。最近では、環境変数はプロセス#1から継承され、さまざまな方法で設定されています。

2020年の時点で、systemdがサービスのTERM環境変数で指定する端末タイプを決定する方法は非常に複雑であり、まったく文書化されていません。それを変更する方法は、_Environment=TERM=something_を使用したドロップイン構成ファイルのままです。しかし、デフォルト値の由来()は非常に可変です。個々のサービスユニットの_TTYPath=_設定を含むルールを説明するかなり複雑な条件に従います これは3つの値のいずれかです :固定されたlinux、固定された_vt220_(もはや_vt102_)、またはプロセス1が継承したTERM環境変数の値。通常はカーネル/ブートストラップローダーから継承されます。

(皮肉にも、getttyent()メカニズムはGNU Cライブラリにまだ存在しており、systemdは_/etc/ttys_メカニズムを再利用した可能性があります。)

カーネル仮想端末

カーネル仮想端末には、すでに説明したように、固定タイプがあります。カーネルの仮想端末タイプをオンザフライで変更できるNetBSDとは異なり、Linuxおよびその他のBSDには、カーネルの組み込み端末エミュレーションプログラムに実装された単一の固定端末タイプがあります。 Linuxでは、そのタイプはterminfoデータベースのlinuxと一致します。 (バージョン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シーケンスは、DEC VTモードでGUIターミナルエミュレータプログラムによって送信されるxtermまたは_vt100_ 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)。 TERMnoshガイド。ソフトウェア。
19
JdeBP

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

2
egmont

Linuxの場合、init/main.cでこの環境が定義されています。

static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };

次にdo-execve()で呼び出されます:

static int run_init_process(const char *init_filename)
{
    argv_init[0] = init_filename;
    pr_info("Run %s as init process\n", init_filename);
    return do_execve(getname_kernel(init_filename),
        (const char __user *const __user *)argv_init,
        (const char __user *const __user *)envp_init);
}

このpr_info()は次のように表示されます:

]# dmesg |grep 'Run'
[    1.291323] Run /init as init process

したがって、デフォルトは最初から「TERM = linux」です。

0
rastafile