てきとうなメモ

本の感想とか技術メモとか

CentOS7でのscreenのタイトルとか端末のタイトル

CentOS7でちょっと便利になっていたのでどうなっているのかなと。

デフォルトの状態で以下のようになっている

screen screenのタイトル 端末のタイトル
× ユーザ@ホスト名:作業ディレクトリ
ユーザ@ホスト名:作業ディレクトリ [screen ウィンドウ番号: ユーザ@ホスト名:作業ディレクトリ]

まず、端末の機能として、

ESC]0;端末のタイトルBEL

を出力すると、これをタイトルとして表示することができる(ESCは0x1b、BELは0x07)。ちなみに「ESC]0;」の0の部分は1や2でも大丈夫なようだ。CentOS7では/etc/bashrcの中で環境変数のPROMPT_COMMANDを指定することでタイトルを「ユーザ名@ホスト名:作業ディレクトリ」にしている

PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

次にscreenのウィンドウタイトルの方だが、screenには

ESCkウィンドウのタイトルESC\

が出力されるとこれをウィンドウのタイトルとして設定する機能があり、CentOS7ではこれを利用している。

screenを実行した場合、環境変数TERMがscreenに設定されるため、/etc/bashrcでPROMPT_COMMANDが以下に設定される。

PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

そのため、screenのウィンドウタイトルも「ユーザ名@ホスト名:作業ディレクトリ」になる。

最後に、screen実行時の端末のタイトルは/etc/screenrcで指定している。

screenにはハードステータス行を設定するコマンドがあり、以下でハードステータス行を指定できる。

hardstatus string ハードステータス行

ハードステータス行はscreenの機能ではなく端末の機能で、実行中のプロセス情報などを表示させるためのものである。端末の実装によって1番下の行に表示したりする。

CentOS7の/etc/screenrcでは以下のように設定されている

hardstatus string "[screen %n%?: %t%?] %h"

このコマンドのハードステータス行の部分には%を使ったエスケープシーケンスが利用できる。今回は以下のものが利用されている。

%n ウィンドウ番号
%t ウィンドウタイトル
%h ハードステータス行
%? 次の%?までのエスケープの中身が存在すれば%?〜%?を表示し、なければ何も表示しない

ハードステータス行はまだ設定されていないので空、ウィンドウタイトルは「ユーザ@ホスト名:作業ディレクトリ」になっているので「[screen ウィンドウ番号: ユーザ@ホスト名:作業ディレクトリ] 」になる。

ハードステータス行がなぜ端末のタイトルに表示されているのかは、同じく/etc/screenrcで設定されている。screenにはtermcap/terminfoの設定を修正するコマンドがあり、以下でそれを指定できる。

termcapinfo term terminal-tweaks

termcapやterminfoは端末を操作するためのライブラリ/設定データベースであり、端末上である操作をしたい場合、端末に対してどのように指定すれば良いかを記述することができる。

端末の種類ごとに設定を記述することができ、termで端末を絞りこみ、terminal-tweaksでtermcap/terminfoの設定を記述する。CentOS7の/etc/screenrcには、以下の記述がある。

termcapinfo xterm|xterm-* 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

これはxtermやxterm-*の端末に対するエントリを「'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'」のように修正する。

termcap/terminfoのエントリは各定義をコロンで分割していて、各定義は「capability[=値]」という形式で記述される。今回利用されているcapabilityは以下のものである。

hs ハードステータス行を持つ
ts ハードステータス行を開始する時のコマンド
fs ハードステータス行から戻る時のコマンド
ds ハードステータス行が無効する時のコマンド

よって、今回は

  • ハードステータス行を持つ
  • ハードステータス行の表示するときには「\E]2;」を使用
  • ハードステータス行から戻るときには「\007」を使用
  • ハードステータス行を無効にする時には「\E]2;screen\007」を使用

というエントリになっている。ここで\EはESCを意味する。よってscreenはハードステータス行を表示する際に、

ESC]2;ハードステータス行BEL

と出力し、端末のタイトルにハードステータス行が表示されることになる。

ハードステータス行を無効にした時の出力を確認するためには、

C-a : hardstatus alwaysignore

を実行する。そうするとタイトルが

screen

と表示される