Linux‎ > ‎

標準出力・標準エラー出力とリダイレクト:サンプル集


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


Linuxの標準出力と標準エラー出力のリダイレクトのサンプルを簡単な説明とともに列挙しました。
※bashこのページはbashを前提として記述しています。

comanndの実行結果の標準出力を、result.txtファイルに書き込む

スタンダードな記述
comannd 1>result.txt

「>」の前にファイルディスクリプタ番号を書く場合に空白を入れると、コマンドの引数の一部と解釈されるのであけてはいけない
comannd 1 >result.txt

1は省略可能。最もポピュラーなスタイル
comannd > result.txt

前後の空白はあってもなくてもいい
comannd>result.txt

リダイレクトの記述はcomanndの前に書いてもいい
1>result.txt comannd

もちろん1を省略してcomanndの前に書いてもいい
>result.txt comannd

画面にも出力したい場合
comannd | tee result.txt

execでリダイレクト(複数回使用する場合など)
exec 3>&1 >result.txt
comannd
comannd
comannd
exec >&3

(3~9の)任意のファイルディスクリプタ番号を使用する場合
exec 5>result.txt
comannd 1>&5
exec 5>&-

1行で書くなら(result.txtはコマンド終了とともに閉じられるのであえてクローズする必要はない)
comannd 5>result.txt 1>&5

もちろん明示的にクローズしてもいい
comannd 5>result.txt 1>&5 5>&-

comanndの実行結果の標準エラー出力をresult.txtファイルに書き込む

スタンダードな記述
comannd 2>result.txt

任意のファイルディスクリプタ番号を使用する場合
exec 5>result.txt
comannd 2>&5

comanndの実行結果の標準出力と標準エラー出力を、それぞれ別のファイルに書き込む

comannd 1>result.txt 2>error.txt

comanndの実行結果の標準出力と標準エラー出力の両方を、result.txtファイルに書き込む

最もポピュラーなスタイル
comannd 1>result.txt 2>&1

よくある間違い。「2>&1」は「標準エラー出力を標準出力にリダイレクトする」のではなく「標準エラー出力を現在標準出力が割り当てられている場所にリダイレクトする」ため。標準エラー出力が画面に出力されてしまう。
comannd 2>&1 1>result.txt

これはダメ
comannd 1>result.txt 2>result.txt
上書き出力でファイルを2度開くことになるので、片方の出力が上書きされてしまう

追記出力の場合にはタブン大丈夫
comannd 1>>result.txt 2>>result.txt
(もし問題が発生する場合があるのなら教えてください)

同じ場所に出力するという事を明示する為には、これが分かりやすいと思う
exec 5>result.txt
comannd 1>&5 2>&5
exec 5>&-

1行で書くなら(少し煩雑ですが…)
comannd 5>result.txt 1>&5 2>&5

こういう書き方もある(私は使っている例を見たことがありませんが)
command &> result.txt

標準出力・標準エラー出力をどこにも出力せず捨てる場合

標準出力を捨てる
comannd > /dev/null
comannd 1>/dev/null

標準エラー出力を捨てる
comannd 2>/dev/null

標準出力・標準エラー出力の両方を捨てる
comannd 1>/dev/null 2>/dev/null
command &> /dev/null

その他

標準出力と標準エラー出力を両方まとめてlessでみる
command 2>&1 | less

標準エラー出力のみをlessでみる
command 2>&1 1>/dev/null | less

標準エラーに任意のメッセージを出力する
echo メッセージ >&2

遊び

標準出力のクローズ
>&-
特に何もおきない。実用性はないと思う。

echoしながら標準出力をクローズ
echo 123 >&-
以下のエラーが発生する
-bash: echo: write error: 不正なファイル記述子です

標準出力のクローズ
exec >&-
その後の標準出力を伴うあらゆる操作で「不正なファイル記述子です」のエラーがでまくる

クローズした標準出力を画面に戻す
exec >&2

標準エラー出力のクローズ
exec 2>&-
何もできなくなる。戻せないのでコンソールを閉じるしかない。

標準出力をクローズした後にclearコマンド実行
exec >&-
clear
「不正なファイル記述子です」のエラーがでてclearされない。clearコマンドも。制御文字を標準出力している事が確認できる。ちなみにCtrl+Lによる画面クリアは使える。この事からclearコマンドとCtrl+Lによる画面クリアは仕組みが異なるという事が分かる(遊んでいてたまたま見つけた)

コンソールクローズ
exec 0<&-


2012/10/27