« Re: 眩しい | トップページ | /proc/xxx/fd/x は嘘吐き »

2009年2月27日 (金)

Yash 2 その 85: ループパイプとパイプリダイレクト

ループパイプを廃止してパイプリダイレクトを導入することにした。

ループパイプというのはパイプリストの最後のコマンドの出力が最初のコマンドの入力に入るというもので、次のように書いた。

| foo | bar

しかし実際のところこの機能はほとんど使い道がなかったので、廃止することにした。

一方、従来のシェルはパイプリストのコマンド間をパイプを繋ぐことはできたが、リダイレクト機能の一環としてパイプを取り扱うことができなかった。複数のコマンドのファイルディスクリプタをパイプで繋ぎたい場合は、mkfifo コマンドで名前付きパイプを作ってそれをリダイレクトで開くようにするのだが、このときファイルシステム上に名前付きパイプを作るという副作用は無視できないし、名前付きパイプの片方の出入り口を開いたらもう片方を開くまでプログラムが停止するという性質もある。だからシェルスクリプトプログラマとしては、名前なしの普通のパイプを直接シェルで扱いたい。

シェルのリダイレクト機能は、もともとファイルディスクリプタを取り扱う汎用的な機能として設計されているので、パイプを開けるようにリダイレクトを拡張するのは自然な成り行きだろう。Yash では、>>| 演算子でパイプを開けるようにする。例えば、3>>|4 とすると、ファイルディスクリプタ 3 に入力して 4 から出力されるパイプを開く。これを使うと、先程のループパイプは以下のように書ける。

(foo | bar) >>|0

|

« Re: 眩しい | トップページ | /proc/xxx/fd/x は嘘吐き »

コメント

コメントを書く



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




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/44193730

この記事へのトラックバック一覧です: Yash 2 その 85: ループパイプとパイプリダイレクト:

« Re: 眩しい | トップページ | /proc/xxx/fd/x は嘘吐き »