新規作成 編集 差分 FrontPage ページ一覧 検索 更新履歴 管理 UnixUser $Id: UNIX+USER+screen%daad%ddf6,v 1.20 2004/06/07 01:57:24 zinnia Exp $ http://www.unixuser.jp/ ! Hiki書法 ! 章立て * 箇条書 # 番号つき箇条書 リンクは[[text|url]] :dt:dd ! 概要 ・ 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によって暗号化された ものにする必要があります。手順は以下の通りです。 1. ^A:password として、引数なしでpasswordコマンドを呼び出す 2. 設定したいパスワードを2回入力する 3. ペーストバッファに暗号化されたパスワードが入るので、.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のセッションに指示を出すには、以下のような方法が使 えます。 1. .screenrcに記述する 2. コマンドキーを使う 3. ^A: (colonコマンド)を使う 4. 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つの方法が考えられます。 1. ペーストバッファの内容を検索条件としたURLを作成し、w3mの引数に渡して起動 2. w3mでGoogleを開き、カーソルを検索文字列入力部分に移動させ、ペースト 前者の場合、一発で目的のページを表示できるようになる反面、日本語などを含む文字 列を検索したい場合、エンコードの処理などが少々面倒です。 後者の場合は、エンコードなどはw3mがやってくれますが、Googleのインターフェースが 変わるたびに仕組を再検討する必要がありますので、Googleに橋渡しをしてくれる専用 のページを用意するなどして回避する必要があるかもしれません。 今回は、直接Googleのページにアクセスして、移動して検索するという流れでやってみ たいと思います。 google1.png !!! その1 レジスタで構成する 1. タブでリンクを移動 x 4 で入力フォームに到達。その場でEnter押して入力モード に入る 2. ペーストバッファの内容をペースト 3. Enterを押して入力モードから抜ける 4. タブ1回で「Google検索」ボタンに移動 5. 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をより身近に感じ、より深く使うきっかけとしてこの記事が 役立つことを祈っています。 ! おわり 更新日時:2004-06-07 (月) 10:57:24 参照: Generated by Hiki 0.5-devel-20030518. Powered by Ruby 1.6.8 and Amrita. Modified by 名無しさん. 最新の20件 2004-06-07 ・ UnixUser 2003-05-24 ・ InterWikiName 2003-05-18 ・ FrontPage 2003-04-08 ・ SideMenu ・ TextFormattingRules