入力の指定


フィルタプログラムでの入力の指定

フィルタプログラムは、何らかのデータを入力として与えると、それに操作を加え、操作結果を出力します。ですから、PCKの各プログラムにとって入力は特に重要な意味を持ちます。

最初にGUIフロントエンドの下のフィルタプログラム(コマンド行プログラム)が入力をどのように扱うかを説明しておきましょう。入力はファイルという形で与えられますが、キーボード入力の内容も、デバイスファイルとして扱われます。実際、次のように入力として何も指定せずにプログラムを起動すると、キーボード入力の内容が標準入力としてプログラムに与えられます。

 

C:> cat

 

標準入力は、リダイレクトによってほかのファイルに切り替えることができます。たとえば、次のようにすると、file.txtの内容が標準入力としてcatフィルタに与えられます。

 

C:>cat < file.txt

 

また、次のようにすれば、sort file.txtコマンドの出力をcatプログラムの標準入力として使うことができます。

 

C:>sort file.txt | cat

 

この「<」とか「|」で入力をリダイレクトできるのは、catなどのプログラムを起動するコマンドシェル(Windows 9x/Meではcommand.comWindows NT/2000ではcmd.exe)の機能です。このとき、catプログラム自体は、いつもと同じようにキーボードから入力が送られてきたのだろうと思って処理をしています。

多くのフィルタコマンドは、標準入力からのリダイレクトという形だけではなく、コマンド行パラメータとして入力ファイルを指定できるようになっています。しかも、それらの多くは、1つではなく、複数の入力ファイルを指定できます。cygwinツールのcat.exePCKのなかのcat.exeも、コマンド行パラメータとして複数の入力ファイルを受け付けます(元になったUNIXcatプログラムが、複数のファイルを1つのファイルに結合するという意味の名前を持っているだけに、これは当然のことと言えるでしょう)。複数の入力ファイルを指定する場合、ファイルをどのような順番で並べるかが実行結果に大きな影響を与える場合があります。たとえば、catプログラムは、コマンド行に書かれた順番でファイルを結合していきます。また、同じファイルを複数回指定する場合もあります。たとえば、1個の改行文字だけが含まれているlinefeed.txtというようなファイルを作ります。各章の内容が書かれたchap01.txtchap02.txtなどのファイルを次のようにして結合すれば、

 

cat chap01.txt linefeed.txt chap02.txt linefeed.txt chap03.txt

 

章の切れ目に改行を挿入できます。

GUIフロントエンドでの入力の指定

GUIフロントエンドは、使いやすいユーザーインターフェイスを提供しつつ、コマンド行を組み立てることを目的としていますので、前節で触れたようなさまざまな指定方法に対応できるようにしておく必要があります。対応するコマンド行プログラムによって若干の違いはありますが、基本的な指定方法は共通しています。ここでは、それを説明します。

クリップボードからの標準入力のリダイレクト

まず、入力グループボックス内の「クリップボード」チェックボックスをチェックすると、「入力ファイル」ダイアログボックスや「ファイルを開く」ダイアログボックスで指定した入力ファイルを使わず、クリップボードにセットされているテキストデータを標準入力としてコマンド行プログラムに与えます。board)プログラムを使えば、クリップボードにどのようなデータがセットされているかを見たり、過去にクリップボードにセットされたことのあるデータを再びクリップボードに戻したりすることができますので、組み合わせて使うとよいでしょう。

コマンド行ドラッグアンドドロップ

ほかのGUIフロントエンドからコマンド行をドラッグアンドドロップ、コピーアンドペーストするときに、そのGUIフロントエンドの入力ファイルをそのまま入力として指定することができます。詳しい方法は、「ドラッグアンドドロップとコピーアンドペースト」を参照してください。

「ファイルを開く」ダイアログボックス

入力ファイルを1つしか受け付けないプログラム()の場合、入力グループボックス内の「参照」ボタンを押すと、Windows標準の「ファイルを開く」ダイアログボックス(ただし、タイトルは「入力ファイルの選択」になっています)がオープンされます(ちょうど2個の入力ファイルを受け付ける(diff)の「ファイル1」、「ファイル2」ボタンでも同様)。ここでファイルを1つ選択すると、それが入力ファイルとして使われます。「参照」の右の「クリア」ボタンを押すと、入力ファイルの指定は空に戻ります。

 

 

