日々の備忘録

技術について日々学んだことを書きます。

linux screen での画面分割 & 対話シェル起動 & コマンド実行をscreenrcで管理する方法

ターミナルアプリ自体を複数起動するのもアレなので、screenで画面分割しているんですが、最近まで窓をいちいち手動で作成していました。

だいたい窓を4つ、それぞれ打つコマンドも同じなので定型処理としてなんとかできないかと思っていたんですが、screenrcに記載できるんですね。

# シェル起動
screen 0
screen 1 command args...

# 水平、垂直分割
split
split -v

# 対象としている窓を移動
focus (up|down|left|right)

# 起動しているシェルを現在の窓に割り当て
select shell_number

ざっくりとですが、screenrcに以上のように記載し、screen実行時に -c オプションで読み込ませると記載した通りになります。

そこで、screen command 形式でいつもどおりに実施しているコマンドをつらつらと記載してみたのですが、複数コマンドを && で繋いだり、リダイレクトしたりしようとすると上手くいきません。

どうやら、commandを省略すると対話シェルが起動しますが、commandを記載すると対話シェルが起動しないので複数コマンドを解決できないようです。

以下のように記載すれば実行自体はできるんですが、プロセスが終了したり、Ctrl+Cなどで中止するとシェルが残らない?ので完全な定型処理でない場合は若干不便です。

screen bash -c "echo \"foo\" | grep \"f\""

zombieを指定すると、コマンドの再実行はできますが、やはり対話シェルを起動できません。

そこで、bashのプロセス置換で、--init-file と組み合わせてワンライナーで起動するようにしました。

screen bash -c "bash --init-file <(echo \"source \"$HOME/.bashrc\"; pwd;\")"

リダイレクトしているのでbash -cで実行するようにしないと上手くいきません。

ここまでやるなら、素直にコマンド部分をスクリプトファイルにして、screen bash --init-file ./script.sh としたほうが保守性の面でもいいかもしれませんがscreenrc単体で一応実現できました、という話でした。

screenrcに記載できること自体、最近知ったばかりで浅い知識なのでもっとスマートに実現できるよという方がいらっしゃったら教えていただければ幸いです。