バッチスクリプトでリダイレクト

Windowsでも、コンソールプログラム(黒い画面が上がるプログラム)の
標準出力(画面表示)や標準エラー出力(これも画面表示か)を、
ファイルに出力(リダイレクト)できます。

標準出力のリダイレクト

例えば、「dir」の結果を「dir.txt」に出力したい場合は、コマンドプロンプトを起動し

> dir > dir.txt


「dir.txt」に追記したい場合は、

> dir >> dir.txt

標準エラー出力のリダイレクト

例えば、「dir」のエラーを「err.txt」に出力したい場合は、

> dir 2> err.txt

通常、何も出ないですけど、、、。


こちらも追記したい場合は、

> dir 2>> err.txt

標準出力と標準エラーを同じファイルに出力する

> dir > dir.txt 2>&1

これは、順番が重要。
リダイレクトは、順番に解釈されるからです。


その前に、この「2」ってヤツですが、、、ファイル・ディスクリプタと言いまして

ファイル・ディスクリプタ 意味
0 標準入力。入力で省略すると0指定となる
1 標準出力。出力で省略すると1指定となる
2 標準エラー出力

となっています。


で、「dir > dir.txt 2>&1」を翻訳すると

  1. 「> dir.txt」は、「標準出力」を「dir.txt」に出力する
  2. 「2>&1」は、「標準エラー出力」を「&1」すなわち「今の標準出力と同じ」に出力する、ので、「dir.txt」に出力する


これを逆に

> dir 2>&1 > dir.txt

とすると、

  1. 「2>&1」は、「標準エラー出力」を「&1」すなわち「今の標準出力と同じ」に出力する、ので、「画面」に出力する
  2. 「> dir.txt」で、「標準出力」を「dir.txt」に出力する

となります。


ちなみに、先ほどのファイル・ディスクリプタの説明から判ると思いますが、

> dir > dir.txt

は、

> dir 1> dir.txt

と同じです。



愚痴です

なんでこんなことを書いたかと言えば、会社で以下のようなやり取りがあったため。

A「DLLのログが出ないんですが」
私「(DLLは私が作ったんじゃないけど)それは呼び出し元のこの設定次第です」
A「Bさん、この設定はどうなってますか?」
B「何も渡してないです、、、この辺で初期化して0が、、、」
私「(NULL?んなわけねーべ。エラーになるっつーの)」
A「あ、そこで設定してますね」
B「ほんとだ。STDERRですね」
A「画面かぁ。ファイルに欲しいんですよね。では、これを改造して、、、」
私「(アホかい!)標準エラー出力をリダイレクトすればいいんじゃないですか?」
A「たしか、標準エラーはリダイレクトできないんじゃ?」
私「(あほ・アホ・あほぅ)『>』でなくて『2>』で出来ますよ」
A「全然わかんない」
私「いやだから、リダイレクトの時『2>』にすれば出来るんですよ」
A「『>』の代わりに『2』を書けばいいのか」
私「(なんでそんな結論になる)いえいえ『2>』としてください」
B「へー、知らなかった」


、、、んだ、こらぁ!
このWindowsべったりどもめっっっ!!!
技術者ならシェルの知識くらい持っとけ!
Windowsのバッチスクリプトも一緒じゃコラ。


いや、みょーに、腹が立ったので。
そんなもん、ってこたぁ、わかってますです。
今時、コマンドプロンプトからプログラム起動して喜んでるのは、私くらいのものです。
しかしねぇ、、、。
技術者でしょーに。