さまざまな場所(利用可能性によって異なります)

さまざまな場所(利用可能性によって異なります)

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

++を使用してCTLコンソールTTYウィンドウに切り替えると、値が 。ALTF1echo $TERMlinux

私が要求した動機は、私の~/.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直感はそれが最善の解決策ではないと言い、私のインターネット検索ではまだ良い答えを得ていません。

私はUbuntu 15.04 Desktop(Debianベース)を実行しています。

答え1

さまざまな場所(利用可能性によって異なります)

仮想端末と実端末の両方で、TERM環境変数は接続されたプログラムによって設定され、loginログイン後に実行される対話型シェルに継承されます。このようなことが発生する正確な位置は、システムと端末の種類によって異なります。

実端末

実際のシリアル端子の種類は、電線の反対側の端で発生する状況によって異なります。したがって、gettyプログラムは通常、端末タイプを指定する引数またはプログラムTERMに渡されたサービスマネージャのサービス設定データを使用して呼び出されます。

  • van Smoorenburgシステムでは、項目に次のような内容が表示されinitます。/etc/inittab

    S0:3: Rebirth:/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]

    環境=期間=vt100
    TERMに渡される環境の変数を設定しますagetty
  • BSDでは、initデータベース内の各端末エントリの3番目のフィールドから端末タイプを取得し、/etc/ttys実行TERM環境の種類に応じて設定されますgetty/etc/ttysBSDで実際の端末の端末タイプを変更する場合も同様です。

体系化された可変性

サービス[email protected]単位ファイルまたはその問題の挿入ファイルは、システムシステム内の物理端末の端末タイプが変更される場所です。これらの変更は次に適用されます。みんなこのサービス単位テンプレートを使用した端末ログインサービスです。 (単一の端末に対してのみ変更するには、テンプレートを手動でインスタンス化するか、インスタンス化でのみ機能するプラグインを追加する必要があります。)

TERMsystemdには、環境変数の値を取得するためのライフサイクル中に少なくとも4つのメカニズムがあります。この回答を最初に書いたときに見たように、テンプレートサービスユニットファイルには1行あります。他の場合は、タイプとがそれぞれおよびサービス単位ファイルに組み込まれています。最近ではプロセス#1から環境変数を継承し、様々な方法で設定している。Environment=TERM=somethinglinuxvt102gettyserial-getty

2020年現在、systemdがサービスの環境変数に割り当てる端末の種類を決定する方法はTERMかなり複雑であり、まったく文書化されていません。変更方法はまだ使用中です。Environment=TERM=somethingデフォルト値のソースかなり多様です。TTYPath=個々のサービスユニットの設定に関連するかなり複雑な解釈規則が適用されます。3 つの値のいずれかです。:hardwired linux、hardwired vt220(これ以上vt102)、またはプロセス#1によって継承された環境変数の値TERM(通常はカーネル/ブートローダから)。

(つまり、このgetttyent()メカニズムはまだGNU Cライブラリに存在し、systemdで再利用できます/etc/ttys。)

カーネル仮想端末

ご存知のように、カーネル仮想端末には固定タイプがあります。カーネルの仮想端末タイプを動的に変更できるNetBSDとは異なり、Linuxや他のBSDはカーネルに組み込まれている端末エミュレータで単一の固定端末タイプを実装します。 Linuxでは、このタイプはlinuxterminfoデータベースのタイプと一致します。 (バージョン9以降、FreeBSDのカーネル端末エミュレーションはありました。バージョンteken9以前は、cons25 OpenBSDのカーネル端末エミュレーションでしたpccon。)

  • mingettyまたは(noshパッケージの)を使用するシステムでは、プログラムvc-get-ttyは仮想端末とのみ通信できることを「認識」し、プログラムがコンパイルされたオペレーティングシステムに適した「既知の」仮想端末タイプに組み込まれています。
  • systemd システムでは、以下を読み取る単位ファイル (マージされていないシステムの) でこれを見ることができました。/usr/lib/systemd/system/[email protected]/lib/systemd/system/[email protected]

    環境=期間=Linux
    TERMに渡される環境の変数を設定しますagetty

カーネル仮想端末の場合確かに端末の種類を変更します。結局、カーネルの端末エミュレータプログラムは変更されませんでした。これは間違ったタイプを変更します。特に、これはカーソル/編集キーのCSIシーケンス認識を混乱させます。 Linuxカーネル端末エミュレータから送信されたCSIシーケンスは、DEC VTモードのGUI端末エミュレータプログラムから送信されたCSIシーケンスとは異なりますlinux。 (実際、このターミナルは非常に特別で非標準的で、私が知っているすべての実際のターミナルとLinuxに組み込まれているターミナルを除いて、ほとんどすべてのソフトウェアターミナルエミュレータとは異なります。)xtermvt100

GUI端末エミュレータ

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

タイトな手

カラー機能をテストする正しい方法は次のとおりです。いいえスクリプトに端末タイプのリストをハードワイヤーします。色をサポートする端末の種類はさまざまです。

正しいアプローチは、ターミナルタイプの指示のためにtermcap / terminfoをチェックすることです。

色=0
Co > /dev/null 2>&1 と入力すると
それから
"`tput Co`" テスト -gt 2 && color=1
elif tput color> /dev/null 2>&1
それから
"`tput color`" テスト -gt 2 && color=1
フィリピン諸島

追加読書

  • ジョナサンデボインポラード(2018)。TERMスナックガイド。ソフトウェア。

答え2

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

答え3

Linuxの場合、初期化/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);
}

これ広報_情報()次のように表示されます。

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

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

関連情報