UNIX/Linuxの部屋 環境変数:TERM

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




環境変数 TERM 端末 (ターミナル) の名称 このエントリーをはてなブックマークに追加

もともと、文字を入力したり表示したりする装置を指して端末と呼んでいた。最初のうちは端末はプリンタに文字を出力するだけで、いわば文字はたれ流し状態だった。そのうちモニタ上に文字を表示できるようになり、1文字戻ったり、1行削除したり、画面をクリアするなどの機能が求められるようになった。

そこで、「1文字戻る」を表すコードは xxx で、「画面クリア」を表すコードは yyy で…というふうな、特殊なコードが決められた。これをエスケープシーケンスと呼ぶ。ところが、端末を作成していた多くの会社は、独自のエスケープシーケンスを決めたため、互換性が全く存在しない状況になってしまった。そこで、termcap というデータベースが作成され、
  • foo という端末で画面クリアをするエスケープシーケンスは xxx
  • bar という端末で画面クリアをするエスケープシーケンスは yyy
というふうにアプリケーションが端末の種類に応じて、出力するエスケープシーケンスを変えるという仕組みができた。

ユーザが利用している端末の種類を知るために、アプリケーションは環境変数 TERM を参照するのである。(現在の PC-UNIX では) ほとんどのユーザは kterm を使っていると思われる (まぁ Eterm や rxvt もあるだろうけど。Solaris x86 なんかだと dtterm なんだろうか)。
% echo $TERM
kterm
となるだろうか。ここで emacs や vi を実行すると、当然うまく動くはずだ。では、
% unsetenv TERM (csh・tcsh の場合)
% unset TERM (sh・bash の場合)
として、環境変数 TERM をクリアしてから emacs や vi を実行してみてほしい。emacs は
% emacs -nw
Please set the environment variable TERM; see tset(1).
と言われて起動できず、vi は画面表示が変になるはずである。

emacs や vi では、1文字戻ったり画面をクリアする際、エスケープシーケンスを出力している。しかしエスケープシーケンスは端末の種類によって違うので、ユーザが今どの種類の端末を利用しているのかをプログラムに伝えるのが環境変数 TERM の役割なのだ。