読者です 読者をやめる 読者になる 読者になる

今更ながら標準出力と標準エラー出力について

 ども。  「西尾張、南濃界隈にweb系インフラの需要は無いのかっ!」と思いつつ勉強会行ったり求職活動したり、実家で穀を潰したりしているアラフォーの、  kwy です。


 今回は掲題の通り今更ながらの標準出力と標準エラー出力について。
 恥ずかしながら私これまであまり標準出力と標準エラー出力を区別してなかったんですよね。待って! 椅子投げるのはちょっと待って(古いけど出典は

いい加減、>/dev/null 2>&1と書くのをやめたらどうか (追記あり) · DQNEO起業日記 を発端とする諸々のブログエントリです)!

 個人的には、「標準出力も標準エラー出力も全部同じログに書いときゃいいじゃない。テキストなんて大した容量じゃないんだし」と考えていたのですが、過日、愛知県立図書館で借りてきた『UNIXという考え方 その設計思想と哲学』という本をパラパラめくっていると

エラーメッセージやその他の警告は、stderr経由でユーザーに送るべきだ。stdout宛てのデータストリームに混在させてはならない。その理由の一つは、エラーメッセージだけを別ファイルに保存したり、直ちに端末上に表示したりと、ユーザーごとに対応が異なるからだ。エラーメッセージをエラーメッセージをstdoutとして同じ入出力チャネルで送ることは、後に続く作業で混乱を招きかねない。  という一文を見かけ、なるほどそれも一理ある。あと、前述の「テキストなんて大した容量」云々、は、ちょっと富豪的思想だなぁと反省した次第。

 とは言え個人的には、「一ファイルに標準出力も標準エラー出力(stderr)もまとめて出力して、時系列で終えるようにする」の方が好みなんですが、まぁそこは解析時に結合するのもそんな手間でもないし、標準出力&標準エラー出力ファイルとは別に標準エラー出力だけのファイル作ってみてもいいし、そもそも別ファイルにしたこと無いし、試してみようかななんて思ったり。

 ようやく本題。+nixでの標準出力/標準エラー出力についてのメモ。
 まずは標準出力(1)

$ sh ./hoge.sh 1> fuga.txt

 別の書き方としては

$ sed -e "s/hoge/fuga/g" foobar.txt 2> dev/null