入力ファイルダイアログボックス

入力ファイルを複数受け付けるプログラムでは、入力グループボックス内の「ファイル」ボタンを押すと、メインダイアログの右上に次のようなダイアログボックスが表示されます。このダイアログボックスは、モードレスダイアログなので、クローズしなくてもメインダイアログを操作できます。

 

 

リストを使って指定する」と「直接指定する」のどちらのラジオボタンを選択するかによってファイルの指定方法も大きく異なります。「入力ファイル」ダイアログボックスをオープンしたときの設定は、基本的に前回ダイアログボックスをオープンしたときの設定と同じですが、メインダイアログボックスにファイルをドラッグアンドドロップ(またはコピーアンドペースト)すると、「リストを使って指定する」が選択されます(そして、リストにはドラッグドロップされたファイルが表示されます)。

ファイルの追加

このダイアログボックスの「ファイル追加」ボタンを押すと、Windows標準の「ファイルを開く」ダイアログボックスがオープンされます(ただし、タイトルは「入力ファイルの追加」、「操作対象ファイルの追加」になっています)。最初に表示されるディレクトリは、これらGUIフロントエンドで「ファイルを開く」ダイアログボックスを最後にオープンしたときに、ファイルを選択したディレクトリです。ここでファイルを選択すると(複数可)、「入力ファイル」ダイアログボックスのファイルリストにそれらのファイルが追加されます。

エクスプローラや他のGUIフロントエンドの「入力ファイル」ダイアログでファイルを選択し、GUIフロントエンドのダイアログボックスにドラッグアンドドロップまたはコピーアンドペーストすると、次のようなダイアログボックスが表示されます。

 

 

はい」を選択すれば、ファイルリストにそれらのファイルが追加され、「いいえ」を選択すれば、ファイルリストの内容が置き換えられます。

ファイルリストに同じファイルの複数のエントリを追加したい場合、1度の操作で複数のエントリを追加することはできませんので、上記2種類の操作のどちらかを複数回繰り返してください。

たとえば、次のようにフィルタプログラムの入力ファイルとして指定したファイルに出力をリダイレクトしようとすると、

 

cat test.txt > test.txt

 

そのファイルは壊れてしまいます。Windowsでは、command.comcmd.exeがパイプを管理しており、フィルタプログラムを実行する前にリダイレクト先のファイルを書き込み用にオープンするので、フィルタプログラムが入力ファイルを読もうとしたときには、すでにそのファイルは破壊されているのです。PCKのフロントエンド(: command lineを除く)は、すでに出力ファイルとして指定されているファイルを入力ファイルとして使おうとすると、次のようなエラーメッセージを表示し、そのファイルを出力ファイルの指定から外します。

 

 

逆に、「名前を付けて保存」ダイアログですでに入力ファイルとして指定されているファイルを出力ファイルとして指定しようとすると、次のようなエラーメッセージが表示されます。

 

 

この場合、別のファイルを指定するまで(あるいは「キャンセル」ボタンを押すまで)、出力ファイルを選択するための「名前を付けて保存」ダイアログはクローズされません。

フィルタプログラムのなかには、「-」というコマンド行パラメータを指定することによってファイルリストのなかに標準入力を含めることができるものがあります。多くのGUIフロントエンドの「入力ファイル」ダイアログボックスには、これにヒントを得た「stdin追加」ボタンが含まれています。このボタンを押すと、「実行」ボタンを押したときのクリップボードの内容を一時ファイルに格納し、他の入力ファイルとともにコマンド行ツールに渡しますが、GUIフロントエンドのコマンド行表示部には一時ファイル名ではなく、先ほど触れたようなフィルタで標準入力を指定するために使われている「-」が表示されます。ただし、本当に標準入力を渡すわけではありませんので、Windows付属のfind.exefindstr.exeなどの「-」をサポートしないプログラムの「入力ファイル」ダイアログボックスにも、「stdin追加」ボタンは含まれています。また、コマンド行ツールとしてcygwinツールのプログラムを使う場合には、「設定」ダイアログでディレクトリ区切り子を「/」にしなければ、うまく動作しません(その理由については、本節の「直接指定」を参照してください)。

