screen 仮想端末マネージャーの使い方

先日とあるサイトで知った、UNIX系OS で動く screen なるツール。kterm とか teraterm 等の端末1つで、複数端末での作業をエミュレートするとかなんとか・・・って使ってみてびっくり、これすげー便利!乱暴に言えばタブブラウザの terminal 版って感じでしょうか。ざーっと man を読んだ上で、幾つか web からも知識を仕入れたのでここにメモっておきます(いうても使いそうな基礎操作のみ)。

引用元:iandeth. - screen - 仮想端末マネージャーの使い方
 http://iandeth.dyndns.org/mt/ian/archives/000570.html

1. ステータス行に各ウィンドウで打ったコマンドを表示 - bash
基本は ~/.screenrc に 'hardstatus alwayslastline "%w"' と書いておけば、 画面最下部にウィンドウ名一覧が表示されるようになるけれど、これだと各ウィンドウ名が一律 'bash' って名称になるので、いまいち不便。新規ウィンドウを開くたびに 'C-a A' で命名するのも面倒。理想は「今実行しているコマンド名」が表示される事すね。以前 GNU screen いろいろまとめ。 で zsh なら出来るよと紹介されていましたが、参照先のページが消失しているのと、zsh じゃなくて bash で実現させたいな、と思い調べてみたら有志が解説してくれていました。

titles [GNU screen] より引用:

1) .screenrc に下記行を追加

shelltitle "$ |bash"

後半の 'bash' はコマンド未実行状態の時に表示されるワードで、他の任意の文字列でもOK。

2) .bashrc 等にて、プロンプト書式を設定する行の先頭に文字列 '\033k\033\\' を追加

PS1='\033k\033\\[\u@\h \W]\$ '

最後の '$ ' と、(1) で記述した '$ ' は一致している必要あり。shellに詳しくないので、.bashrc の方に追加した文字列は謎めいた呪文にしか見えないのですが、なにやら k\ なるシーケンスをプロンプト記述に埋め込む事で、目的が実現できるそうな。

3) 改めて screen を起動して、'perldoc CGI' とか実行してみるとアラ不思議。画面下部のウィンドウ名が 'perldoc' って変わるはずです。素敵。



同様の事を zsh で実現する方法も引用元の titles [GNU screen] に書いてあります。naoya氏が言っているように、複数ウィンドウ間でコマンド履歴を共有できる zsh の方がきっと便利っすね。

ちょっとオシャレなステータス行
現在アクティブなウィンドウの横に '*' を表示させるのではなくて、オシャレに色反転させる方法。 GNU screen いろいろまとめ。 で氏が紹介している設定ママ(すまん)ですが、メモメモ。

hardstatus alwayslastline "%`%-w%{=b bw}%n %t%{-}%+w"

2. Unicode (UTF-8) を使う
使用文字コードを指定するコマンド 'C-a :encoding' でutf8を指定しても、僕の環境では文字化けしたまんま。man screen を読んだ感じ、utf8 に限ってはコマンド 'C-a :utf8 on on' を別途発行する必要があるみたい。 で、これらをまとめて起動時に設定してくれるのが -U オプション。

$ screen -U

.screenrc で設定しておきたいものの、該当するコマンド defutf8 は2番目の 'on' - display encoding - を受け付けてくれなくてNG。なので、せめて alias screen='screen -U' なのかな?



3. 突然キー入力を受け付けてくれなくなった際の対処方法
デフォルトのエスケープキー設定 'C-a' でscreenを使っていると、何かの拍子で、キーボード入力を一切受け付けてくれなくなる場合があります(僕はありまくりでした)。調べてみたところ、これは 'C-a' すぐ近くにある s キーを組み合わせた機能:

C-a s # xoff (automatic flow control off)
をうっかり有効にしてしまっている為だそうな。この xoff モードだと、キーボード入力は受け付けているものの、画面への反映が一切されなくなる模様。で、元に戻すには

C-a q # xon
と打ってやればよいとのこと。ふう、これで無駄にパニックにならずに済みます。あるいは bind 設定で xoff を消し去っておくべし (.screenrc):

bind s  # reset s key

4. Reattachを透過的にこなしてくれるラクチン起動方法
普通だと '$ screen -r' とか指定して、前回detachしたセッションに再接続しますが、detachしたセッションが複数あったり、何らかの不具合で Attached 状態のまま接続が切れたセッションがあった場合など、それぞれ対応したコマンドで処理してあげないと再接続できません。で、この辺を全自動でイイ感じにこなしてくれる起動方法がコレ:

$ screen -D -RR

※挙動の詳細説明は man を参照してくださいませ。

引用元:iandeth. - 続 screen の使い方
 http://iandeth.dyndns.org/mt/ian/archives/000646.html