15.リダイレクト 入出力先を変更する

リダイレクト」とは本来の出力先や入力元とは異なるデザインすに出力や入力に切り替えることを言います。

リダイレクト機能を使えば、通常、コマンドプロンプトのウインドウに表示(出力)されるテキストをファイルに出力したり、キーボードでデータなどを入力するところをファイルを開いて取り込むことができます。

標準入力と標準出力、標準エラー出力

コマンドは必要に応じてデータを受け取ったり、処理した結果をウインドウ内に表示したりします。この「データを受け取る」ことを入力、データをウインドウなどに渡すことを出力と言います。さて、Windowsのみならず大抵のシステムは入出力に標準的なデバイス(周辺機器のこと)を設定しています。

入力用のデバイスであればキーボードで、これを標準入力と言います。また出力用のデバイスであればディスプレイ(Windowsでは各ウインドウに当たります。)で、これを標準出力と言います。コマンドは特に指示のない場合、標準入力であるキーボードからデータを受け取り、処理した結果を標準出力であるコマンドプロンプトのウインドウにデータを渡します。これらデータの流れをデータストリームといいます。

一般的なシステムのデータの流れ

標準入力をSTDIN(Standard input)、標準出力をSTDOUT(Standard output)といいます。また両方をまとめて標準入出力(STDIOで、Standard input output)といいます。

コマンドを実行したときにエラーが起きた場合、コマンドプロンプトは標準出力でエラーをウインドウに表示すると行ったことはせずに、別途、標準エラー出力というデータストリームを使用し、エラーメッセージをウインドウに表示させます。標準エラー出力はSTDERR(Standerd error output)と表記します。

リダイレクト記号

リダイレクトには入力元や出力先を、「線路の切り替え機」のように他のデバイスに切り替える機能があります。その機能を使って、本来キーボードから受け取る情報をテキストファイルから受け取ったり、ウインドウに表示される情報をテキストファイルに保存したりするには、リダイレクト記号を使います。

リダイレクト機能を使って、本来キーボードから受け取る情報をテキストファイルから受け取ったり、ウインドウに表示される情報をテキストファイルに保存したりするには、リダイレクト記号を使います。

リダイレクト記号には以下の3つがあります。

  • < 標準入力を他のデバイスに切り替え
  • > 標準出力を他のデバイスに切り替え
  • >> 標準出力を他のデバイスに切り替えてデータを追加する(append機能)

使い方は以下のように、まずコマンドを記述します。記述したコマンドに対してリダイレクト記号を記述します。さらに他のデバイスとして、ファイル名などを記述します。このコマンド、リダイレクト記号、デバイス名はそれぞれ半角スペースで区切ります。

例:
> DIR /S > directory-info.txt
> コマンド名 スイッチ リダイレクト ファイル名

標準出力をファイルに保存する

「>」のリダイレクト記号を使えば、本来ウインドウに表示されるコマンドの処理結果をテキストファイルなどに保存することができます。

書式:コマンド > ファイル名

コマンドはスイッチやオプションなど、必要な情報を従来と同じように記述してください。リダイレクト記号は半角英数です。ファイル名はカレント以外の場所に保存する場合、パスが必要になります。

例題:カレント以下のディレクトリ情報をDocumentsディレクトリにdirectory-info.txtとして保存する。

> DIR /S > directory-info.txt

標準入力をファイルから入力する

「<」のリダイレクト記号を使えば、本来キーボードなどから入力されるデータをテキストファイルなどから受け取ることができます。

書式:コマンド < ファイル名

読み込むファイルがカレントに存在しない場合はパスが必要になります。

例題:カレント以下のディレクトリ情報を照準で並べ替える

> dir /s/a:d > directory-info.txt
> sort < director-info.txt

上記のコマンドは、1. DIRコマンドでディレクトリのみの情報を標準出力をdirectory-info.txtに切り替えて保存。2. 保存したファイルを標準入力を切り替えてSORTコマンドで読み込んで、並べ替えたデータをウインドウに表示します。

さらに並び替えたデータをdirectory-info-sorted.txtとして保存する場合は、

