MSX Datapack wiki化計画

6章 リダイレクションとパイプ

※
※ このページは書きかけです。以下の可能性があります。
※ ・誤字、脱字等のチェックをおこなっていません。
※ ・テキスト、表などフォーマットがされていない。
※ ・画像が抜けている。
※

 COMMAND2.COMは、以下に述べるリダイレクションおよびパイプの機能を提供しています。ただし環境変数「REDIR」を「SET REDIR=OFF」コマンドで「OFF」にセットすると、この機能は働かなくなるので、MSX-DOS1やCP/Mとの互換性を保つことができます。

 6.1 リダイレクション

 大部分のコマンドはCP/MプログラムもMSX-DOSプログラムも「標準出力」へ書き出すことによって画面にテキストを出力し、「標準入力」から読み込むことによってキーボードから読み込みます。しかしCOMMAND2.COMはコマンドを実行している間だけ、標準入力と標準出力を他のMSX-DOSデバイスやディスク上のファイルを参照するように、変更する機能を提供しています。これは、コマンド行にリダイレクション記号「<」、「>」および「>>」のうち1つ以上を含めて、その後にファイル名を置くことによって可能になります。
 例えば、ECHOコマンドは標準出力に文字を出力することによって、文字列を画面に表示するだけですが、その出力を次のようにリダイレクトすることによって、その代わりにプリンタに出力を行うことができます。

ECHO text > PRN

 これによってECHOコマンドの実行中に標準出力がデバイスPRNを参照するように変更できます。

ECHO text > file1

 同様に、このコマンドによってFILE1という名前のファイルが作成され、ECHOコマンドの出力がファイルへ出力されます。また、「>」記号の代わりに「>>」記号を使うと、コマンドの出力を既存のファイルに追加することができます。指定されたファイルが存在しない場合にはファイルを作成します。
 標準入力を変更するには、「<」記号を「>」記号と同様の方法で使用します。この場合、ファイルは既存のものでなければならず、コマンドに対して適切な入力が含まれていなければなりません。コマンドがファイルの終わりを越えて入力を読もうとすると、続行できないためコマンドは打ち切られます。
 コマンド行にリダイレクション情報が指定されると、それはCOMMAND2.COMがリダイレクションをセットアップするために使い、コマンド行からは除去されます。したがって上記の例では、ECHOコマンドはリダイレクション記号やファイル名をエコーしません。
 バッチファイルの入力や出力がリダイレクトされると、リダイレクションはバッチファイル中の全てのコマンドに対して適用されます。ただしバッチファイル中の個々のコマンドでリダイレクションを使用することも可能で、この場合バッチファイルに対してのリダイレクションに優先します。バッチファイル中のコマンドについて詳しくは7章「バッチファイル」を参照して下さい。

 6.2 パイプ

 コマンドやプログラムの入出力を、他のデバイスやディスクファイルに対してリダイレクトできるのと同様、一つのコマンドの標準出力を別のコマンドの標準入力へリダイレクト、すなわち「パイプ」ができます。
 一般には、2番目のコマンドはそれ自身の標準入力から読み込んでデータを修正し、それをそれ自身の標準出力へ書き出すプログラムです。このようなプログラムは「フィルタ」と呼ばれます。例えば、フィルタは標準入力からデータを読み込んで、それをアルファベット順にソートし、それを標準出力に書き出すといったことができます。したがってDIRコマンドの出力をソートすることもできます。
 パイプはコマンド行上で2つ以上のコマンドを「|」記号で区切ることによって指示します。「|」記号の左側のコマンドが最初に実行され、その出力がCOMMAND2.COMによって一時的に作成されるテンポラリファイルにリダイレクトされます。それから2番目のコマンドがその標準入力を同一のテンポラリファイルからリダイレクトされて実行されます。2番目のコマンドが終了すると、テンポラリファイルは削除されます。2番目のコマンドの標準出力を、3番目のコマンドの標準入力へパイプしたり、さらに(別のコマンドに)続けたりすることももちろんできます。
 パイプを含むコマンド行での入力のリダイレクションが起こると、リダイレクションはパイプの最初のコマンドに対して適用され、そのコマンドはその標準入力をパイプ直前のコマンドの標準出力から受け取ります。同様に、パイプを含むコマンド行で出力のリダイレクションが指定された場合には、そのリダイレクションはコマンド行の最後のコマンドに対して適用されます。
 パイプをバッチファイルの入力または出力のどちらかで直接使うことはできません。しかし、COMMAND2コマンド(P.84「COMMAND2」を参照)から実行するならば、バッチファイルでパイプを使用することが来ます。なぜならば、その場合リダイレクトされるのはバッチファイルではなくCOMMAND2コマンドだからです。
 上記のように、ひとつのコマンドの出力を他の入力へパイプするためには、テンポラリファイルがCOMMAND2.COMによって作成され、削除されます。これらのテンポラリファイルの場所はTEMP環境変数(8章「環境変数の設定」を参照)によって指定され、これは他のドライブやディレクトリを参照するように変更できます。例えばTEMPがRAMディスク上のディレクトリを参照していれば、パイプはかなり高速になります。デフォルトではTEMPはブートディスクのルートディレクトリになっています。テンポラリファイルに使用されるファイル名はCOMMAND2.COMによって作成されるため、TEMPはドライブとディレクトリだけを指定しておきます。テンポラリファイルのファイル名は次のような形式となります。

%PIPExxx.$$$

ここでxxxは3桁の数値で、TEMPディレクトリ中の他のファイルと衝突しないようにCOMMAND2.COMによって選択されます。