デスクトップGUIでGNOMEターミナルエミュレータを使用してターミナルウィンドウを開くと、シェルTERM環境変数のデフォルト値はですxterm
。
++を使用してCTLコンソールTTYウィンドウに切り替えると、値が 。ALTF1echo $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
直感はそれが最善の解決策ではないと言い、私のインターネット検索ではまだ良い答えを得ていません。
私は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/ttys
BSDで実際の端末の端末タイプを変更する場合も同様です。
体系化された可変性
サービス[email protected]
単位ファイルまたはその問題の挿入ファイルは、システムシステム内の物理端末の端末タイプが変更される場所です。これらの変更は次に適用されます。みんなこのサービス単位テンプレートを使用した端末ログインサービスです。 (単一の端末に対してのみ変更するには、テンプレートを手動でインスタンス化するか、インスタンス化でのみ機能するプラグインを追加する必要があります。)
TERM
systemdには、環境変数の値を取得するためのライフサイクル中に少なくとも4つのメカニズムがあります。この回答を最初に書いたときに見たように、テンプレートサービスユニットファイルには1行あります。他の場合は、タイプとがそれぞれおよびサービス単位ファイルに組み込まれています。最近ではプロセス#1から環境変数を継承し、様々な方法で設定している。Environment=TERM=something
linux
vt102
getty
serial-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では、このタイプはlinux
terminfoデータベースのタイプと一致します。 (バージョン9以降、FreeBSDのカーネル端末エミュレーションはありました。バージョンteken
9以前は、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に組み込まれているターミナルを除いて、ほとんどすべてのソフトウェアターミナルエミュレータとは異なります。)xterm
vt100
GUI端末エミュレータ
screen
GUI端末エミュレータは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」です。