screenコマンドでターミナルを便利に使う

提供: Akionux-wiki
Share/Save/Bookmark
移動: 案内検索

概要

GNU Screenは、GNUプロジェクトの一つである。

GNU Screenの提供するscreenコマンドを使えばCUI環境で仮想端末を複数使ったり、ウィンドウを分割して使ったり、ターミナルを便利にすることができる。 いろいろな情報[1][2][3][4]を参考にした。

インストール

Debian/Ubuntu系では

sudo apt-get install screen

とする。

なお、2014年10月現時点のDebian/Ubuntu系パッケージではウィンドウの縦(垂直)分割ができない。 縦分割したい場合は、開発版のscreenをビルド・インストールする必要がある。後述の#ウィンドウを縦分割するを参照のこと。

用語

GNU Screenで出てくる用語をはじめにチェックしておこう。

セッション、ウィンドウ、領域、レイアウト

GNU Screenではセッション、ウィンドウ、領域、レイアウトという用語がある[5]

screenを実行すると、セッション(session)という一つのまとまりを作る。 セッションが管理している各端末をウィンドウ(window)と呼ぶ。 画面を分割して区切られたうちの一つは領域(region)と呼ぶ。 画面の区切られた状態(区切られ方)をレイアウト(layout)と呼ぶ。

デタッチとアタッチ

また、GNU Screenではデタッチ(detach)とアタッチ(attach)という用語がある[3]

デタッチとは、アクティブなセッションを端末から切断する行為のことを指す。ただしセッション中のプロセス自体は生存し続ける。

アタッチとは、デタッチしたセッションに再接続する行為のことを指す。

簡単な使い方

セッションの開始と終了

単に

screen

を実行するとセッションが開始する。

セッション中にscreenコマンドに-dオプションをつけるとデタッチされる:

screen -d

-rオプションでアタッチできる:

screen -r [screenname or number]

[screenname or number]の部分はどのセッションかを指す引数で、セッション番号またはセッション名を入力する。 -lsオプションで現在の全セッションを確認:

% screen -ls
There is a screen on:
        17928.pts-5.Hoge   (2014年10月16日 01時46分07秒)   (Detached)
1 Socket in /var/run/screen/S-akio.

したとき、上記の場合は先頭のの17928という番号がセッション番号、それに続くpts-5.Hogeというのがセッション名である。

デタッチしているセッションが一つだけなら、[screenname or number]の部分の引数はなくてもアタッチできる。

通常の端末同様、exitコマンドまたはCtrl+dで仮想端末が終了する。 最後の一つの仮想端末を終了すると、screenのセッションは終了し、通常の端末に戻る。

仮想端末の生成

Ctrlキーを押しながらキーa、その後キーcを押す:

Ctrl + a, c

仮想端末が生成される。

仮想端末の一覧を表示する

-lsオプションを付けてscreenコマンドを実行すると、仮想端末一覧が表示される。

screen -ls

仮想端末の切り替え

Ctrlキーを押しながらキーa、その後スペースキーを押す:

Ctrl + a, SPACE

次の仮想端末に切り替わる。

領域の分割

領域を横分割する

Ctrlキーを押しながらキーa、その後キーS(Shift+s)を押す:

Ctrl + a, S

領域を縦分割する

Ctrlキーを押しながらキーa、その後キー|(Shift+|)を押す:

Ctrl + a, |

古いバージョンのscreenには縦分割の機能がついていないので、必要ならば#開発版のインストールをする。

分割した領域間を移動する

Ctrlキーを押しながらキーa、その後Tabキーを押す:

Ctrl + a, Tab

逆順に移動するにはtrlキーを押しながらキーa、その後Shiftキーを押しながらTabキーを押す:

Ctrl + a, Shift + Tab

現在の領域を破棄する

Ctrlキーを押しながらキーa、その後キーX(Shift+x)を押す:

Ctrl + a, X

現在のアクティブな領域以外すべてを破棄する

Ctrlキーを押しながらキーa、その後キーQ(Shift+q)を押す:

Ctrl + a, Q

screenセッション内でスクロールする・出力内容をコピーする

screenセッション中ではGUIのスクロールバーによるスクロールが効かなくなる。 screenにはコピーモードというのを備えていて、これを利用すれば端末内の出力をさかのぼってコピーすることができる[6]

コピーモードに入るには、Ctrlキーを押しながらキーa、その後エスケープキーを押す:

Ctrl + a, Esc

ステータスバーに"Copy mode..."と表示され、コピーモードに入ると、カーソルキーやPgUp、PgDnで端末の出力上のカーソルの移動ができるようになる。

出力内容をコピーするには、コピー開始点でスペースキーを押し、コピー終了点でまたスペースキーを押す。

クリップボードの内容を貼り付けるには、Ctrlキーを押しながらキーa、その後キー]を押す:

Ctrl + a, ]

コピーモードを終了するには、エスケープキーを押す。

また、出力内容を保持する行数はscreenの設定ファイル~/.screenrc内のdefscrollbackの値で設定することができ、例えば

