バッチファイルでたまに見かける表現として「2>&1」があります。当ブログでも以下の記事で掲載したサンプルスクリプトに登場します。
今回は、この記述方法の意味について説明します。
目次
「2>&1」の意味
この記述は標準エラー出力(2)を標準出力(1)へリダイレクトするコマンドです。
標準エラー出力と、標準出力とは
バッチファイルを実行した際に、ウィンドウに色々と出力結果が出てくると思いますが、この出力には大きく分けて「標準出力」と「標準エラー出力」があり、ウィンドウにはデフォルトではこれらが混在して表示されていますが、内部的には分かれています。
標準出力は「echo hello」のコマンドで出力されるhelloのような、コマンドの正常動作の結果として出力される結果のことです。
一方、標準エラー出力は、例えば「del」コマンドでフォルダを削除しようとしたが、当該のフォルダが存在しなかった場合に画面に表示されるエラーメッセージが該当します。
これらが何故分かれているかというと、例えばエラーとなるメッセージのみを「errorlog.txt」などに出力することで、エラーメッセージだけを分けることができるためです。
この二つは、標準出力が1番、標準エラー出力が2番という形で番号が振られています。
1: 標準出力
2: 標準エラー出力
例えば以下のコマンド、test.batの動作結果をoutput.txtに書き込むコマンドです。
test.bat 1> output.txt
test.bat 2> output.txt
ここで「test.bat 1」と指定した場合には標準出力の結果がoutput.txtに書き込まれます。一方、「test.bat 2」と指定した場合には標準エラー出力の結果がoutput.txtに書き込まれます。
さて、では両方をoutput.txtに書き込む場合にはどうすればいいのでしょうか? というところで登場するのが「2>&1」です。
「2>&1」を用いたサンプルスクリプト
標準出力と、標準エラー出力を両方書き込む場合には、以下のスクリプトで実現できます。
test.bat > output.txt 2>&1
まず、ファイルへの出力はデフォルトで標準出力(1)のみが出力されます。そのため、「test.bat > output.txt」は「test.bat 1> output.txt」と同じであり、標準出力の結果がoutput.txtに書き込まれます。
ここで、2>&1は標準エラー出力(2)を標準出力(1)に入れることを意味します。
よって、上記のコマンドで標準エラー出力も標準出力として扱われ、標準出力と標準エラー出力の双方がoutput.txtに書き込まれるようになります。
「&」はリダイレクトを複数組み合わせる場合に必要となる記号です。