dirlsなどのプログラムの場合、入力ファイルというわけではありませんが、コマンド行パラメータとしてファイル名を指定できます。これらのプログラムのフロントエンド(及び、これらのプログラムを起動できる: pipeline2つのフォルダを指定できる: diff)では、ファイル名だけではなく、ディレクトリ(フォルダ)名を指定することもできます。「フォルダ追加」ボタン(の場合は「フォルダ1」、「フォルダ2」)を押すと、「フォルダの参照」ダイアログボックスが表示されます。このダイアログボックスでディレクトリ(フォルダ)を選択すると、リストにそのディレクトリが追加されます。エクスプローラや他のGUIフロントエンドでディレクトリを選択し、dirlsのダイアログボックスに[Shift]キーを押しながらドラッグアンドドロップ、コピーアンドペーストすると、ファイルをドロップ、ペーストしたときと同様のメッセージボックスが表示され、ファイルリストにそのディレクトリを追加できます。(Windows 9x/Me用の: dirの場合、他のプログラムと同様の方法で複数の対象ファイル、フォルダを指定することはできませんので、「フォルダ参照」ダイアログをオープンする「ディレクトリ」ボタンと「ファイルを開く」ダイアログをオープンする「ファイル」ボタンが並べられています)。

の「入力ファイル」ダイアログボックスには、「リダイレクト記号を使う」チェックボックスがあります。標準入力を読み出せるものの、ファイル名引数を受け付けないコマンド行プログラムをパイプラインの先頭に配置する場合は、このボックスをチェックしてください。

ファイルの並べ替え

先ほども触れたように、入力ファイルがどのような順番で指定されているかがコマンド行プログラムの実行に大きな影響を与えることがあります。そこで、「入力ファイル」ダイアログボックスは、ファイルの順番を変えられるようになっています。

ファイルリストのタイトル行の「名前」と書かれているところをクリックすると、ディレクトリ名の部分のないファイル名の部分だけを使ってファイルをアルファベット順に並べ替えます。もう1度クリックすると、ファイルは逆順になります。

同じくファイルリストのタイトル行の「フォルダ名」と書かれているところをクリックすると、ディレクトリ名の部分も含めたフルパス名でファイルをアルファベット順に並べます。もう1度クリックすると、やはり逆順になります。

さらに、マウスでファイルを1つ選択してリストのなかで上下に動かし、ドラッグアンドドロップすると、そのファイルの位置を前後に動かすことができます。

 

リストからのファイルの除去

ファイルリストのなかでファイルを選択し(複数でも可)、キーボードの[Delete]キーを押すか、「除去」ボタンを押すと、それらのファイルがファイルリストから消えます。このときの動作は、ファイルをディスクから取り除いてしまうのではなく、単純に入力ファイルリストから取り除くだけです。あとで同じファイルを再び追加することはもちろん可能です。

直接指定

リストを使って指定する」ではなく、「直接指定する」を選択すると、その下のエディットボックスを使ってファイル名を直接入力できるようになります(ただし、ファイルをドロップ、ペーストすると、自動的に「リストを使って指定する」が選択されます)。リストを使ってファイル名を指定するときには、絶対パス名、つまりドライブ名とルートディレクトリ以下のすべてのディレクトリ名を明示した形での指定になりますので、カレントディレクトリがどこでも同じ結果が得られます。しかし、直接指定の場合には、絶対パス名ではない形でファイル名を指定できますので、カレントディレクトリがどこかということが大きな意味を持ちます。たとえば、ディレクトリ名を一切指定せずにファイル名だけを指定すると、カレントディレクトリ内でそのファイルを探します。カレントディレクトリを起点とする相対パス名を使うこともできます。たとえば、「../some/file.txt」は、カレントディレクトリの親ディレクトリ(..)someというサブディレクトリに含まれているfile.txtファイルという意味になります。

