rcmdnk's blog

Screen

GNU screenで.screenecにコマンドを書いてて上手く反映されなかったことがあったのですが、 色々試した結果、どうやらコマンドの数に制限がある様です。

今使ってるversionは4.01.00devel (GNUc2cd059)です。

Sponsored Links

bindでevalを使って複数コマンドを指定する

.screenrcbindする時evalを使うと複数のコマンドが指定できます。

bind a eval 'split' 'split -v'

とすれば、Ctrl-a aで上に2画面、下に1画面の3領域に なります。

bind+evalでのコマンド制限数

こんな感じのキーバインドを設定してみます。

bind a eval 'echo 1' 'echo 2' 'echo 3' 'echo 4' 'echo 5' 'echo 6' 'echo 7' 'echo 8' 'echo 9' 'echo 10' 'echo 11' 'echo 12' 'echo 13' 'echo 14' 'echo 15' 'echo 16' 'echo 17' 'echo 18' 'echo 19' 'echo 20' 'echo 21' 'echo 22' 'echo 23' 'echo 24' 'echo 25' 'echo 26' 'echo 27' 'echo 28' 'echo 29' 'echo 30' 'echo 31' 'echo 32' 'echo 33' 'echo 34' 'echo 35' 'echo 36' 'echo 37' 'echo 38' 'echo 39' 'echo 40' 'echo 41' 'echo 42' 'echo 43' 'echo 44' 'echo 45' 'echo 46' 'echo 47' 'echo 48' 'echo 49' 'echo 50' 'echo 51' 'echo 52' 'echo 53' 'echo 54' 'echo 55' 'echo 56' 'echo 57' 'echo 58' 'echo 59' 'echo 60''

只管echoするだけですが、上手く設定されれば最後の数字60が表示されるコマンド。 (msgwaitが0でなければ。)

これを.screenrcに書いて読み込みCtrl-a a としてみると、メッセージラインに60が表示されるのが 確認出来ます。

ここで上のコマンドの最後にecho 61と追加して 読み込んでみると60 と表示されるか、screenを再起動させたら 何も表示されなくなると思います。

つまり、echo 61を加えた状態だとそれは無視されてます。

文字数制限かな、と思って1 echo 1の部分をecho aaaaaaaaaaaaaaaaaaaaaaaaaaaaみたいにして 文字数を増やしてみても、やはり60個の場合はOKで61個の場合は駄目でした。

なので、コマンドの数として60個が最大、というのがあるみたいです。

bind+command class+evalでのコマンド制限数

コマンドクラスをを指定(bind -c <class> [command1 [command2...])して行うとクラス分の文字を使うためか、 最大58個までに減りました。

evalだけでのコマンド制限数

単にevalだけでスクリプト読み込み時にすぐコマンドを実行する様な 設定をすると、bind分が減るからか、62個まで使えることが確認できました。

まとめ

.screenrc等でevalを使って複数コマンドを指定する場合、 コマンド数には制限があって 制限は

  • eval ...と直接実行する様な分の場合: 最大62個
  • bindでキー設定する場合: 最大60個
  • bind -c <class>でクラス指定してキー設定する場合: 最大58個

となります。

探してみてもこの数についてのドキュメントが見つからなかったので コード見ないと確認出来ませんが、コマンド数には制限があるようなので 長いコマンドを使う場合には注意を。

もし、どうしてもこれ以上の数のコマンドを使いたい場合は、 適当にコマンドを1行1コマンドで羅列したファイルを作って

bind a eval 'source commands.txt'

みたいにして読み込んであげれば出来ます。

Sponsored Links
  1. echo単独に限って言えば512文字の制限があります。

    GNU screenでクリップボードの履歴を使えるようにする 2

Sponsored Links

« GNU screenのcaptionとhardstatusの整理 GNU screenでのレイアウトの整理 »