[トップ] [更新履歴] [著書] [コンピュータ] [ゲーム] [CGI配布]


Title: GNU screenを使い倒せ!

Index


1 GNU screen って何ぞや?

GNU screen は一種の端末マルチプレクサである。 これさえあれば、

などなどたくさんの恩恵を受けられる。 名前の通り、GPLに基いたフリーソフトウェアである。

基本的な説明についてはZinniaさん「Screenを使う」を見てほしい。 かなり詳しく書かれているのでscreenを知らない人必見だ。 ここでは基本的な説明はしない。

screenはとにかくいい! ktermを使う人は絶対にインストールするしかない!!

2 新着情報

[2004/06/23]
[2002/04/11]

3 うちの設定

設定ファイル.screenrcに書いてみよう。

3.1 ゾンビ

死んでも死んでもまた復活する。 これがゾンビ、アンデッドたる所以。

screenの別windowでコマンドを実行していて、最後の実行結果を見たいと思うことはよくあるだろう。 デフォルトのままだとコマンドが終了したらwindowもろともなくなってしまって見ることができない。 だが、

zombie "q^M"

と.screenrcに書けばコマンドが終了したときにwindowは残る。 で、

ことができる。

ただ、出力しないコマンドを実行してもwindowが残るのはうざったい。 window別にzombieの設定ができればいいんだが。 そう考えているのは俺だけではないだろう。 簡単にできそうな気もするんでhackしようかしらん。 だれかがやってそうだが。

3.2 DISPLAY環境変数の変更

Xを使っていて他のホストでX clientを実行するときはDISPLAY環境変数を設定しないといけない。 それをscreen上で行うにはこの設定を加える

bind 'd' setenv DISPLAY

3.3 Window List

Screen 3.9.11からWindow Listが塔載された。 これは、windowをメニュー形式で切り換えるものである。 従来はC-a w(windows)でステータスラインにwindowのリストが出てきたのだが、多くのwindowを開いていると表示しきれない。 よって、3.9.11以降を使うのなら

bind w windowlist -b

という設定を加えよう。

3.4 レジスタのペースト

任意のレジスタをペーストしたいなら

bind ^p paste
bind p paste

という設定を加えると便利。

3.5 resize

screenはwindowを分割することができる。 splitコマンドを実行すると(C-a S)、画面は二等分に分割される。 画面を分割したとき、「このwindowはもっと大きく(小さく)したいな」とはよく思うものだ。 分割されたwindowの大きさを変えるのはresizeコマンドである。 たとえば、

resize 10

でwindowが10行分の大きさになる。

resize +1

で1行分大きくなる。

resize -1

で1行分小さくなる。

3.5.1 resizeの便利な設定

ただ、それだといちいち数字を入力しないといけないので使いづらい! ここで次のような設定を .screenrc に追加しよう。

bind r eval 'echo "Resize window"' 'command -c resize'
bind -c resize ^]  command
bind -c resize j eval 'resize +1' 'command -c resize'
bind -c resize k eval 'resize -1' 'command -c resize'

この設定ではC-a rでwindowの大きさ変更モードになり、Resize windowというメッセージが出る。 その状態でjを押すと1行大きくなり、kを押すと1行小さくなる。 j、あるいはkは連続的に機能する(たとえばjjで2行分大きくなる)ので大きさを目で見ながら指定できる。 j、k以外のキーを押したとき、大きさ変更モードは終了する。 当然、jとkが嫌な人は他のキーに割り当ててもよい。

4 screenプログラミング

3.9.9からscreenコマンド(シェルコマンドとして)に「-X」オプションがついた。 シェルからscreenにコマンドを送ることができるようになったのだ! これさえできればあなたのお好きなスクリプト言語*1でscreenのコマンドをたて続けに実行することができる!! プログラマブルな設定がしたい人にとっては待ちに待ったオプションだ。

4.1 -X オプション

$ screen -X other

このコマンドをシェルから実行すると最近使ったwindowに変わる。 screenのコマンドライン(C-a :)はヒストリ機能がなく、直前のコマンドしか記憶してくれない。 よってscreenにコマンドを送りたいのなら -X オプションを使った方がいい

4.2 evalコマンド

たとえば、windowを分割して、下のwindowを1番にしたいときは

$ screen -X split; screen -X focus; screen -X select 1

とすればいい。 だが、1つのコマンドを起動するのにいちいちscreenプロセスを立ち上げているのでいかんせん遅い。

その問題を解決するために3.9.11からevalというコマンドが新設された。 evalは引数に指定したコマンドを立て続けに実行する! evalを使って書き換えると、このようになる。

$ screen -X eval split other 'select 1'

プロセス立ち上げは1回になり、大幅に高速に実行される。

4.3 シェルスクリプトより他の言語を

先程のevalの例において、最後のselect 1の部分をquoteしていることに注意してほしい。 quoteしないと

  1. split
  2. other
  3. select
  4. 1

の4つのコマンドを実行するように解釈されてしまう。

さらに、screenのコマンドとして

stuff "^M"

をscreen -X経由で実行したいときは余計なquoteが必要になったりする。

すなわちシェルの単語分割が逆に仇になってしまうのである。 よって、シェルを経由しないでコマンドを実行できる言語を使った方がいい。 その一つとしてRubyがある。 Rubyならこうする。

ruby> system "screen", "-X", "eval", "split", "other", "select 1"

長くなった。 が、screenコマンドにquoteが入らないのでその方がわかりやすいと言える。

4.4 WINDOW環境変数

screenの制御下にあるwindowにおいて、環境変数WINDOWが設定される。 WINDOWには現在のwindowの番号が入っている。 プログラミングの視点から見てみると、

  1. window1からwindow2へ移る
  2. window2で作業する
  3. window1へ戻る

ことができる。(2)で作業している間にwindow3へ移動したとしても、(3)で確実にwindow1へ戻ってこられる。

代表的な処理といえば、こんな感じである。

  1. window1にemacs -nwが立ち上がっている
  2. window2にw3mが立ち上がっていてgnuclientでtextareaを編集する
  3. window1へ移動する
  4. emacsで編集する
  5. 編集終了
  6. window2へ移動

ここで、4の段階で他のwindowへ行っても確実にwindow2へ戻ってこれるようにしたい。 2の段階でWINDOWの値を一時ファイルに保存すればいいのだ!! 一時ファイルに保存してしまえば6でその値を読出すことができる。

で、作ってみたのがgnuclient.rbである。

4.5 sourceコマンド

3.9.11で新設されたsourceコマンド。 screenのコマンドが書かれたファイルを指定して実行させることができる。 だけど俺は使わんなぁ。

5 screenを使ったスクリプト集

screenプログラミングの視点で俺が作ったスクリプトがいくつかある。

6 リンク


戻る ホームページへ戻る

Valid XHTML 1.0!
rubikitch(rubikitch@ruby-lang.org)

投書箱:コメントや伝えたい情報などがあればお気軽にどうぞ
名前 メール [説明]
URL
本文


*1俺は当然Rubyだ。