« テレビ番組等感想 その 424 | トップページ | Yash 2 その 271: Travis CI »

2013年7月14日 (日)

Yash 2 その 270: ジョブ制禦の仕組みと次世代シェル

先日ツイッターにだらだらと書いた話。

Unix 系 OS の端末ではシェルのジョブ制禦機能を使用することで複数のコマンドを同時に実行することができるが、実際にこの仕組みを有効に活用できる場面は限られてゐる。その理由の一つは、バックグラウンドで実行されるコマンドの出力がフォアグラウンドで実行中のコマンドの出力と混ざって全然役に立たなくなるからである。例えば make や curl などのコマンドはデフォルトで途中経過を随時出力するので、これらのコマンドをバックグラウンドで実行しながらフォアグラウンドでエディタを起動したりすると画面が乱れてしまふ。バックグラウンドコマンドを起動するときに出力をどこかにリダイレクトすれば画面が乱れることはなくなるが、いちいちリダイレクトを指定するのは面倒だしコマンドを起動した後でリダイレクト先を変更することもできない。

かういふ問題が起こる原因は、シェルが起動するコマンドの入出力がシェルによって十分に管理されてゐないことにある。リダイレクトを指定せずにコマンドを起動すれば、コマンドの標準出力や標準エラーは端末に繋がったままなので、コマンドが何か出力すればそれがそのまま直ちに端末に表示されてしまふ。リダイレクトを指定したとしても、標準出力や標準エラーはリダイレクト先のファイルに繋がってゐるだけでシェルの管理下にはないので、例えばコマンドをバックグラウンドからフォアグラウンドに移動しても出力先をリダイレクトされたファイルから端末に変更することはできない。

この問題を解決するには、各コマンドの出力先を仮想化する必要がある。コマンドの出力を一旦シェルが受け取り、それをシェルが端末やファイルに転送すれば良い。コマンドの出力をシェルが溜めることができるやうになるので、コマンドの実行を開始した後からでもいろいろなことができるやうになる。

  • コマンドをバックグラウンドで実行してゐる間はコマンドの出力を端末に流さないようにしておき、コマンドをフォアグラウンドに移したときだけ出力を通すやうにする。すると、バックグラウンドコマンドの出力がフォアグラウンドコマンドに干渉する事がない一方で、バックグラウンドコマンドの出力を必要な時に見ることもできる。
  • コマンドの実行が終はった後で、コマンドの出力結果を端末に書き出したりファイルに保存したりできる。端末のスクロールバックからコマンドの出力が溢れて行ってしまっても、シェルが出力を溜めてゐれば後から再度出力できる。
  • あるコマンドの実行が終わった後、その出力を別のコマンドにパイプする。例えば、find コマンドでファイルを検索したら意外に多くのファイルが出力されたのでそれを grep にパイプして絞り込むなど。

で、これをやるには POSIX の規定に従った現行のジョブ制禦方式を変へなければならない。やるとしたら、これまでとは異なるプログラムとして完全に作り直すことにならう。はたしてそんなことをする暇があるのか。

|

« テレビ番組等感想 その 424 | トップページ | Yash 2 その 271: Travis CI »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Yash 2 その 270: ジョブ制禦の仕組みと次世代シェル:

« テレビ番組等感想 その 424 | トップページ | Yash 2 その 271: Travis CI »