リダイレクト
DOSにあってWindowsにないもの。その一つが、このリダイレクト機能です。リダイレクトを使いこなすとデータをプログラムで転がすように加工できますし、パソコン操作のレベルがグッと上がります。DOSって便利だなと実感するのも、このリダイレクトの存在が大きく影響しています。
リダイレクトは線路のレール切り替え
さて、実際にリダイレクト操作する前に、標準入力(stdin)と標準出力(stdout)について説明しなければいけません。ちょっと概念的な話になるのですが、リダイレクトを理解するためには大切な話なので、じっくりと読み進めてください。
まず、DOS画面に出力されるテキスト文字は標準出力されているといいます。つまり、標準出力というデバイス(装置)があって、その出力先がたまたま画面であったと解釈するわけです。
キーボード >>---+ +--->> CRT
| |
ファイル >---+---> 標準入力 標準出力 ---+---> ファイル
| (stdin) (stdout) |
RS-232C >---+ +---> RS-232C
※標準入力がキーボードで標準出力がCRTの場合(打った文字が画面に出る)。
上図のCRTはディスプレー、つまり画面ですね。RS-232Cは通信するためのコネクタと思ってください。昔はRS-232C経由でモデム接続してパソコン通信ができました。
当たり前のことですが、画面に入力することはありませんし、キーボードに出力することもありません。しかし、RS-232Cはデータを出力したり入力したりするので、図の両端に書いてあります。これはファイルも同じで、ファイルから読み出すこともあればファイルに書き込むこともありますから、同じく図の両端に書いてあります。
つまり、キーボードは入力(専用)デバイス、画面は出力(専用)デバイス。RS-232Cやファイルは入出力デバイスです。そして、標準入力(stdin)とは現在、接続されている入力デバイスを意味します。同様に標準出力(stdout)とは現在、接続されている出力デバイスのことです。
ということは、その出力先が画面でなくファイルであれば、画面に出ていたテキスト文字は全てファイルに格納されることになります。同じように、標準入力も通常は入力元がキーボードなのですが、入力元をファイルとすることもできます。
これらの入力元・出力先を標準入出力に切り替えることをリダイレクトするといいます。レールの切り替え作業のようなイメージですね。では、さっそく試してみましょう。
実際にリダイレクトしてみよう
DOSを起動して、\foobarディレクトリに移動してください。その後、dirコマンドを投入してみます。
(略)
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
0 個 0 バイトのファイルがあります.
2 ディレクトリ 4,587.83 メガバイトの空きがあります.
これらの画面表示をリダイレクトして、ファイルに保存してみましょう。リダイレクトするためのコマンドは特になく「>」記号があるだけです。dirに続いて以下を投入してみてください(dirと>の間は半角スペース)。
C:\foobar>プロンプトが表示されただけですが、list.txtファイルが作成されているはずです。dirコマンドで確かめましょう。
(略)
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
LIST TXT 389 04-04-05 16:14 list.txt
1 個 389 バイトのファイルがあります.
2 ディレクトリ 4,587.81 メガバイトの空きがあります.
list.txtが389バイトで作成されていますね。typeコマンドで中身を見てみましょう。
ドライブ C: のボリュームラベルは WINDOWS 98
ボリュームシリアル番号は 1471-12D6
ディレクトリは C:\foobar
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
LIST TXT 0 04-04-05 16:14 list.txt
1 個 0 バイトのファイルがあります.
2 ディレクトリ 4,587.81 メガバイトの空きがあります.
先ほどのdirコマンドの内容がファイルに書き込まれていますね。何だか混乱してきた人はWindowsでfoobarフォルダの中にあるlist.txtを開いてみてください。理解できると思います。
追加リダイレクトを試してみよう
ちなみにファイルの末尾に続けて書き込むことができる追加リダイレクトという便利な方法もあります。追加リダイレクトするためのコマンドも特になく「>>」記号をファイルの前に書くだけです。先ほどのlist.txtに追加リダイレクトで、再度dirコマンドの内容を書き込んでみましょう。
これで先ほどのlist.txtにdirの内容が追加で書き込まれています。つまり、list.txtにはdirの内容が2回書き込まれていることになります。typeコマンドで中身を見てみましょう。
ドライブ C: のボリュームラベルは WINDOWS 98
ボリュームシリアル番号は 1471-12D6
ディレクトリは C:\foobar
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
LIST TXT 0 04-04-05 16:14 list.txt
1 個 0 バイトのファイルがあります.
2 ディレクトリ 4,587.81 メガバイトの空きがあります.
ドライブ C: のボリュームラベルは WINDOWS 98
ボリュームシリアル番号は 1471-12D6
ディレクトリは C:\foobar
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
LIST TXT 389 04-04-05 16:14 list.txt
1 個 389 バイトのファイルがあります.
2 ディレクトリ 4,587.81 メガバイトの空きがあります.
きちんと2回分、追加で書き込まれていますね。
入力元もリダイレクトできる
ここまでが標準出力のリダイレクトです。逆に標準入力のリダイレクトも存在します。DOSで日付を変えるコマンドにdateコマンドがありますので、dateコマンドを投入してみてください。
現在の日付は 20**-**-** (**) (**のところは日によって異なる)
日付を入力してください(年-月-日):
今度は、C:\foobar>プロンプトが表示されずにカーソルが年月日の後で点滅しています(Windowsのバージョンによっては若干表示が異なります)。日付を確認するだけならそのままエンターキーを押します。変えるつもりなら日付を入力します。ここでは日付を1999-12-31と入力して、日付を過去に戻してみましょう。
現在の日付は 20**-**-** (**) (**のところは日によって異なる)
日付を入力してください(年-月-日): 1999-12-31 <-- キーボード入力
C:\foobar>プロンプトが表示されたら、再度、dateコマンドを投入してください。
現在の日付は 1999-12-31 (金)
日付を入力してください(年-月-日):
日付が変わっていますね。今回は確認だけで変更はしないので、カーソルが点滅しているところで(日付を入力せずに)エンターキーだけを入力します。
同じことを標準入力のリダイレクトを使って行ないます。Windowsでfoobarフォルダにdate.txtというファイルを作り、その中に今日の日付(例えば、2004-04-04)を入力して、最後にエンターキーを押してください。そして、そのファイルを保存してください。
DOSに戻って、dirコマンドを投入すると以下のようになっているはずです。
(略)
. <DIR> 04-04-05 12:13 .
.. <DIR> 04-04-05 12:13 ..
LIST TXT 778 04-04-05 16:24 list.txt
DATE TXT 12 99-12-31 16:34 date.txt
2 個 790 バイトのファイルがあります.
2 ディレクトリ 4,583.78 メガバイトの空きがあります.
さて、標準入力をリダイレクトして、日付を今日の日付に戻してみます。標準入力リダイレクトに対応するコマンドも特になく「<」記号を使用します。以下のコマンドを投入してください(dateと<の間は半角スペース)。
現在の日付は 1999-12-31 (金)
日付を入力してください(年-月-日): 2004-04-04
今度はどうですか?すぐにC:\foobar>プロンプトが出てきました。日付もファイルで用意した日付が自動的に入っています。dateコマンドで確認してみてください。2004-04-04に変わっているはずです。
今回の例だけだと、リダイレクトの強力さがあまり伝わらないと思いますが、少し違う世界が見えたのではないのでしょうか。
後始末はしっかり
最後に、dateコマンドで今日の日付に戻した後、exitコマンドでDOS窓を終了してください。
【今回のDOSコマンド(記号)】
「date」「>」「>>」「<」