home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

技術/shell/標準エラー出力のパイプとリダイレクト(2)

作成日: 2007-04-10 04:37:45   /   last updated at: 2009-04-04 09:12:53
カテゴリ: UNIX シェルスクリプト 

例えば、

bash: $ command1 >file 2>&1

だと、STDERRもSTDOUTもファイルにリダイレクトされる。
が、

bash: $ command1 2>&1 >file

だと、STDERRが画面に出力されてしまう。

http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8

にあるが、bashにおける"N>M"の機能は、内部的にはdup(M, N)(dup2?)をコールしている。
dup(M, N)の意は、MのファイルディスクリプタをNにコピーする。

すなわち、"N>M"の意は、Mの出力先ディスクリプタをNにコピーする。つまり、

bash: $ comman1 2>&1 >file

の意は・・・
1.2(STDERR)の出力先を、1(STDOUT)と同じくする。(=画面)
2.1(STDOUT)の出力先を、fileにする。
ということになる。よって、STDERRだけが画面に出力されるわけ。

逆に言えば、STDERRだけをlessりたい場合などは上記でオッケー。

リダイレクトはcshか、bashかによっても書き方が分かれるので忘れやすいところ。
見た目にもだまされやすい。
上記リンクを書きたかっただけじゃないかと言われればその通りだが、実際、忘れたときには上記リンク参照のこと。


original url: https://www.glamenv-septzen.net/view/278