defscrollback 1024

と設定すれば1024行の出力履歴を保持する。

クリップボードの内容をXのクリップボードへコピーする

screenセッションでコピーしたクリップボードはXのクリップボードとは別だが、xselを使うことでXのクリップボードへコピーできる[7]

screenセッション内で先ほど紹介した方法でコピーを行った後、次のコマンドを実行する:

cat | xsel -b

その後ペーストする

Ctrl+a, ]

catを終了させるために

Ctrl+d

を押す。これでXのクリップボードへコピーされる。

screenセッション時のシェル

screenはSHELL環境変数で指定されているシェルを起動するらしい[8]。 そのため、例えばSHELL=/bin/sh(bashへのシンボリックリンク)と設定されているが、ユーザーのログインシェルが/bin/zshであるような場合は、screebセッションに入るとログインシェルとは別のシェルが起動してしまう。

シェルを同じにしたければSHELL環境変数を設定してやれば良い。 例えば、zshを使いたい場合は、

export SHELL=/bin/zsh

とすれば、screenセッションでzshが起動する。

開発版のインストール

古いバージョンのscreenには縦方向にウィンドウを分断する機能は付いていない。 開発版をインストールすれば使えるようになる[9]

開発版screenをビルド・インストールするにあたって、私のLinux Mint 17環境でやってみたらmakeinfoコマンドがないというエラーが出たので、texinfoパッケージを入れておく必要があった。

sudo apt-get install texinfo

その他ビルドに必要なパッケージは揃えておく必要がある。例えば、gcc4 autoconf automake libncurses-devel[9]

git cloneしてautogen.shを実行する:

git clone git://git.sv.gnu.org/screen.git
cd screen/src
./autogen.sh

./configureを実行。デフォルトでは/usr/binへインストールされるので、変えたい場合は--prefix=<インストール先>のオプションを加える。ディストリビューションのパッケージに上書きされないように/usr/localにしておいたほうが良いかもしれない。

./configure --prefix=/usr/local

make&make install

make
make install

セッションを再起動しても削除されないようにする

デフォルトではセッションを記録したファイルは一時ファイル/tmp/screens以下にあるので再起動すると削除されてしまう。

セッションを記録したファイルの保存先ディレクトリは権限が700であれば環境変数SCREENDIRで指定できる[10]

cd ~
mkdir .screens
chmod 700 .screens
echo "export SCREENDIR=/home/hoge/.screens" >> .bashrc
source ~/.bashrc

もちろんzshを使っているなら.bashrcを.zshrcに読み替える。

これでscreenセッションが再起動しても削除されない。

コマンドを送信する

-Xオプションでセッションへコマンドを送信することができる[11]

screen -S <name> -X <command>

例えば、ひとつだけセッションがあってウィンドウ分割をしているときに、現在のアクティブなウィンドウの大きさを+N文字分大きくしたいときは、

screen -X resize +N

とする。

領域のリサイズをキーに割り当てる

領域のリサイズはデフォルトだといちいちコマンド送信をする必要があるので、キーに割り当てて使いやすくする[5]

~/.screenrcへ以下の内容を追加する:

# Resize window
bind e eval 'command -c resize' 'echo "Resize window"'
bind ^e eval 'command -c resize' 'echo "Resize window"'
bind -c resize h eval 'command -c resize' 'resize -h -1'
bind -c resize l eval 'command -c resize' 'resize -h +1'
bind -c resize j eval 'command -c resize' 'resize -v +1'
bind -c resize k eval 'command -c resize' 'resize -v -1'
bind -c resize ^h eval 'command -c resize' 'resize -h -1'
bind -c resize ^l eval 'command -c resize' 'resize -h +1'
bind -c resize ^j eval 'command -c resize' 'resize -v +1'
bind -c resize ^k eval 'command -c resize' 'resize -v -1'

Ctrl-a, eでresizeという状態に入って、その後h/l/j/kで左右上下方向へ領域の境界を移動できる。

References

  1. Naoki Iwami, screenコマンド一覧 - Unlimited Island
  2. screenの使い方 - AFFRIT Portal
  3. 3.0 3.1 Unix :: コマンド / screen - Tipsというかメモ
  4. screenのデタッチ/アタッチ - ちなみに screenのデタッチ/アタッチ - ちなみに
  5. 5.0 5.1 GNU screenでのレイアウトの整理 - rcmdnk's blog
  6. Linux/screenの機能で履歴をスクロールして見るには - 情報技術の四方山話
  7. linux - How copy the GNU Screen copy buffer to clipboard - Stack Overflow
  8. Cygwinでログインシェルを設定してもScreenでshになっちゃう - それマグで!
  9. 9.0 9.1 縦分割ができる開発版screen(version 4.1.0)をCygwinに入れるメモ | Futurismo
  10. gnu screenのセッション保存ディレクトリを変える - PCと遊ぶ日々の記録
  11. quick_reference - GNU screen