Linux‎ > ‎

標準出力・標準エラー出力とリダイレクト:発展


このページは出力リダイレクトの発展編になります。こちらもあわせてご参照ください。


任意のディスクリプタ番号を使う

標準出力と標準エラー出力を1つのファイルに出力するケースを基本のページで紹介しました。
comannd 1>result.txt 2>1&

このコマンドを任意のディスクリプタ番号を使って以下のように表現する事もできます。
          #1          #2   #3   #4
comannd 5>result.txt 1>&5 2>&5 5>&-

出力先の遷移
No. 処理 1番 2番 5番 備考
#0 初期状態 画面 画面 -
#1 5>result.txt 画面 画面 ファイル 5番にファイルを割り当てる
#2 1>&5 ファイル 画面 ファイル 標準出力の出力先を5番と同じ場所にする
#3 2>&5 ファイル ファイル ファイル 標準エラー出力の出力先を5番と同じ場所にする
#4 5>&- ファイル ファイル - 明示的なクローズ。1行で書く場合にはなくてもいい

「まず5番にファイルを割り当て、1番と2番を5番と同じファイルにする」こう考えると分かりやすいのではないでしょうか。ただし、任意のディスクリプタを使用しなければ処理ができないケースはめったになく、あったとしてもごく特殊なケースに限られると思います(もしあったら教えてください)。そのため積極的に覚えたり使用しなくてもいいと思います。

複数回のコマンドのリダイレクト

コマンドをそのまま実行すると実行の度にプロセスが作成される為、リダイレクトで出力先を変更してもコマンドが終了すると元に戻ってしまいます。そのため、複数回のコマンド実行の結果をリダイレクトする為にはその回数分リダイレクトの記述を行う事になります。

comannd1 1>result.txt
comannd2 1>>result.txt
comannd3 1>>result.txt

すべてリダイレクトの記述を何度も記述するのは面倒です。以下のように、複数のコマンドの実行結果をまとめてリダイレクトをする事も出来ます。
(comannd1; comannd2; comannd3) 1>result.txt

{
	comannd1
	comannd2
	comannd3
} 1>result.txt

さらに多くのコマンドの実行結果をリダイレクトする場合には、以下の方法があります。
  • シェルスクリプト化してシェルの実行結果をリダイレクトする
  • execを使って現在のシェルのリダイレクトを切り替える

シェルスクリプト化は言うまでもないと思いますので特に説明しません。execを使ってリダイレクトを行うと、現在のシェルのリダイレクトを継続して切り替えることができます。

exec >result.txt
comannd1
comannd2
comannd3
exec >&2

最後の「exec >&2」で、標準出力を戻しています(標準エラー出力は画面のままであるため、この実行で画面に戻る)。これを忘れるとその後の標準出力も表示されなくなるので注意してください。

Windowsのコマンドプロンプトのリダイレクト

Windowsのコマンドプロンプト(DOSプロンプト)でも、bashとほぼ同じです。改めて説明するところは特にないため、箇条書きでさらっと書いておきます。

  • 標準出力は1、標準エラー出力は2(、標準入力は0)に割り当てられている
  • リダイレクト記号の左にファイルディスクリプタ番号を指定する場合には「&」をつける
  • 複数記述した場合には左から順に評価される
  • コマンドの右でも左でもいい
  • 小カッコ「()」で括られている部分は先に評価される
  • 何も出力したくない場合は(「/dev/null」ではなく)「null」と記述する
  • bashのexecに該当するものは使えない

サンプルもいくつか提示しておきます。

標準出力をファイルにリダイレクトする
command >result.txt

標準出力を捨てる
command >null

標準出力・標準エラー出力を捨てる
command >nul 2>&1

標準出力と標準エラーを1つのファイルにリダイレクトする
command >result.txt 2>&1
(command 2>&1) >result.txt

複数のコマンドの実行結果をまとめてリダイレクトする
(comannd1 & comannd2 & comannd3) 1>result.txt

標準出力を捨て、標準エラー出力のみをページングする
command 2>&1 >null | more


2012/11/09