デスクトップ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ベース)を実行しています。
仮想端末と実際の端末では、TERM
環境変数はlogin
にチェーンされるプログラムによって設定され、ログオンすると実行される対話型シェルにずっと継承されます。正確には、これが発生する場所はシステムごとに異なり、端末の種類によっても異なります。
実際のシリアル端子は、ケーブルの反対側にあるものに応じてタイプが異なります。そのため、従来、getty
プログラムは、端末タイプを指定する引数を指定して呼び出されるか、サービスマネージャのサービス構成データからTERM
プログラムに渡されます。
init
システムでは、これを_/etc/inittab
_エントリで確認できます。これは、の行に沿って何かを読み取ります。S0:3:respawn:/ sbin/agetty ttyS0 9600 vt100-navその行の
agetty
の最後の引数_vt100-nav
_は、_/dev/ttyS0
_に設定された端末タイプです。したがって、_/etc/inittab
_は、このようなシステムで実際の端末の端末タイプを変更する場所です。/usr/lib/systemd/system/[email protected]
_ユニットファイル(マージされていないシステムでは_/lib/systemd/system/[email protected]
_)でこれを見ることができました環境= TERM = vt100
TERM
に渡された環境でagetty
変数を設定します。init
は、_/etc/ttys
_データベース内の各端末のエントリの3番目のフィールドから端末タイプを取得し、TERM
をそれが実行する環境内のgetty
に設定しますvar] _ with。したがって、_/etc/ttys
_は、BSD上の実際の端末の端末タイプを変更する場所です。_[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パッケージから)を使用しているシステムでは、プログラムは仮想端末とのみ通信できることを「認識」しており、それらは、プログラムがコンパイルされたオペレーティングシステム。/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端末エミュレーターは、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
TERM
。 noshガイド。ソフトウェア。TERM=xterm-color
が間違ったアプローチであり、Ubuntuの.bashrc
が廃止されたと思う理由の詳細な回答については、 https://askubuntu.com/a/614714/398785 を参照してください。 TERM=xterm-256color
(gnome-terminal 3.16以降のデフォルトですが、古いgnome-terminalsでも安全に使用できます)を使用し、それに応じて.bashrc
を調整することをお勧めします。
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」です。