しかし、直接指定でもっともよく使われるのは、ワイルドカード、つまり複数のファイルをまとめて指定できる特別な意味を持つ文字を利用する方法でしょう(UNIXの世界では、ワイルドカードではなく、メタキャラクタという用語が使われるようです)。Windowsでは、MS-DOSの時代から*?2種類のワイルドカードを使えます。たとえば、*.txtと書くと、ファイル名の末尾が.txtになっているすべてのファイルを入力ファイルとして指定できます。つまり、*は任意の個数の任意の文字を表すことができます。それに対し、?1個の任意の文字を表します。たとえば、???.txtと書くと、拡張子が.txtで拡張子以外の部分が3文字のすべてのファイルが選択されます。

cygwinツールは、UNIXと同様に、*?以外に[]をサポートします。たとえば、chap[0-9][0-9].txtとすると、chapの後ろに数字が2桁続き、拡張子が.txtのファイルが選択されます。つまり、[]を使うと、そのなかに含まれる文字1字分を表すことができます。また、通常のWindowsプログラムでは、パス内の複数のディレクトリにまたがって*\*.txtというような指定をすることはできませんが、cygwinツールならできます(ただし、\はほかのメタキャラクタの特別な意味を消すメタキャラクタとして使われますので、\\のように\を重ねるか、UNIXと同様の/でディレクトリ名を区切る必要があります)。

PCKのコマンド行プログラムでは、[]は使えませんが、パス内の複数のディレクトリにまたがって*?を使うことはできます(Windows標準添付ツールでは、このような指定は認められていません)。また、「\は普通のWindowsプログラムと同様に、ディレクトリ名を区切るための文字として使えます。ディレクトリ名の区切り文字としては、「/」も使えます。

補助入力

ところで、入力として「-」をサポートし、複数の入力ファイルを受け付けるプログラムは、パイプラインから渡された標準入力と通常のファイルの両方を入力として受け付けることができます。たとえば、次のコマンド行を見てください。

 

sort 1.txt | cat 2.txt -

 

このコマンド行は、2.txtの後ろに1.txtをソートした結果を付加します。このようなコマンド行を作りたい場合には、まず次のようにのメインダイアログにをセットし、入力グループの「ファイル」ボタンで1.txtを選択します。

 

 

あとはcatの入力を指定するだけですが、このようにパイプラインの途中で与える入力は、入力グループの「ファイル」ボタンではなく、リストのを選択した上で「補助入力」ボタンを押して指定します(古いバージョンではリストのを右クリックしたときに表示されるコンテキストメニューから「追加入力」を選択していました)。「補助入力」コマンドを選択できるのは、コマンド行オプションで「-」を指定すれば標準入力を読み出すことができ、かつ複数の入力ファイルを受け付けるコマンド行プログラムに対応するGUIフロントエンドのアイコンが表示されているアイテムだけです。

このコマンドを選択すると、メインダイアログの左上に次のようなダイアログボックスが表示されます。

 

 

通常の入力ファイルダイアログボックスとほぼ同じですが、タイトルバーが補助入力であることを示しています。リストによる指定と直接指定のどちらを使ってもかまいませんが、標準入力(-)を追加しなければ、パイプラインのそのコマンドまでの処理内容が捨てられてしまうことに注意してください。

補助入力ダイアログボックスをオープンしても、メインダイアログボックスは操作できますが、リストアイテムの順番が変わるような操作(「ロード」「クリア」「除去」ボタンとアイテムの並べ替え)は禁止されます。補助入力ダイアログボックスがすべてクローズされれば、これらの操作も再び実行できるようになります。

上記のように指定したあと、メインダイアログボックスは次のようになります。

 

 

リストののところに2.txt -という文字が追加されていることに注意してください。これは、補助入力が指定されていることを示すためのもので、ディレクトリ名などが省略されています。

1.txtが次のような内容で、

 

1.txtファイル

ソートされても

中身は同じ

 

2.txtが次のような内容なら、

 

2.txtファイルの内容

これだけ

 

このコマンド行からは次のような出力が得られます。

 

2.txtファイルの内容

これだけ

1.txtファイル

ソートされても

中身は同じ

 

補助入力の内容は、リストアイテムをリスト内で移動してもそのアイテムについていきます。しかし、リストの先頭アイテムの補助入力はコマンド行の組み立てでは無視され、入力グループボックスの「ファイル」ボタンで指定した内容が使われます。