8. リダイレクト 

   8−1  標準入出力
   8−2  出力のリダイレクト
   8−3  入力へのリダイレクト

<前章までの状態>
  D:ドライブに test ディレクトリがあります。
  D:\ にバッチファイル test.bat があります。
  D:\test ディレクトリの中
    ディレクトリ renshu
    テキストファイル test.txt, test2.txt, test3.txt
    バッチファイル of.bat
 D:\
 ├test.bat
 └test
   ├ renshu
   ├ test.txt
   ├ test2.txt
   ├ test3.txt
   └ of.bat


8−1  標準入出力

DOS窓内には、「標準入出力」という概念があります。 これは抽象的な概念で、DOS窓上で実行されるすべてのコマンドは「標準入力」 から文字を受け取る用意を持ち、実行結果またはメッセージを「標準出力」 に出力します。

 標準入力 
−文字列→
 コマンド 
−文字列→
 標準出力 

そして通常は、標準入力=キーボード、標準出力=画面(DOS窓)と いうふうに設定されているわけです。

 キーボード 
−文字列→
 コマンド 
−文字列→
 画面(DOS窓) 

DIR コマンドの結果がDOS窓に表示されるのは、正確には「DIR の 結果が標準出力に出力されている(現在の標準出力の出力先は画面である)」と理解 するべきです。
ちょっと考えると二度手間であるかのようなこの仕組みが、CUIの世界にとって、 実は非常に重要な仕組みなのです。
標準入出力を、通常のデバイスから任意のファイルに変更することができます。 これをリダイレクトといいます。
入力をファイルに切り替えるということは、コマンドからの入力要求に対して、キー ボードから入力するかわりに、ファイルに書き込まれた文字列を渡すことができると いうことを意味します。
出力をファイルに切り替えるということは、コマンドの実行結果を、画面ではなく ファイルの中に書き出すことができるということを意味します。


8−2 出力のリダイレクト

標準出力の出力先をDOS窓の画面からファイルに切り替えるには、
 コマンド > 出力先ファイル
という書式を使います。
DIR コマンドの出力を、list という名前のファイルにリダイレクトします。
ファイル名 list は、あらかじめ存在している必要はありません。 逆に、もし list がすでに存在しているファイルであっても、この処理を実行すると ファイルの内容は上書きされてしまいます。

 D:\test>dir /b
 of.bat
 renshu
 test.txt                 ← DIR /B の結果を標準出力へ出力
 test2.txt
 test3.txt

 D:\test>dir /b > list  ← 出力を list にリダイレクトする
                             出力しました
 D:\test>

list の中身を確認してみましょう。

 D:\test>type list
 list                ← DIR 実行より先に list が生成されるため
 of.bat
 renshu
 test.txt
 test2.txt
 test3.txt

 D:\test>


 コマンド >> 出力先ファイル
とすると、出力先ファイルの末尾に追加書き込みされます。

 D:\test>dir /b > list   ← 出力を list にリダイレクト

 D:\test>dir /b >> list  ← 追加書き込みのリダイレクト

 D:\test>type list
 list                 ↓↓ list の中身を画面表示しました ↓↓
 of.bat
 renshu
 test.txt
 test2.txt
 test3.txt
 list         - - - - - - - - - -↓↓ 追加された分 ↓↓
 of.bat
 renshu
 test.txt
 test2.txt
 test3.txt

 D:\test>



8−3  入力へのリダイレクト

標準入力からの入力をキーボードからファイルに切り替えるには、
 コマンド < 入力用ファイル
という書式を使います。
例えば、コマンドの確認メッセージをキーボードからではなく、ファイルから 入力することができます。
D:\testall.txt というテキストファイルを作成して下さい。
そのファイルには 「 A 」 1文字だけを書き込んで保存します。
無題−メモ帳
ファイル(F) 編集(E) 書式(O) ヘルプ(H)
 A


 D:\test>type yesno.txt
 A                              ← yesno の中身を見ています

 D:\test>copy * renshu
 all.txt
 list
 of.bat                         ← 全ファイルを \renshu にコピー
 test.txt
 test2.txt
 test3.txt
        6 個のファイルをコピーしました。

 D:\test>copy * renshu
 all.txt
 renshu\all.txt を上書きしますか? (Yes/No/All): a
 list                                   
 of.bat                                キーボードから入力
 test.txt
 test2.txt
 test3.txt
 yesno.txt
        6 個のファイルをコピーしました。

 D:\test>copy * renshu < all.txt  ← 入力のリダイレクトあり
 all.txt
 renshu\all.txt を上書きしますか? (Yes/No/All): A
 list                                          
 of.bat                       上書き確認が自動的に入りました
 test.txt
 test2.txt
 test3.txt
        6 個のファイルをコピーしました。

 D:\test>


ファイルが標準入力の肩代わりをできるとわかっても、これだけでは入力のリダイレクト のメリットを感じることができないと思います。
標準入力がリダイレクトできることの便利さは、むしろ次節に述べる「パイプ」と いう機能によって明らかにされます。

renshu にコピーしたファイルは削除しておいてください。

 D:\test>del renshu\*
 D:\test\renshu\*、よろしいですか (Y/N)? y

 D:\test>