GNU/Linux >> Linux の 問題 >  >> Linux

環境変数のデフォルトという用語はどこで設定されますか?

デスクトップ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つの値のいずれかになります。 、ハードワイヤードvt220vt102ではなくなりました )、または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)。 TERMnoshガイド 。ソフトウェア。

Linux
  1. コマンドラインで環境変数を設定し、それをコマンドに表示するにはどうすればよいですか?

  2. パス変数がBashで設定されている場所の完全なビュー?

  3. 私のgitの言語を変更するには?

  1. TERM 環境変数が設定されていません

  2. $HOME 環境変数はどこに設定されていますか?

  3. 環境変数 XDG_VTNR とは何ですか?

  1. Linuxでデフォルトのターミナル(またはウィンドウマネージャー、ブラウザーなど)を設定する方法

  2. 環境変数がどこから来たのかを判断する方法は?

  3. tty7 の端末ビューはどこにありますか