[トップ] [更新履歴] [著書] [コンピュータ] [ゲーム] [CGI配布]
GNU screen は一種の端末マルチプレクサである。 これさえあれば、
などなどたくさんの恩恵を受けられる。 名前の通り、GPLに基いたフリーソフトウェアである。
基本的な説明についてはZinniaさんの「Screenを使う」を見てほしい。 かなり詳しく書かれているのでscreenを知らない人必見だ。 ここでは基本的な説明はしない。
screenはとにかくいい! ktermを使う人は絶対にインストールするしかない!!
設定ファイル.screenrcに書いてみよう。
死んでも死んでもまた復活する。 これがゾンビ、アンデッドたる所以。
screenの別windowでコマンドを実行していて、最後の実行結果を見たいと思うことはよくあるだろう。 デフォルトのままだとコマンドが終了したらwindowもろともなくなってしまって見ることができない。 だが、
zombie "q^M"
と.screenrcに書けばコマンドが終了したときにwindowは残る。 で、
ことができる。
ただ、出力しないコマンドを実行してもwindowが残るのはうざったい。 window別にzombieの設定ができればいいんだが。 そう考えているのは俺だけではないだろう。 簡単にできそうな気もするんでhackしようかしらん。 だれかがやってそうだが。
Xを使っていて他のホストでX clientを実行するときはDISPLAY環境変数を設定しないといけない。 それをscreen上で行うにはこの設定を加える
bind 'd' setenv DISPLAY
Screen 3.9.11からWindow Listが塔載された。 これは、windowをメニュー形式で切り換えるものである。 従来はC-a w(windows)でステータスラインにwindowのリストが出てきたのだが、多くのwindowを開いていると表示しきれない。 よって、3.9.11以降を使うのなら
bind w windowlist -b
という設定を加えよう。
任意のレジスタをペーストしたいなら
bind ^p paste bind p paste
という設定を加えると便利。
screenはwindowを分割することができる。 splitコマンドを実行すると(C-a S)、画面は二等分に分割される。 画面を分割したとき、「このwindowはもっと大きく(小さく)したいな」とはよく思うものだ。 分割されたwindowの大きさを変えるのはresizeコマンドである。 たとえば、
resize 10
でwindowが10行分の大きさになる。
resize +1
で1行分大きくなる。
resize -1
で1行分小さくなる。
ただ、それだといちいち数字を入力しないといけないので使いづらい! ここで次のような設定を .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が嫌な人は他のキーに割り当ててもよい。
3.9.9からscreenコマンド(シェルコマンドとして)に「-X」オプションがついた。 シェルからscreenにコマンドを送ることができるようになったのだ! これさえできればあなたのお好きなスクリプト言語*1でscreenのコマンドをたて続けに実行することができる!! プログラマブルな設定がしたい人にとっては待ちに待ったオプションだ。
$ screen -X other
このコマンドをシェルから実行すると最近使ったwindowに変わる。 screenのコマンドライン(C-a :)はヒストリ機能がなく、直前のコマンドしか記憶してくれない。 よってscreenにコマンドを送りたいのなら -X オプションを使った方がいい
たとえば、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回になり、大幅に高速に実行される。
先程のevalの例において、最後のselect 1の部分をquoteしていることに注意してほしい。 quoteしないと
の4つのコマンドを実行するように解釈されてしまう。
さらに、screenのコマンドとして
stuff "^M"
をscreen -X経由で実行したいときは余計なquoteが必要になったりする。
すなわちシェルの単語分割が逆に仇になってしまうのである。 よって、シェルを経由しないでコマンドを実行できる言語を使った方がいい。 その一つとしてRubyがある。 Rubyならこうする。
ruby> system "screen", "-X", "eval", "split", "other", "select 1"
長くなった。 が、screenコマンドにquoteが入らないのでその方がわかりやすいと言える。
screenの制御下にあるwindowにおいて、環境変数WINDOWが設定される。 WINDOWには現在のwindowの番号が入っている。 プログラミングの視点から見てみると、
ことができる。(2)で作業している間にwindow3へ移動したとしても、(3)で確実にwindow1へ戻ってこられる。
代表的な処理といえば、こんな感じである。
ここで、4の段階で他のwindowへ行っても確実にwindow2へ戻ってこれるようにしたい。 2の段階でWINDOWの値を一時ファイルに保存すればいいのだ!! 一時ファイルに保存してしまえば6でその値を読出すことができる。
で、作ってみたのがgnuclient.rbである。
3.9.11で新設されたsourceコマンド。 screenのコマンドが書かれたファイルを指定して実行させることができる。 だけど俺は使わんなぁ。
screenプログラミングの視点で俺が作ったスクリプトがいくつかある。
*1俺は当然Rubyだ。