- 公開日
標準出力、標準エラー出力のリダイレクト方法まとめ
目次
標準出力、標準エラー出力のリダイレクトの方法を実際のコマンド実行結果とあわせてまとめてみます。
標準入力, 標準出力, 標準エラー出力とは?
種類 | 説明 | ファイルディスクリプタ | 省略形 |
---|---|---|---|
標準入力 | デフォルトの入力データストリーム。 例えばコマンドのパイプラインなど。ターミナル上ではユーザーのキーボード入力のこと。 | 0 | stdin |
標準出力 | デフォルトの出力データストリーム。 ターミナル上ではユーザーの画面に表示される。 | 1 | stdout |
標準エラー出力 | デフォルトのエラーに関連する出力データストリーム。 ターミナル上ではユーザーの画面に表示される。 | 2 | stderr |
(出典: What is a File Descriptor? - Stdin, stdout, and stderr より翻訳)
それぞれのファイルディスクリプタは下記のように /dev/stderr
, /dev/stdin
, /dev/stdout
からも確認することができます
$ ls -l /dev/std{in,out,err}
lr-xr-xr-x 1 root wheel 0 Sep 12 08:46 /dev/stderr -> fd/2
lr-xr-xr-x 1 root wheel 0 Sep 12 08:46 /dev/stdin -> fd/0
lr-xr-xr-x 1 root wheel 0 Sep 12 08:46 /dev/stdout -> fd/1
標準出力, 標準エラー出力するシェルスクリプト
今回使用するベースとなるシェルスクリプトは下記になります。
$ cat stdout-stderr.sh
#!/bin/sh
echo "stdout"
echo "stderr" >&2
- stdout という文字列を標準出力
- stderr という文字列を標準エラー出力
このようなコードとなっております。
Rubyバージョン
ちなみに今回のシェルスクリプトをRubyで表現すると下記のようになります。
#!/usr/bin/env ruby
puts "stdout"
warn "stderr"
リダイレクト無し実行時
まずは何もリダイレクトの設定をしないで実行してみます。
$ ./stdout-stderr.sh
stdout
stderr
- 標準出力、エラー出力ともに画面に表示される
標準出力リダイレクト有り実行時
次はリダイレクトを設定して実行してみましょう。
$ ./stdout-stderr.sh > stdout.txt
stderr
$ cat stdout.txt
stdout
- リダイレクト無し実行時と比較して、画面に表示される結果から stdout が出力されなくなった
- 画面に表示されなくなった代わりに、リダイレクト先の
stdout.txt
に stdout が出力されている
また上コマンドでは省略されていますが、リダイレクトのデフォルトは標準出力のファイルディスクリプタ「1」なので、>
の部分は 1>
と書くこともできます。
$ ./stdout-stderr.sh > stdout.txt
# 下記のようにも書くことできる
$ ./stdout-stderr.sh 1> stdout.txt
エラー出力リダイレクト有り実行時
次はエラー出力だけリダイレクトするようにしてみましょう。
$ ./stdout-stderr.sh 2> stderr.txt
stdout
$ cat stderr.txt
stderr
- リダイレクト無し実行時と比較して、画面に表示される結果から stderr が出力されなくなった
- 画面に表示されなくなった代わりに、リダイレクト先の
stderr.txt
に stderr が出力されている
エラー出力を標準出力としてリダイレクト実行時
続いてエラー出力を標準出力としてまとめて出力するようにリダイレクトしてみます。
$ ./stdout-stderr.sh &> stdout-stderr.txt
$ cat stdout-stderr.txt
stdout
stderr
- リダイレクト実行時の画面表示は何もされない
- リダイレクト先のファイル
stdout-stderr.txt
には stdout と stderr ともに出力されている
$ ./stdout-stderr.sh &> stdout-stderr.txt
# 下記のようにも書くことできる
$ ./stdout-stderr.sh >& stdout-stderr.txt
$ ./stdout-stderr.sh > stdout-stderr.txt 2>&1
$ ./stdout-stderr.sh 1> stdout-stderr.txt 2>&1
標準出力&エラー出力を別々にリダイレクト実行時
標準出力と標準エラー出力をそれぞれ別にリダイレクトするようにしてみます。
$ ./stdout-stderr.sh 1> stdout.txt 2> stderr.txt
$ cat stdout.txt
stdout
$ cat stderr.txt
stderr
- 標準出力である stdout は
stdout.txt
に出力される - 標準エラー出力である stderr は
stderr.txt
に出力される
出力をリダイレクトで捨てる
/dev/null
にリダイレクトすれば出力内容を捨てることができます。
$ ./stdout-stderr.sh &> /dev/null