> dir /s/a:d > directory-info.txt
> sort < director-info.txt > directory-info-sorted.txt

というふうに、さらに「>」をつけてその後に保存したいファイル名を記述しましょう。

標準出力の内容を既存のファイルに追加する

「>>」のリダイレクト記号を使えば、本来ウインドウに表示されるコマンドの処理結果を「既存の」テキストファイルなどに追加して保存することができます。

書式:コマンド >> ファイル名

例題:リダイレクトを使用して作成したテキストファイルにデータを追加保存する

> dir pictures > directory-info.txt
> dir Documents >> directory-info.txt
> dir Music >> directory-info.txt

まず、Picturesディレクトリ内の情報がdirectory-info.txtにファイルとして保存され、次にDocuments内の情報がdirectory-info.txtに追加して保存される。最後にMusicの内容がdirectory-info.txtに保存されるため、テキストファイルの内容はPictures、Documents、Musicの順で保存されます。

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Pictures のディレクトリ

2020/07/06  14:12    <DIR>          .
2020/07/06  14:12    <DIR>          ..
2020/07/06  14:12    <DIR>          Camera Roll
2020/07/06  14:12    <DIR>          Screenshots
               0 個のファイル                   0 バイト
               4 個のディレクトリ  85,910,163,456 バイトの空き領域

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Documents のディレクトリ

2020/06/16  23:09    <DIR>          .
2020/06/16  23:09    <DIR>          ..
2020/06/16  23:09    <DIR>          Applications
               1 個のファイル               5,016 バイト
               3 個のディレクトリ  85,910,159,360 バイトの空き領域

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥kobedenshi¥Music のディレクトリ

2020/06/13  17:42    <DIR>          .
2020/06/13  17:42    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  85,910,159,360 バイトの空き領域

コマンド実行時のエラーを保存する

コマンドを実行したときエラーが出て、コマンドが正しく終了しないと標準エラー出力を通してウインドウにエラーが表示されます。標準出力をテキストファイルに保存するのと同様に、標準エラー出力をテキストファイルに保存、またはアペンドを使用して追加保存します。

標準出力を切り替えるには「>」記号を使いましたが、標準エラー出力は単に「>」記号を使っても標準出力が保存されるだけで、エラーメッセージは表示されません。標準エラー出力を保存するには以下のように記述する必要があります。

書式:コマンド 2> ファイル名

リダイレクト記号の前に「2」という数字がついているのが分かります。この数字をファイルハンドルと言います。標準入力、標準出力、標準エラー出力にはこのファイルハンドルが設定されていて、リダイレクト記号につけることで特定のデータストリームだけをリダイレクトすることができるようになります。ファイルハンドルの種類は以下の通りです。

  • 0 stdin 標準入力
  • 1 stdout 標準出力
  • 2 stderr 標準エラー出力

このファイルハンドルを使用すると標準エラー出力であるエラーメッセージもテキストファイルに保存することができます。

> DIR document 2> dir-err.txt

この場合、リダイレクトを使用しないとウインドウに「ファイルが見つかりません」とエラーが表示されますが、エラー出力をファイルハンドルで指定して、dir-err.txtにリダイレクトしているためにウインドウには何も表示されず、エラーメッセージはdir-err.txtに保存されます。

では、その場合、標準出力はどうなっているのでしょうか?

上記のコマンドでは標準エラー出力のみをリダイレクトしているため、標準出力である「ドライブC〜」のメッセージは保存されません。それでは標準出力と標準エラーメッセージを同じファイルに保存するにはどうすればいいのでしょうか?
答えは以下の通りに記述します。

> DIR document > dir.txt 2>&1

最後のファイルハンドル操作で標準エラー出力と標準出力を結合しているのです。「>&」は複数のデータストリームを結合することができます。上記のコマンドの実行結果は以下の通りとなります。

 ドライブ C のボリューム ラベルは Windows10 です
 ボリューム シリアル番号は 7EEF-2850 です

 C:¥Users¥uotaa のディレクトリ
ファイルが見つかりません

通常のDIRの出力と「ファイルが見つかりません」というエラー出力が両方とも保存されていますね。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA