「-」の妙技(2)
2008.07.28
さて今度はUNIXのシェルのコマンドラインで、
ハイフン = 標準出力指定
として捉える習慣についてです。
これは、getopt(3) とは全然関係がなくて、個別にそのプログラムの側の独自実装として、明示的に
ハイフンだけのファイル名 = 標準出力
と置き換えて処理します。ですから、ホントこれ、「そのツールの実装でしょ」と言えばその通りです。また、UNIXコマンドは
標準入力から読んで、結果を標準出力に流す
UNIX哲学に沿って書かれていることが多いのは当然なので、 特に「標準入出力を示すハイフン」が必要になるのは、「デフォルトではすでに別な用途で標準入出力が塞がっている事情がある」比較的珍しく、複雑なケースに限られることになります。ですから私が知る範囲では、
- ● tar の f オプションのパラメータ
- 標準入力(
tar xvf, tar tvfzとかの場合)、標準出力(tar cvfとか)共に有効。 - ● sed, gawk の -f オプションのパラメータ
- 標準入力からスクリプトを読んで実行する。動的に実行詳細を変更する必要があるケースでこれは便利です。
- ● diff の操作対象ファイル指定
- 「
% diff realFile.dat -」で、実在するファイル radlFile.dat と標準入力読み込みとの間での比較がなされます。 - ● gs の -sOutputFile オプション
- このオプションは PostScript の命令をレンダリングしてラスタ画像ファイルに変換する時の出力ファイル指定なので、ハイフンは標準出力に変換された(おそらくバイナリの)ラスタイメージを流します。ですから、PostScript で書かれた画像をフィルターのインターフェイスで加工する NetPBM みたいなツールで加工するケースでよく使われます。
とはいえ...ファイル名(複数)を、オプションの後に並べて書く「対象ファイル」の一般的な書き方では、その複数ファイルの順番の中に、「標準入力から読む」を混ぜて指定できる、というのも非常に使いでがあるケースがあります。だから、
● cat の操作対象ファイル指定
- 対象ファイルとして「
-」は実在するファイルと同じ役割りを果たします。
....cat(1) は「フィルターの練習で cat と同じように動作するプログラムを書いてみましょうね!」という時の練習台に使われることから判るように、
フィルター自体のモデル
と捉えても過言ではない「UNIX哲学としてのフィルター」ですが、これの実装はハイフンを標準入力として捉えます。ですから、あなたがフィルターを書く時に、「操作対象の指定として、ハイフンが現れたら、それを標準入力に置き換える」という処理を入れるのは、実は凄く正統派のやり方なのです.....(とはいえ、「使えたらいいな」というコマンドで実装されていないケースも結構ありますが)
しかし実質上「% rm file1 - file2」のような、「ファイルを操作すること」が目的のプログラムでは、この読み替えは無意味です...あくまで、「指定したファイルの中身を読む→標準入力から読む」の操作の同等性ゆえに、この読み替えがあるのですからね。実際ソースレベルで確認すると、GNUのcoreutils(6.12) の中で、ハイフンを標準入出力に読みかえて処理しているプログラムには次のものがあります。
cat, cut, date, dircolors, du, head,
shred,touch(/bin)
cksum,comm,csplit,env,expand,fmt,fold,join,
md5sum,nl,od,paste,pr,ptx,sort,split,sum,tac,
tail,tee,tsort,unexpand,uniq,wc(/usr/bin)
まあ、このリストはGNUで最新の6.12のソースから機械的に抽出したものなので、あなたの環境で使われている実装では、そう実装されているかどうかは知りません(あと、何かのオプションで特に使えるだけ、というものも含まれます、失礼)が....とはいえ、「ファイルの内容の読み書きをするコマンド」については、「ハイフン=標準入出力」の読み替え対応が進行中である...という雰囲気を感じていただけましたか?ぜひぜひあなたのシェルスクリプトで使ってみましょう!
投稿者 : 杉浦 こずえ | 投稿日時 : 2008.07.28 13:00
あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。





