UnixUser
$Id: UNIX+USER+screen%daad%ddf6,v 1.20 2004/06/07 01:57:24 zinnia Exp $
! 概要
- screen 4.0.1についての記事
- 8ページ
- 締切は11/20
- 原稿料は入稿後に決まるらしい
- 公開は半年後
- フォーマット 25文字x82行/page、plain txt
- 写真1点でほぼ10行分、画像はPNG
- 図版はラフ図で出す
- 一人称は「筆者」
- 敬体
!! その他の個人的な掟(?)
- 脚注は使わない
- 括弧づけを減らす(言い換え、表記換えなどに限る)
!! めも
(やり残し)
- flow/nonblock
- exec / at
- visual bell
- flow / nobblock
- 環境変数関係
- windows.el / elscreen / escreen
- xgesture
- 「おわりに」にあと一文
! はじめに
本稿では、Screenというソフトの紹介、ならびにその効果的な使いかたについて説明します。
「Screenとは何なのか」ということについて説明する前に、「Screenを使うと、どのようにうれしいのか」ということを、先に紹介します。
!! 端末の枚数が多いとき
巨大なプログラムのビルドをしている間に、w3mでWebを見て、 他のマシンにloginして... そのたびにKTermなどの 端末を立ち上げてゆくと、画面は端末だらけに。 他の端末をいじるのためにいちいちマウスに手を伸ばすのはうっとうしいし、 キー操作だけで切り替えを済まそうと思うと端末の枚数が増えるたびに 操作の回数が増えて億劫だ。
→ Screenを使っていれば、端末は1つだけで済みます。1つの端末の中で、複数の仮想的な端末を切り替えながら使うことができます。切り替えは2ストロークのキー操作でできますので、枚数が増えても安心です。
!! 作業がまだ続いているとき
複数人で1つのマシンを共有している場合、時間のかかる処理をしているからといって ログインしたままの状態で帰ってしまったりすると、その間は 他の人が使うことができなってしまう。
かといって今動いてる処理を止めるわけにはいかないし、 ログを残す手順を踏んでいなかったので、バックグラウンドにまわしたら 結果がよくわからない。しょうがないのでそのままにして帰ったら いたずらされた上にプログラムを止められてしまった。
→ Screenなら簡単なキー操作ですぐに端末から切離すことができます。端末を閉じた後でも、別の端末から接続することで、すぐに作業の続きをすることができます。安心してログアウトできますね。
!! 端末が落ちてしまったとき
Xが落ちてしまったおかげで3日がかりで計算させていたプログラムが巻き添えに。 3日後には卒論提出しなければいけないんだけど...
→ Screenでは、端末が強制終了させられてしまっても、中で動いているプログラムはそのまま動き続けています。直前の例と同様に、Xを立ち上げなおして、別の端末から再接続することで作業の続きをすることができます。
さすがにマシンの電源を切られてしまった、などというときにはどうしようもありませんが...
!! ネットワーク越しに端末を操作したいとき
普段の作業はノートパソコンで行っているけど、隣にデスクトップが あるときはなるべくデスクトップの方を使いたい。
→ デスクトップからノートパソコンにログインした後、Screenに再接続することで、デスクトップのキーボードとモニタを使って、ノートパソコン側の端末を操作することができます。デスクトップ側で必要なものは端末ソフトだけですから、ホームディレクトリをデスクトップ側にも作ったり、ファイル共有の設定を行ったりする必要はありません。
逆のパターンも考えられます。
普段の作業はデスクトップパソコンで行っているけど、ノートパソコンを 持ち歩いているので、出先でも作業の続きがしたい
→ 先程の例とは逆に、ノートパソコンからデスクトップのパソコンにログインして、Screenに再接続することでそのまま作業を続けることができます。PHSのダイヤルアップ接続など、あまりスピードの出ないネットワークでノートパソコンを使用している場合などは、デスクトップのScreenの中でメールソフトを立ち上げておいて、ノートパソコンでその結果を読むというようにすると、長い時間かけてメールを受信してみたらジャンクメールだった、というようなことがなくて便利です。
!! 複数人で同じ端末を見たいとき
プログラムを書きながら説明したいんだけど、みんなが画面の後ろに 集まってると暑苦しい。パソコンは1人1台ずつあるので、 プログラムを書いている画面を、みんなのパソコンに送りつけながら 説明できるとうれしい
→ Screenは、複数のユーザが同時に同じ端末を操作する機能を持っています。設定を工夫することで、「入力できるのは発表者だけで、他の人は見るだけ」といった設定をすることも可能です。
! Screenとは
Screenは、KTermなどの物理端末と、その中で動くシェルなどのプログラムの間に立ち、ひとつの物理端末を複数のプログラムで共有することができるソフトです。Screenのinfoを見ると「ウインドウマネージャ(window manager)」という表現が出てきますが、この「ウインドウ」とは、物理端末の中で動いている仮想的な端末のことを指しています。また、Screenでは、物理端末を「ディスプレイ」と呼んでいます。
!! 1つのディスプレイの中で複数のウインドウを使うことができる
アクティブなウインドウ、つまり見たり操作したりすることができるウインドウはその中のひとつだけですが、それ以外のウインドウも裏できちんと動いており、簡単なキー操作ですぐに切り替えることができます。
!! ディスプレイからセッションを自由に切離したり、接続したりできる
Screenの管理するウインドウの集まりをセッションと呼びます。通常、Screenを起動すると、そのディスプレイに対してセッションをアタッチ(接続)しますが、デタッチという操作を行うことによって接続を切断することができます。
デタッチされたセッションは、レジュームという操作を行うことで、再度ディスプレイに接続することができます。
また、複数の端末が1つのセッションに同時にアタッチすることもできます。
!! 仮想端末の豊富な機能を使用することができる
例えば、バックスクロールやログ出力、ウインドウ間で共通に使用可能なコピー/ペースト、などの機能です。もちろん、これらの機能を呼びだすのにマウスを使う必要はありません。
! Screenの基礎知識
!! 用語
すでに前節でもある程度書いてしまいましたが、ここで、Screenでよく使う用語などをまとめておきます。
図: セッションとディスプレイの概念図
Screenセッション1 ディスプレイ1 -----→ ウインドウ1 ↑ ウインドウ2 | ウインドウ3 ←-------ディスプレイ2 | ↑ +----------→ レジスタ ←---------- コピー/ペースト コピー/ペースト 1. 現在、2つのディスプレイがセッション1にアタッチしています。 2. ディスプレイ1のアクティブなウインドウはウインドウ1です。 ディスプレイ2のアクティブなウインドウはウインドウ2です。
- ディスプレイ(display)
- 物理端末のことを指します。KTermなどの端末エミュレータも、便宜上この「物理端末」に含めます。つまり、Screenが動くことができる実際の端末を一般的にディスプレイと呼びます。
- ウインドウ(window)
- Screenによって作られる仮想的な端末。
- セッション(session)
- Screenが管理するウインドウの集まり
- アタッチ(attach)
- セッションをディスプレイに接続すること
- デタッチ(detach)
- セッションをディスプレイから切離すこと
- レジューム(resume)
- デタッチされたセッションを再度ディスプレイにアタッチすること
- コマンドキー(command character)
- Screenの機能を呼び出すときに使うキー。デフォルトでは^A(CTRL + A)となっています。
- レジスタ
- コピー/ペーストで使う変数です。この変数を変えることで、複数の内容を記憶しておくことができます。レジスタには1文字の名前がついています。
- アクティブ
- ウインドウが表示/操作可能になっている状態です。つまり、ディスプレイに表示されていて、いじることのできる状態ということです。アクティブになれるウインドウは1ディプレイあたり1つだけです。
- メッセージライン
- Screenの出すメッセージが表示される場所をメッセージラインといいます。詳しくはすぐ後の節で解説します。
!! 入手方法
2003年11月中旬の時点では、公式ミラー(http://www.gnu.org/prep/ftp.html) には最新バージョンである4.0.1は存在しないようです。同様に、ひとつ前のバージョンである4.0.0も存在しないようです。
これらのバージョンは、Screenのホームサイトである
ftp://ftp.uni-erlangen.de/pub/utilities/screen/
または、でかいのネットさんのミラーから入手できます。
ftp://www.dekaino.net/pub/screen/
!! 情報源
Screenを使うにあたって、まず最低限チェックしておきたいものを以下にまとめました。公式フォーラムや、Webページなどについては本稿最後にまとめて紹介します。
!!! マニュアル(man)
コマンドラインオプションとScreenのコマンド、キーバインドなどが簡潔にまとめられています。
!!! info
マニュアルよりも詳細な解説を読むことができます。複雑な機能も、サンプルコードを読むことで理解が進むでしょう。
!!! NEWSファイル
ソースの中にあるファイルです。前のバージョンから変わった部分がまとめてあります。簡単なサンプルがつくこともありますので、チェックしましょう。
!! 設定ファイル
ホームディレクトリに.screenrcというファイルを置くと、Screenの起動時に読み込んで評価してくれます。まずはソースファイル内にある etc/screenrcをコピーして、それを少しずつ変更しながら使ってゆくのがよいと思います。
最低限おさえておきたい設定項目をまとめておきます。
!!! コマンドキーとリテラルコマンドキー
escape [A][B]
コマンドキーとリテラルコマンドキーを、ぞれぞれ[A]、[B]にします。デフォルトでは
escape ^Aa
となっています。「^」はCTRLキーを意味します。つまり、コマンドキーは^A、リテラルコマンドキーはa ということです。
リテラルコマンドキーとは、コマンドキーとして登録されている文字そのものを入力したいときに用いるキーです。例えばデフォルトの「escape ^Aa」という設定の場合、^Aというキー操作はScreenの機能呼び出しのために使われてしまい、Screenの中で動いているアプリケーションに「^A」という文字を渡すことができなくなります。そのような場合に、^Aa とすることで、アプリケーション側に ^Aそのものを送ることができるようになります。
Emacsをお使いの場合は、^Aというのは頻繁に使われるキーだと思います。そのため、あらかじめあまり使わないキーをコマンドキーとして割当てておくことをおすすめします。筆者は 「escape ^Ta」としています。
ただし、以後の説明では、デフォルトの設定、つまり escape ^Aa の状態を仮定しています。そのため、ここでコマンドキーを^A以外に変更された方は、適宜読み換えるようにしてください。
!!! エンコーディング
defencoding 入力側 出力側
入力側、出力側のエンコーディングを指定します。通常、この設定を行う必要はないはずですが、Screenを起動すると中の文字が化ける、といった場合にはこれらの設定を変更してみましょう。
指定可能なエンコーディングについては、infoを御覧下さい。
!! メッセージライン
使用している端末がステータスラインを持っている場合、Screenはそれをメッセージライン表示のために用います。ステータスラインがない場合は、端末の最下行を使います。
messageline.png メッセージライン。一定時間経つと消えます。
termcap/terminfoをいじることで、タイトルバーをメッセージラインに使うこともできます。ソースファイル内にある etc/screenrc には、そのような設定の例も入っています。
! Screenの基本的な機能
!! 起動
KTermなどの端末の中で
% screen (「%」はプロンプトです)
とすることで起動します。screenにはいろいろなコマンドラインオプションがあり、すでに動いているscreenのセッションに対して指示を送ったりするときにもscreenコマンドを使います。
screenコマンドを実行すると、以下のようなタイトル画面が現れるはずです。
title.png タイトル画面
SPACEキーまたはEnterキーを押すと、タイトル画面は消えて、シェルが起動します。
!! ヘルプ画面の表示
まず何よりも先に覚えておいていただきたいのは、ヘルプ画面を表示するキー操作です。
^A? (helpコマンド)
help.png ヘルプ画面
実際には、キー操作と、実行されるScreenのコマンドの名前との対応表となっています。詳しくは本稿後半で扱いますが、Screenでは、コマンドの名前を直接指定して機能を呼び出すこともできます。
!! ウインドウ番号とウインドウ一覧
Screenを起動した後に立ち上がったシェルは、Screenが作ったウインドウの中で動いています。ウインドウにはそれぞれ番号がついており、最初に作られたウインドウは0番、次は1番...というようになっています。
作られているウインドウの一覧を見るには、
^Aw または ^A^W
とします(windowsコマンド)。
windowlist1.png ウインドウ一覧(メッセージラインに表示されています)
0*$ zsh
このメッセージの形式は以下のようになっています。
- ウインドウの番号
- ウインドウの状態をあらわす記号
- ウインドウのタイトル
2番目の「ウインドウの状態をあらわす記号」については、まず以下の2つを覚えておいてください。残りの記号については、コラムを御覧下さい。
- *
- 現在アクティブなウインドウ
- -
- 直前にアクティブだったウインドウ
以上の内容から、
- 現在、ウインドウは1つだけで、ウインドウ番号は0
- そのウインドウは現在アクティブである
- ウインドウ番号0のタイトルは「zsh」
ということが理解できます。つまり、screenを起動すると「ウインドウが1つだけ作成され、0番という番号がつけられる」という状態になることが分かります。
!! ウインドウ作成
^Ac または^A^C または ^AC (screenコマンド)
とすると、新しいウインドウが作られ、そのウインドウがアクティブになります。
windowlist2.png ウインドウ1が作られた状態
0- zsh 1*$ zsh
- ウインドウは2つで、それぞれウインドウ番号は0と1
- ウインドウのタイトルはどちらも「zsh」
- 1番が現在アクティブになっている
- 0番は、その前にアクティブだった
ウインドウにはそれぞれタイトルをつけることができます。デフォルトでは起動したシェルの名前となります。例えばzshを使っている場合は、特に何も指定しないと「zsh」がタイトルとなります。
!!! コラム: ウインドウの状態をあらわす記号
本文で触れた 「*」(現在アクティブなウインドウ)、「-」(直前にアクティブだったウインドウ)の他に、以下の記号がよく出現します。
- $
- ログインしているウインドウ
- !
- ベル(^G)を受信したウインドウ
- @
- モニタ中に変化を感知したウインドウ
!!!! ログイン
Screenは、utmp(5)を操作することで、それぞれのウインドウをログインレコードとして残すことができます。デフォルトではこの機能がオンになっていますが、loginコマンドを使うことでオン/オフのトグルを行うことができます。
login.png loginコマンドによるwコマンドの結果の変化
loginをオフにした結果、wコマンドを発行している自分自身が表示されなくなっていることが分かります。ここで登場した screen -X というコマンドについては後の節で解説します
!!! ベルとモニター
1つのディスプレイで表示/操作できるウインドウは1つだけです。裏で動いているウインドウは、次の節で見るように、簡単に切り替えることができるのですが、モニター機能を使用すると、裏で動いているウインドウの変化をメッセージラインで知らせてくれます。
monitor1.png モニター表示
このとき、^Aw(windowsコマンド)で確認すると、該当するウインドウには「@」というマークがついています。
monitor2.png ウインドウの状態。「@」というマークに注目
同様に、アクティブでないウインドウがベル文字(^G)を受信すると、メッセージラインで知らせた後、該当するウインドウに「!」がつきます。
bell1.png ベル受信時のメッセージ bell2.png ウインドウの状態
tail -F /var/log/messages などでログの監視をしているウインドウに対してモニタを有効にしておくと、新しいメッセージが追加されるたびに知らせてくれるので便利です。一方、時間のかかるコンパイルなどの処理の後にはベル文字による通知を使うとよいでしょう。
!! ウインドウ切り替え
前節で、ウインドウを新たに1つ作成したため、現在ウインドウは2つとなっています。^Aw で再度確認してみましょう。
0- zsh 1*$ zsh
「*」マークは1番についていますので、現在1番のウインドウがアクティブになっていることが分かります。
アクティブなウインドウを切り替えるには、以下のような方法があります。
- ^A[ウインドウ番号] (selectコマンド)
- ^Anまたは^A^Nまたは^A[SPACE] (nextコマンド)
- ^Apまたは^A^P (prevコマンド)
- ^A" (windowlistコマンド)
- ^A^A (otherコマンド)
!!! ^A[ウインドウ番号] (selectコマンド)
指定した番号のウインドウをアクティブにします。ウインドウ番号として指定できるのは0から9までの10種類となります。
といっても、ウインドウが10枚までしか作成できないというわけではありません。デフォルトでは、最大40枚まで作成できます。ウインドウ番号が10番以上のウインドウに切り替えるためには、後に紹介するwindowlistコマンドを使うとよいでしょう。
!!! ^Anまたは^A^Nまたは^A[SPACE] (nextコマンド)
次のウインドウ、つまり番号が次に大きいウインドウをアクティブにします。自分が一番大きいウインドウ番号を持っているときは、一番小さい番号を持つウインドウをアクティブにします。
例えば、2番のウインドウで^An とすると、3番、4番、5番...と順番に探して、最初に見つかったウインドウをアクティブにします。
2番のウインドウが最後のウインドウの場合は0番から順番に探して、最初に見つかったウインドウをアクティブにします。
!!! ^Apまたは^A^P (prevコマンド)
^Anと逆の動きをします。
図: 例: ウインドウが3枚ある場合
^Ap ←--------- 0---------→ 1 | ↑ ^An |↑ | | ||^Ap ^Ap| |^An ^An|| ↓| || 2 ←---------+| --------------+
!!! ^A" (windowlistコマンド)
^Awと同じように、ウインドウの一覧を表示しますが、こちらはメッセージラインではなくてウインドウ全体を使用します。
windowlist.png ^A" の出力例
カーソルを上下に動かして、Enterを押すとそのウインドウがアクティブになります。
!!! ^A^A (otherコマンド)
直前にアクティブだったウインドウに切り替えます。たとえば、0番から1番に切り替えた場合、^A^Aとすると0番に戻ることができます。
図: otherコマンドの動作
1. 0番から1番に切り替え 2. ^AA で0番に戻る
^An ^AA 0 ------→ 1 0 ←------- 1
2 2
実行後のwindowsコマンドの表示例 0-$ zsh 1*$zsh 2$ zsh 0*$ zsh 1-$zsh 2$ zsh
1. 0番から2番に切り替え 2. ^AA で0番に戻る
0 1 0 1 | ↑ | ^Ap | ^AA ↓ | 2 2
0-$ zsh 1$ zsh 2*$zsh 0*$ zsh 1$ zsh 2*$ zsh
windowsコマンドの表示を見ると分かるように、^AA の動作は、「そのコマンドが実行されるとき(図中では1の実行後の状態)にウインドウに『-』マークがついているウインドウに切り替える」ということになります。
!! スクロールバッファとコピー/ペースト
Screenでは、画面から流れていってしまったテキストを一定の行数保存しています。デフォルトでは100行ですが、サンプルのscreenrcをコピーした場合は1000行にする設定が入っています。
defscrollback 1000
このスクロールバッファはウインドウごとに持っており、ウインドウごとの行数を変更することもできます。
例: アクティブなウインドウのスクロールバッファを100行にする scrollback 100
Screenのコピー機能は、このスクロールバッファを利用します。コピーモードに入ると、ウインドウへの本来の入出力がストップして、スクロールバッファを操作する専用のキー操作を受け付けるようになります。
!!! ^A[ または ^A^[ (copyコマンド)
コピーモードに入ります。コピーモードにおける主要なキー操作は以下の通りです。
- hjkl
- カーソル移動(viなどと同様です)
- ^または0
- 行頭に移動
- $
- 行末に移動
- H
- ディスプレイ最上部に移動
- L
- ディスプレイ最下部に移動
- G
- Lと同じですが、数字を入力後にGを入力すると、ディスプレイ最下部から指定した行数だけさかのぼった場所に移動します
- g
- バッファ最上部に移動
コピーモードでEnterキーを押すと、そこがコピーの始点となります。再度Enterキーを押すと、始点からの範囲をレジスタと呼ばれる記憶領域にコピーします。
!!! ^A] または ^A^] (pasteコマンド)
コピーした内容をペーストします。
!!!! コラム: 矩形コピーについて
- c
- 左マージンを設定
- C
- 右マージンを設定
- J
- 選択範囲の行を結合
Emacs (-nw) では、次の行に続くときにバックスラッシュ記号が行末につきますが、これがコピーの邪魔になるときがあります。そこで、
- 普段通りに開始位置を決める
- 100l などとして画面右端に移動。端末の横幅よりも大きな値ならなんでもよい
- h で1つ左に移動
- C で右マージン設定。つまり終点のカーソルより右側はコピーの対象にならない
- j で終点まで移動
- J で行を結合
- EnterかSPACEで終点を確定
とすると、行末のバックスラッシュを抜いて、さらに行が結合された状態でペーストバッファに入ります。
rectcopy.png 通常のコピーと矩形コピーの比較。通常のコピーでは行末のバックスラッシュがそのままコピーされてしまっている
矩形コピーの応用として、Emacsのeval-buffer風の操作を、Screenのコピーで行う設定を以下に示します。
register c '1000lhCJ ' bind , eval "process c" "screen" "stuff 'screen -X '" "paste ." "stuff '^M'" "stuff 'exit'" "stuff '^M'"
使いかたは以下の通りです。
- 通常通り、コピーモードに入って始点を決定する
- コピー終了の行まで移動し、EnterやSPACEのかわりに ^A, と入力する
先程の例で挙げたような「最後のスラッシュ記号を回避して結合」を実行した後、終点決定し、別ウインドウを開いてscreen -X にその内容を与えます。
!! セッション管理: アタッチ/デタッチ/レジューム
ディスプレイ(端末)をScreenのセッションから切離すことをデタッチといいます。「KTermなどの中で何かプログラムを走らせているときにXが落ちてしまった」「うっかりKTermを閉じてしまった」というような場合、その中で動いているプログラムも道連れになってしまいますが、Screenの中で動いているプログラムは、ディスプレイが閉じてしまった場合でも、止まらずに動き続けることができます。
図: セッションの状態遷移
回線切断や強制切断(^Ad、screen -dなど) アタッチ --------------> デタッチ <------------ レジューム(screen -r)
デタッチされたセッションは、
% screen -r
とすることで、レジューム、つまりその端末と再度接続することができます
デタッチが起きるのは、下記のような場合です。
- ^A^D または ^Ad (detachコマンド) または、^AD(pow_detachコマンド)が実行された
- 他の端末からscreen -d が実行された(リモートデタッチ)
- ディスプレイが何らかの原因で終了した
!!! コラム: マルチディスプレイモード
すでに紹介した通り、Screenでは、複数のディスプレイで同時に1つのセッションを操作することができるようになっています。
過去のバージョンでは、これらの機能がなかったり、制限事項つきだったりしたため、例えば
- 学校のマシンでScreenを立ち上げておく
- 帰宅してから学校に接続する
- 学校のマシンにログインして、Screenのセッションに接続してから作業の続きをする
といった場合、学校を去るときにデタッチしておくか、帰宅してからscreen -d -r としてデタッチの後にレジュームして作業を行い、そして翌日(かどうかは分かりませんが)登校したときにまたscreen -rとして作業を続ける、といった方法を使う必要がありました。
最近のバージョンのScreenでは、自宅から学校のマシンにログインして
% screen -x
とすることで、学校のマシンはScreenにアタッチしたまま操作を続けることができます。そのため、
- ノートパソコンでScreenを立ち上げておく
- 隣のデスクトップパソコンでノートパソコンにログインする
- screen -x でセッションを共有する
とすることで、冒頭で挙げた例のように、ノートパソコンとデスクトップパソコンの両方で同じ画面を操作することができます。ちょうどこの原稿もそんな調子で書いています。広い画面とHHK Professionalのおかげで気持よく原稿が書けているように思います。(これで書くスピードも上がってくれれば文句ないのですが)
!! コマンド
今までの説明で、キー操作の後に「(〜コマンド)」という注記があったのはお気付きかと思います。Screenでは、キー操作によって呼び出すことのできるコマンドには、すべて名前がついています。より正確には、あるコマンドを特定のキー操作に割当てる(bind)ことができます。
^A:コマンド名 引数
とすることで、それらのコマンドを直接呼び出すことができます。たとえば、先程から何度も登場してきた、ウインドウの一覧を見る操作(^Aw )にはwindowsというコマンド名がついていますので、
^A:windows
とすることで、^Aw と入力したときと同じ結果になることが分かります。なお、^A: というコマンド自体も、colonというコマンドに対応しています。
すでに説明したように、^A[ウインドウ番号] で切り替えることができるウインドウはウインドウ番号が1桁のものに限られるのですが、
^A:select 10
などとすれば2桁のウインドウ番号にも切り替えることができます。あるいは、
^A:select
と、引数なしでコマンドを実行すると、
Switch to window:
というプロンプトがメッセージラインに表示されますので、ひきつづきウインドウ番号を入力することができます。
必須の引数が不足している場合は、上のような入力用プロンプトが出るか、メッセージラインに使用法が表示されるようになっています。
なお、.screenrcに記述されるのは、こういったコマンドそのものです。Screenは、起動時にその内容を上から実行してゆきます。
!! コマンドラインオプション
従来から、デタッチ、レジュームなどはコマンドラインからも行うことができましたが、最近のバージョンでは -X オプションを使うことでScreenのコマンドを自由に呼び出すことができるようになっています。例えば、
% screen -X windows
とすると、Screenにアタッチしているセッションの中でwindowsコマンドを実行したのと同じ結果を得ることができます。
この操作は、Screenのセッションとは無関係の端末からでも実行することができますが、セキュリティの制限をしている場合は実行できません(コラム: セキュリティ設定参照)。また、Screenのセッションが複数個ある場合は、コマンドを実行するセッションを特定する必要があります(コラム: セッションの特定 参照)。
!!! コラム: セキュリティ設定
password [パスワード]
パスワードを設定します。ここで指定するパスワードは、Screenによって暗号化されたものにする必要があります。手順は以下の通りです。
- ^A:password として、引数なしでpasswordコマンドを呼び出す
- 設定したいパスワードを2回入力する
- ペーストバッファに暗号化されたパスワードが入るので、.screenrcなどにペーストする
パスワードに「none」を指定することでパスワードを無効にすることができます。
パスワードで保護されたセッションでは、screen -X によるコマンド発行が不可能になります。また、screen -x / -r などの、アタッチコマンドは、正しいパスワードを入力しないと実行できなくなります。
ただし、リモートからのデタッチ(screen -d)は、パスワードあり/なしに関わらず成功します。これはKnown Bugsに明記されているように望まれた動作ではないようです。
!!! コラム: セッションの特定
Screenのセッションには、それぞれ名前がついています。
% screen -ls
とすることで、セッションの一覧を見ることができます。
screen-ls.png セッション一覧
There are screens on: 622.ttyp0.highmaster (Attached) 1009.ttyp4.highmaster (Attached) 2 Sockets in /tmp/screens/S-screen.
622.ttyp0.highmasterや1009.ttyp4.highmaster がセッションの名前です。
セッションのPID + . セッション名
という形式になっています。セッションの特定には、セッションのPID、またはユニークな値を持つセッション名によって行われます。セッション名はデフォルトではtty.ホスト名となっていますので、上記のような例ではセッション名をセッションの特定には使用できません。そのため、デフォルトの状態ではセッションの特定にはPIDを使用することになります。
セッションと無関係の端末から、セッションを操作するコマンド、例えば-Xコマンドや、デタッチ/レジューム関係のコマンドなどを実行する場合、操作可能なセッションが複数個あるにもかかわらずセッションを特定しなかったときは以下のようなエラーが発生します。
session1.png セッションが特定できないことを示すエラー。
画面の例の通り、-Sオプションでセッションを指定することでうまく動きます。
後の節で見るように、sessionnameコマンドでセッションごとのセッション名を変更することで、セッション名を特定に使用することができます。
!! ウインドウを閉じる
ウインドウが作られたときに起動したプログラムが終了すると、そのウインドウも閉じられます。
強制的に閉じる場合は以下のコマンドを使います
kill (^Ak または ^A^K)
!! Screen終了
すべてのウインドウが閉じられると、Screenも終了します。
以下のコマンドを使うと、強制的に終了させることができます。
quit (^A^\)
すべてのウインドウをkillして終了しますので、レジュームすることはできません。
! Screenの進んだ機能
!! ディスプレイの分割
ディスプレイを複数のリージョンに分割して、それぞれに別々のウインドウを表示させる機能です。
split.png 分割されたディスプレイ
よく使うコマンドをまとめておきます。
!!! ^AS (splitコマンド)
ディスプレイを上下2分割します。
!!! ^A^I (focusコマンド)
複数あるリージョンのうち、フォーカスのあるリージョン、つまり操作可能なリージョンは1つだけです。focusコマンドにより、次のリージョンにフォーカスを移すことができます。
!!! ^AQ (onlyコマンド)
フォーカスのあるリージョンを残して、他のリージョンをすべて閉じます。
!!! ^AX (removeコマンド)
フォーカスのあるリージョンを閉じます。
!!! resizeコマンド
resize [数値]
フォーカスのあるリージョンのサイズを変更します。よく使われる指定方法は以下の通りです。
- +N
- N行増加
- -N
- N行減少
- N
- N行にする
!! Screenへの命令
すでに見てきたように、Screenのセッションに指示を出すには、以下のような方法が使えます。
- .screenrcに記述する
- コマンドキーを使う
- ^A: (colonコマンド)を使う
- screen -X を使う
colonコマンドは、バインドされてないコマンドの呼び出しに使用することができます。よく使うコマンドについては、あらかじめ.screenrcでバインドの設定を行っておくとよいでしょう。
!! キーバインドの設定
bind [-c クラス名] キー コマンドライン
指定したキーに対して、指定したコマンドを割当てます。例えば、.screenrcに
bind , windowlist
と書いておくと、^A, というキー操作でもwindowlistコマンドを呼び出すことができるようになります。
!!! コラム: bindのクラスについて
bindコマンドで指定するクラス名は、同じキーバインドに対して状況に応じて別のコマンドを割当てることを目的としてつけるものです。
筆者は昔からディスプレイの分割機能をあまり使いこなせていないのですが、リージョン操作がいまひとつ連想しづらいキーバインドになっていて馴染めないということが理由の一つとしてあるように思えました。
そこで、せめて操作を覚えやすくしようと、以下のようなクラスつきのバインドを設定しました。
bind -c REGION 2 split bind -c REGION 1 only bind -c REGION 0 remove bind -c REGION o focus bind -c REGION \^ resize bind ^X command -c REGION
この設定によって、Screenのリージョン操作を、筆者が慣れ親しんでいるEmacsのバッファ操作のコマンドに似せることができます。つまり、Emacsのバッファ操作のコマンドの前に、Screenのコマンドキーをつけることで、Screenのリージョンを操作することができるようになります。たとえば、^A^X2 はリージョン2分割、^A^Xo は次のリージョンにフォーカスを移動、そして^A^X0 はフォーカスのあるリージョンを閉じる、といった具合です。
ここで使われている commandコマンドは、コマンドキー(^A)を発生するコマンドです。例えば ^A:command とした後に、1 を押すことで、^A1 としたときと同じ結果となります。これだけではあまり意味がありませんが、commandコマンドは、-cオプションでクラスを指定することができます。クラス指定つきでcommandコマンドが実行されたときは、次に続くキーは同じクラス名でバインドされた設定が有効となります。
上記の例では、通常は^A2 とすると、2番目のウインドウに切り替える(select 2)のに対して、^A^X2とすると、REGIONというクラスのバインドが有効になり、結果としてsplitコマンドが実行されます。
このように、クラスと、そのクラスのコマンドキーを発行させるcommandコマンドの組み合わせによって、3ストローク以上のキーバインドが実現できます。
!!! コラム: メッセージのフォーマットについて
本文では触れませんでしたが、リージョンの最下行に出ているリージョンのタイトルのことをキャプションと呼びますが、そのキャプションの出力形式は、設定によって変更することができます。同様に、windows/windowlistコマンドの出力形式も変更することができます。詳しくはinfoの「String Escapes」節を御覧下さい。
!! タイトルの変更
Screenのウインドウは、番号とタイトルによって区別されます。デフォルトでは、ウインドウを作成したときに起動したシェルの名前になりますが、以下の方法で指定、あるいは変更することができます。
- screen -t でタイトル指定してウインドウを作成
- ^AA(titleコマンド)で変更
- エスケープシーケンス(ESC-k[文字列]ESC-\)で変更
Screen内のコマンドとしても、プログラム起動時のオプションとしてもscreen -t は使用可能です。
動的にタイトルを変えたい場合(例えば、カレントディレクトリをタイトルにしたい場合など)は、エスケープシーケンスを使うとよいでしょう。
PROMPT='^[k%~^[\%~ '
上記のように指定すると、カレントディレクトリをウインドウのタイトルにすることができます。なお、zshの場合^[ は^V^[ で入力できます。
title2.png ウインドウタイトル
zshの場合は、preexecを使うことで、最後に実行されたコマンドの名前をタイトルにすることもできます。
!! screenを呼び出してウインドウを作成する
Screenのセッションの中からscreenを起動すると、新しいウインドウを作成できます。つまり^Ac(screenコマンド)と同じ効果があります。例えば、
% screen -t TOP top
などとすると、新しいウインドウを作成し、タイトルをTOPにして、topコマンドを実行します。topコマンドが終了すると、そのウインドウはなくなります。
!! レジスタの利用
コピー/ペーストの媒介をする変数をレジスタと呼びます。特に、copyコマンド(^A[)で使用される「.」という名前のレジスタはペーストバッファと呼ばれ、少々特殊な扱いを受けています。
!!! readreg コマンド
readreg [-e encoding] [レジスタ名 [ファイル名]]
ファイルの内容をレジスタに保存します。このコマンドはペーストバッファを対象にすることはできないようです。ペーストバッファにファイルの内容を入れるには、readbufコマンドを使うか、readregコマンドとpasteコマンドを併用します。
!!! register
register [-e encoding] レジスタ名 文字列
文字列をレジスタに保存します。ペーストバッファに対しても有効です。
!!! paste
paste [ソースレジスタ [出力レジスタ名]]
ソースレジスタの内容を出力レジスタに出力します。ソースレジスタは複数個指定可能です。また、出力レジスタが省略された場合は、アクティブなウインドウに対して出力されます。
ファイルの内容を ^A] でペースト可能な状態にするには、以下のようにreadregで一時レジスタに保存した後、pasteでその内容をペーストバッファにコピーします。
readreg a /etc/motd paste a .
あるいは、次のreadbufコマンドを使用します。
!!! readbuf
readbuf [-e encoding] [ファイル名]
ファイル名の中身をペーストバッファにコピーします。このコマンドは ^A< に割当てられています。
ファイル名を省略すると、/tmp/screen-exchangeというファイルが対象となります。ペーストバッファの内容を書き出すwritebufコマンドと併用すると、ユーザ間でペーストバッファの共有をすることができます。
!!! process
process [レジスタ名]
レジスタの内容をペーストします。ペーストしたデータがScreenの入力バッファを通るという点がpasteコマンドと異なります。
process.png processとpasteの違い
どちらも、^A:windows という文字列が入ったaというレジスタに対しての操作ですが、paste した場合はその内容がそのまま出力されているのに対し、processした場合はScreenの入力バッファを通ることでコマンド入力待ち状態になっていることが分かります。
processコマンドを使うことで、レジスタ内に構成した文字列をScreenの指示として使用することができます。
!!! stuff
stuff 文字列
文字列をペーストします。レジスタを介さない分、動作が軽いようです。この出力はScreenの入力バッファを介さないため、processのかわりには使えません。
!! マルチユーザモード
Screenのセッションは、複数のユーザで共有することができます。また、接続してきたユーザに対して、きめ細かい許可属性の設定をすることができます。
!!! multiuser
multiuser onまたはoff
マルチユーザモードを有効または無効にします。マルチユーザモードを有効にすると、別のユーザがセッションに接続することを許可することができます。
ただし、マルチユーザモードを有効にしても、接続したいユーザに対して接続許可を別途与えないと、接続することはできません。
multiuser1.png ユーザ「screen」がユーザ「zinnia」のセッションに接続しようとして断られた様子
screen -ls zinnia/
によって、ユーザ「zinnia」のセッション一覧を見ることができます。最後のスラッシュを忘れないようにしてください。
screen -x zinnia/PID
で、接続を試みますが、接続許可がないため失敗しています。
!!! acladd
acladd ユーザ名[,ユーザ名...]
指定したユーザに対して、自セッションの全ての操作権限を与えます。上記の例の場合、ユーザ「zinnia」が、自分のセッションの中で
acladd screen
を実行すると、ユーザ「screen」がセッションに接続できるようになります。
!!! aclchg
aclchg ユーザ名リスト 許可属性 リスト
指定したユーザに対して、リストで指定されたウインドウ/コマンドに対する操作権限を与えます。
リストは以下の要素をカンマで区切ったものです。
- ウインドウ: ウインドウ番号、またはウインドウのタイトルによって指定
- コマンド: コマンド名で指定
「#」 は、すべてのウインドウにマッチします。また、「?」はすべてのコマンドにマッチします。
許可属性には w、xがあります。wは入力の許可属性、xはコマンドの実行許可属性をあらわし、前に+をつけることで許可、-をつけることで不許可をあらわします。
たとえば、
aclchg screen -w "#?"
とすると、ユーザ「screen」は、セッションに対して一切の操作ができなくなります。つまり、接続したときの状態のまま、ただ見るだけ、という状態です。
acladdコマンドは、aclchg ユーザ名リスト +rwx "#?"と同義です。つまり、すべてのウインドウに対して全ての操作権限を与えます。属性「r」については、現在未使用のようです。
!!! acldel
acldel ユーザ名リスト
指定されたユーザの権限情報をすべて削除します。
!!! aclgrp
aclgrp ユーザ名 [グループ名]
指定したユーザを指定したグループに設定します。グループ名として指定するのは、そのグループのリーダとなるユーザ名です。例えば、
aclgrp screen zinnia
などとすると、ユーザ「zinnia」がリーダのグループに、ユーザ「screen」が所属します。結果として、ユーザ「screen」の権限がユーザ「zinnia」と同じになります。
複数のユーザに対して同じ権限を与えたい場合、特定のユーザに対して権限を設定した後、aclgrpでその内容を他のユーザにも与える、というような使いかたをします。
! Screenの応用
!! プログラムの実行結果をペーストバッファに保存
プログラムの実行結果をエディタに貼り付ける場合、Screenを使っていなければ、
- 一時ファイルにリダイレクトしてエディタに挿入
- 端末の持っているコピー/ペーストの機能を利用
などという方法を使うことになると思います。
Screenを使っている場合、すでに解説したコピー/ペーストの操作を行うことで、画面に入りきらないような長い内容でもコピーできますが、さらに工夫してみます。
zsh限定になってしまいますが、以下のようにすることでプログラム、この場合は「wc l *.[ch]」の実行結果をペーストバッファにコピーすることができます。
% screen -X readbuf =(wc -l *.[ch])
さらに、.zshrcなどで
regcmd() { screen -X readbuf =(echo % $@ && eval $@) }
といった関数を用意しておくと、
% regcmd wc -l *.[ch]
とすることで、以下のような内容をペーストバッファに保存することができます。
% wc -l lua_context.c main.c sps.h 93 lua_context.c 109 main.c 45 sps.h 247 total
グロブを展開してほしくない場合や、パイプで繋げたコマンドの出力を対象にしたい場合は、コマンド全体をクォートしてください。
% regcmd 'wc -l *.[ch] | grep total'
ペーストバッファには以下の内容が保存されます。
% wc -l *.[ch] | grep total 247 total
!! コマンドラインから新しいウインドウを作成させる
すでに説明した通り、Screenのセッションの中でscreenコマンドを実行すると、新しいウインドウを作成することができます。
!!! w3mとの併用
後で紹介する筆者のページでも扱っていますが、w3mの外部ブラウザとしてScreenを組み合わせると大変便利です。
外部ブラウザは、デフォルトでは「M」で起動できます(EXTERN)。
たとえば、外部ブラウザ(External Browser)に
screen w3m $@
というものを指定して、M を押すと、現在見ているページを新しいウインドウで表示することができます。
また、ESC-M で、リンク先を外部ブラウザで起動できますので(EXTERN_LINK)、上記設定をしておくと、リンクを新しいウインドウで表示することができます。
他にも、
screen wget $@
といったものを外部ブラウザに指定しておいて、ESC-M でリンクを辿ることで、リンク先をwgetで取得することができるようになります。ダウンロード処理は別ウインドウで行われていますので、w3mでひきつづきブラウズを続けることができます(最近のw3mはダウンロードマネージャがあるので不要かもしれませんが)
また、
screen -X register .
を外部ブラウザにすることで、現在のページ、あるいはリンク先のURLをペーストバッファにコピーすることができます。w3mで見ているページのURLをエディタに貼り付けたい場合などに便利です。
!! ペーストバッファの内容をGoogleで検索する
レジスタやstuffコマンドを駆使して、キーボードマクロ風の動作をさせることができます。以下の2つの方法が考えられます。
- ペーストバッファの内容を検索条件としたURLを作成し、w3mの引数に渡して起動
- w3mでGoogleを開き、カーソルを検索文字列入力部分に移動させ、ペースト
前者の場合、一発で目的のページを表示できるようになる反面、日本語などを含む文字列を検索したい場合、エンコードの処理などが少々面倒です。
後者の場合は、エンコードなどはw3mがやってくれますが、Googleのインターフェースが変わるたびに仕組を再検討する必要がありますので、Googleに橋渡しをしてくれる専用のページを用意するなどして回避する必要があるかもしれません。
今回は、直接Googleのページにアクセスして、移動して検索するという流れでやってみたいと思います。
google1.png
!!! その1 レジスタで構成する
- タブでリンクを移動 x 4 で入力フォームに到達。その場でEnter押して入力モードに入る
- ペーストバッファの内容をペースト
- Enterを押して入力モードから抜ける
- タブ1回で「Google検索」ボタンに移動
- Enterで「Google検索」ボタンを押す
このような手順でいけそうです。キー操作を取り出してみると以下のようになります。
^I^I^I^I^M^A:paste a^M^M^I^M
それに先立って、ペーストバッファの内容をレジスタ「a」に入れておきます。
^A:paste . a^M
さらに、新しいウインドウを作成し、w3mを起動させる処理を入れます。このように構成された文字列をレジスタyに格納し、^Ax でその内容を実行させます。
register y "^A:paste . a^M^A:screen -t Google w3m http://www.google.co.jp/^M^I^I^I^I^M^A:paste a^M^M^I^M" bind x process y
Screenのコマンドを連続して発行させるためにprocessコマンドを使用しました。単純にキー操作を並べるだけなので理解しやすいですが、コマンドキーが^Aであることを仮定したものになってしまっているのが少々難ありです。
^Aを直接記述している部分を、 commandコマンドに置き換えることで、コマンドキーの設定に依存しないようにすることができますが、次の方法のほうがより見やすくなるでしょう。
!!! その2 stuffで流しこむ
bind x eval "paste . a" "screen -t Google w3m http://www.google.co.jp/" "stuff '^I^I^I^I^M'" "paste a" "stuff '^M^I^M'"
eval コマンドは、続く文字列をScreenのコマンドとして評価するコマンドです。Screenのコマンドと、実際のキー操作が分けられているため、見やすくなっています。また、コマンドキーを他のキーに変更している場合でも動作します。一方で、操作がもっと複雑になったときにちょっと冗長になってしまうのが難点です。
!!! ちょっとした変形
上記2つの例は、いずれもペーストバッファにあらかじめ検索したい文字列を入れておく必要がありました。この操作をある程度自動化してみましょう。
「その1」に対する変形となっています。 register y "^A[\^^M$^M^A:paste . a^M...(以下同じ)
とすると、^A[ でコピーモードに入り、^で行頭に移動(\でエスケープしています)、Enterで開始位置を確定した後、$で行末に移動し、Enterでコピー範囲を確定、つまり、カーソルのある行全体を検索候補にすることができます。
register y "^A[wb^Me^M^A:paste...(以下同じ)
同様に、カーソルのある単語を検索候補にします。
!! マルチユーザモードの応用
!!! プレゼンテーション向け設定
ここで扱うプレゼンテーションとは、以下のようなものを想定しています。
- 聴衆の目の前にもPCがある
- 話者のPCと聴衆のPCはネットワークでつながっている
- 話者の画面を聴衆のPCに出しつつ、解説する
「lessプレゼン」のような感じだと、マルチユーザモードの解説のところでも触れた以下の設定、つまりユーザ「screen」は接続したときの状態のまま、ただ見るだけ、という設定でも充分だと思います。
aclchg screen -w "#?"
この設定に加えて、ウインドウの切替などを許しておくと、複数のウインドウを使って、冒頭で挙げたように、「プログラムを書きながらの説明」、たとえば「エディタでソースを編集して、隣のウインドウでコンパイルや実行を行う」などといったプレゼンテーションが可能となります。
以下の設定はすべて話者のPCで行います。
!!! PIDに影響しないセッション名の設定
コラム「セッションの特定」でも述べたように、セッションを指定する場合は、他のセッションと区別ができる文字列を指定する必要があります。通常、その条件にあてはまるのは、セッションの名前に含まれているPIDだけですから、今までの例でもセッションの指定にはPIDを利用してきました。
しかし、あるユーザがログインしたら別のユーザのScreenに接続させたい、などという場合には、起動のたびに変わる可能性のあるPIDではセッションの特定が困難となります。
そこで、sessionnameコマンドでセッションにユニークな文字列を追加します。たとえば、
sessionname presentation
などとすると、セッションの名前にpresentationという文字列を含めることができます。
sessionname.png セッション名の指定
といっても、これを.screenrcなどに含めてしまうと、起動したセッションがすべてpresentationという文字列を持ってしまうため、特定に利用することはできなくなってしまいます。
したがって、話者がプレゼンテーションを始める前に、sessionnameでセッションの名前を変更するという方法を用いることにします。
!!! ユーザ「screen」のログイン設定
話者のPCに、プレゼンテーションを見るための専用のユーザを作成します。ここでは、先程から何度も登場している「screen」というユーザを使うことにします。ユーザ「screen」のログインシェルがzshの場合、.zprofileを以下のようにします。
exec screen -x zinnia/presentation
screenをログインシェルにするなど、他の方法も考えられますが、今回はこの方法を用いることにします。
!!! ユーザ「screen」の権限設定
multiuser on aclchg screen -w "#" aclchg screen +x "#windows,windowlist,select,next,prev,other"
以上の設定により、ウインドウのリストを見たり、切り替えたりということを許可して、他のコマンドは許可しないという状態になります。つまり、話者のセッションのウインドウを自由に切り替えることはできるけど、操作は一切できないという状態です。
! そのほか
!! 最近サポートされた新しい機能
!!! idle / blanker / blankerprg
一定時間キー入力がなかった場合に特別な処理をさせるためのコマンドたちです。
!!!! idle
idle [秒数 [コマンドライン]]
指定した秒数の間キー入力がなかったときに、続くコマンドを実行します。ここでいうコマンドとは、Screenのコマンドのことです。プログラムを実行したいときはblankerを使用します。
!!!! blanker
blanker
画面をクリアしてカーソルの表示を停止します。blankerprgコマンドでプログラムを指定しておいた場合は、そのプログラムが実行されます。
いずれの場合も、キー入力があると元の画面に戻ります。そのとき入力されたキーは捨てられ、ウインドウには渡りません。
!!!! blankerprg
blankerprg [コマンドライン]
blakerが呼び出されたときに実行するプログラムを指定します。以上3つのコマンドを組み合わせて、スクリーンセーバのような環境を実現することができます。
blankerprg /usr/games/worms idle 60 blanker
上記の例では、キー入力がないまま60秒が経過すると、/usr/games/wormsが実行されます。
!!! backtick
backtick ID LIFESPAN AUTOREFRESH コマンドライン
LIFESPAN秒間隔でコマンドを実行します。ここでいうコマンドとは、先程のidleとは逆に、Screenのコマンドではなくて通常のプログラムのことです。
以下のコマンド内で %` というエスケープ文字列を使うことで、実行したコマンドの出力と置き換えることができます。出力が複数行あるときは、最後の1行だけが対象となります。
- caption
- hardstatus
- windowlist
AUTOREFRESH
LIFESPANとAUTOREFRESHがともに0のときは、プログラムをバックグラウンドで動かしつづけて、新しい出力行ができるたびにその内容を反映します。
!!!! 例: tail -F と組み合わせる
backtick 0 0 0 tail -F /home/zinnia/something.txt hardstatus string '%`'
something.txtに新しい行が追加されるたびに、その内容がメッセージラインに出力されます。
backtick1.png
新しい行を追加するスクリプトは以下のようなものでよいでしょう。
--- notify.sh ----------------------- #!/bin/sh echo $@ >> /home/zinnia/something.txt -------------------------------------
時間のかかる処理、たとえばネットワーク越しのファイル取得や、コンパイルの作業の最後に、このスクリプトを走らせることで、別のウインドウでの作業中でも通知メッセージを見ることができます。
ベルやモニタと違い、この仕組はScreenの中で動いていないアプリケーションからでも使用することができます。
ただし、このままではウインドウを切り替えたりするたびにメッセージが表示されてしまいますので、適当なタイミングで空行を追加させます。
bind , screen notify.sh
!!! そのほか
Screen 4.0系では、rcファイルのパーサが書き直され、その影響で今まで動いていたrcファイルがエラーで弾かれることがあるようです。大抵の場合、シングルクォートで囲まれている部分が問題になっているようです。筆者の場合は以下のように修正しました。
変更前: markkeys 'h=^B:l=^F:$=^E:^U=^Z:^D=^V' 変更後: markkeys h=^B:l=^F:$=^E:^U=^Z:^D=^V
!!!! コラム: Escreen
Azundris さんによるETerm(http://www.eterm.org/)の拡張で、Screenのフロントエンドとして働き、ウインドウリストのタブ化や、メニュー選択によるScreenの機能呼び出しなどをサポートします。
Screenのフロントエンド部分はライブラリとしてまとめられていますので、より深く突込んだ形でScreenの機能を利用したい方の参考にもなると思います。
!!!! コラム: その他の情報源
http://groups.yahoo.com/group/gnu-screen
Screenの公式フォーラムです。ベータ版が出たときなどはまずここで報告されます。変更は、このフォーラムで出たパッチが元になることも多いですので、チェックしておきましょう。
http://www.dekaino.net/screen/
dekaino さんによる「screenのススメ」です。インストールメモは最新版にすぐに対応するなど、非常に頼もしいページです。
http://www.rubyist.net/~rubikitch/computer/screen/
るびきちさんによる「GNU screenを使い倒せ!」です。本稿後半に出てきたような、Screenの応用例を「Screenプログラミング」としてまとめておられます。
http://www.gentei.org/~yuuji/rec/pc/intro-screen.html
広瀬さんによる「Introduction of screen」です。Screenを使うと何がうれしいのか、ということが明瞭に書かれています。
http://risky-safety.org/~zinnia/screen/
筆者による「Screenを使う」というページです。雑然としておりますが、ttyrec (http://www.namazu.org/~satoru/ttyrec/) のムービーでScreenの使いかたの説明を見ることができたりします。ぜひ御覧下さい。
2ちゃんねる UNIX板のScreenスレ
Screenの有効な使い方などに関する、非常にレベルが高い議論が行われています。前出のdekainoさんのページでログが保守されていますので、そちらもぜひ御覧ください。
Windows板のCygwinスレでも、ときどきScreenの話題が出ているようです。CygwinでScreenを使いたいと思っている方は探してみてください。
! おわりに
前の節では挙げませんでしたが、最近のScreenはZmodemに対応しています(比較的後期のパソコン通信に親しんだ方には懐しいかもしれません)。Zmodemの制御コードが来たときに、あらかじめ登録しておいた受信プログラムを使って受信動作を行う、といったことができるようです。
筆者はなかなか環境を整えることができず(最近のノートパソコンはシリアルポートを備えていないことが多くて...)試すことができませんでしたが、telnetでの接続にも対応したBBSへの接続時には便利に使えるのではないかと思いました。
筆者が初めてScreenを使ったのは、Screenのバージョンが3.7の頃でした。Libretto20 + FreeBSD 2.1.5で、ktermやxconsoleをいくつも立ち上げていて狭苦しい思いをしていたのが、Screenの導入でいきなりすっきりしてしまったという感動が今でも忘れられません。また、当時使っていたXサーバはわりと不安定だったのですが、急にXが落ちてしまったときでもセッションを救うことができました。
NetBSDを経て現在はWindowsを触っていますが、それでもScreenを中心とした生活を続けています。手元の環境ではレジュームやデタッチに多少の問題がありますが、概ねうまく動いているようです。
Screenの持つコマンドは1つ1つの動きがとても原始的で、「自分がしたいことをどうやって実現すればいいのか」「Screenでできること、できないことは何なのか」といったことがなかなか掴めないところがあると思います。それを奥の深さと感じるか、見通しの悪さと感じるかは人それぞれでしょうが、ユーザの「〜がしたい!」という要求をそのまま1つのコマンドとして実現するのではなく、必要な部品をひとつひとつ用意して、その組み合わせによって望みの機能を作ってゆく...というようなScreenの考えかたがあるのではないかなと、私は考えています。
みなさんが、そんなScreenをより身近に感じ、より深く使うきっかけとしてこの記事が役立つことを祈っています。
参照: