(1) バッチで見る「2>&1」の意味とリダイレクトの種類について
(1-1) 「2>&1」の意味
(1-2) 「2>&1」の各文字の意味
(1-3) リダイレクトの種類
(1-4) サンプルプログラム
(1) バッチで見る「2>&1」の意味とリダイレクトの種類について
(1-1) 「2>&1」の意味
本日はWindowsのバッチで見かける「2>&1」の意味や使い方についてご紹介します。
結論から申しますと、この記述は『「エラー出力」を「標準出力」にリダイレクトする』という処理になります。つまり、「標準エラー出力」に出たエラーメッセージを「標準出力」に転送するようなイメージになります。
1つ例を見てみます。次のバッチはまずコマンド「cd C:\NotExistingPath」が実行されますが、このパスは存在しないので「指定されたパスが見つかりません。」というエラーになります(図①)。次に「2>&1」が登場して「標準エラー出力」を「標準出力」にリダイレクトしています(図②)。加えて、もう一回リダイレクトをしていて「>」の働きにより「標準出力」を「Result.txt」というテキストファイルにリダイレクトしています。
(例)
@echo off echo ###Test0: cd C:\NotExistingPath > Result.txt 2>&1
この2つのリダイレクトを連結する事で、結果的に「標準エラー出力」⇒「標準出力」⇒「テキスト」とリレーで連携した事になります。
(図111)
(1-2) 「2>&1」の各文字の意味
まず「>」が「リダイレクト」を意味する記号になります。[左辺] > [右辺]で、左辺のコマンド/変数の結果を右辺にリダイレクトするという意味になります。
「2」は「標準エラー出力」を表しており、「1」は「標準出力」を表しています。また1の前の「&」はリダイレクトを複数組み合わせる場合に1の前に付ける記号になります(お作法)。
(1-3) リダイレクトの種類
ここまでの情報を踏まえると、リダイレクトの「左辺」と「右辺」の指定の仕方によっては、リダイレクトの「リダイレクト元」と「リダイレクト先」の組み合わせでいくつかパターンがあるのでは?と思われると思います。代表的なパターンを以下にまとめています。
(表)リダイレクトの種類
① | [左辺] > [右辺] | 左辺(コマンドや変数)を右辺(テキストや「nul」など)にリダイレクト(転送)します。 ————- (例) echo %[何かの変数]% > output.txt |
② | [左辺] 1> [右辺] | 「標準出力」(コマンドの実行結果)を右辺(テキストや「nul」など)をリダイレクトします。 ————- 「標準出力」はコマンドの結果が出力されているので、結果的に「[左辺] > [右辺]」と同じ結果になります。 (例) |
③ | [左辺] 2> [右辺] | 「エラー出力」を右辺(テキストや「nul」など)をリダイレクトします。 ————- 下記の例では通常なら「指定されたパスが見つかりません。」とエラーが出力される所を、下記でnulにリダイレクトしているため、何も表示されません。 (例) |
④ | [左辺] 1> [右辺] 2>&1 or [左辺] > [右辺] 2>&1 |
リダイレクトを2つ組み合わせています。組み合わせる場合は、後に記載する方は「>&」と記述します。
(前半:2>&1) (後半:[左辺] 1> [右辺]) つまり、「エラー出力」⇒「標準出力」⇒「右辺」とリダイレクトしており、結果的には「標準出力」を中継ぎとして、「エラー出力」⇒「右辺」へのリダイレクトをしている事になります。 |
(1-4) サンプルプログラム
5つほど簡単なサンプルプログラムをご紹介します。
(サンプル1)
@echo off rem ############### 「標準出力」のリダイレクト rem 「標準出力」(=コマンドの実行結果)を右辺(テキストや「nul」)にリダイレクト。 echo ###Test0: set word3=3_GREEN echo %word3% 1> output2.txt
(図141)標準出力⇒テキストへリダイレクト:echoの結果は正常終了するのでリダイレクトされる
(操作動画)
(サンプル2)
@echo off rem ############### 「エラー出力」のリダイレクト rem 左辺(コマンド)を右辺(テキストや「nul」)にリダイレクトするも、 rem 左辺はエラー出力のため、コンソールにエラーが表示される echo ###Test1: rem 【結果】リダイレクトされない cd C:\NotExistingPath > output3.txt
(図142)標準出力⇒テキストへリダイレクト:cdの結果がエラー出力のためリダイレクトされず
(操作動画)
(サンプル3)
@echo off rem ############### 「エラー出力」のリダイレクト rem 「標準出力」(=コマンドの実行結果)を右辺(テキストや「nul」)にリダイレクトするも、 rem 左辺はエラー出力のため、コンソールにエラーが表示される echo ###Test2: rem 【結果】リダイレクトされない cd C:\NotExistingPath 1>> output3.txt
(図143)標準出力⇒テキストへリダイレクト:cdの結果がエラー出力のためリダイレクトされず
(サンプル4)
@echo off rem ############### 「エラー出力」のリダイレクト rem 「エラー出力」を右辺(テキストや「nul」)にリダイレクトする。 rem 左辺はエラー出力なので、リダイレクトが行われる echo ###Test3: 1>> output3.txt rem 【結果】リダイレクトされる cd C:\NotExistingPath 2>> output3.txt
(図144)エラー出力⇒テキストへリダイレクト:エラー出力のためリダイレクトされる
(サンプル5)
@echo off rem ############### 「エラー出力」のリダイレクト rem 「エラー出力」を右辺(テキストや「nul」)にリダイレクトする。 rem 左辺はエラー出力なので、リダイレクトが行われる echo ###Test4: 1>> output3.txt rem 【結果】リダイレクトされる cd C:\NotExistingPath 1>> output3.txt 2>&1
(図145)エラー出力⇒標準出力⇒テキストへリダイレクト:エラー出力のためリダイレクトされる