標準出力と標準エラー出力へ文字を出すだけの実験プログラム.
#include <stdio.h>
int main(int argc, char *argv[])
{
fprintf(stdout, "1\n");
fprintf(stderr, "2\n");
return 0;
}
以下を試してみた.
./a # 1 2 と表示される (実態は 2 は標準エラー出力)
./a > b.txt # 2 と表示され 1 は b.txt へ
./a >& b.txt # 2 1 と b.txt へ出力される
./a 2>&1 > b.txt # 2 と表示され 1 は b.txt へ (実態は 2 は標準出力)
./a | less # less で 1 が見られ 2 は標準エラー出力で見られる
./a |& less # less で 2 1 が見られる
./a >& /dev/null | less # less で 1 が見られる (2 は捨てられる) ※これが理解不能
./a 2>&1 > /dev/null | less # less で 2 が見られる (1 は捨てられる) (2016年9月9日追記 これが再現しません…どういうことなの…)
./a 2> /dev/null | less # less で 1 が見られる (2 は捨てられる)
>&
が割と謎い…
参考 :
http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8
http://cns-guide.sfc.keio.ac.jp/2004/2/4/14.html
(追記) 上記の結果,あまりあてにしないで下さい.過去のものです.
私が本当に必要だったもの(顧客が本当に必要だったもの的な)は,「標準エラー出力だけをパイプに流したい」でした.
./a 2> b.txt
こうすれば,標準エラー出力が b.txt
に垂れ流されます.そして別の場所で
tail -f b.txt | less
すれば,随時 b.txt
の内容が得られてパイプに流せます.多分これが一番簡単だと思います.
ファイルの容量が気になって昼寝しか出来なくなる各位におかれましては,この世界には mkfifo
というコマンドがありまして,これを使うと実際にディスク上に吐き出されることなく先に入ったものが先に出てくる(取り出せる,と言うべきか) First In First Out な擬似的なファイルが出来ますので,以下のようにしてやれば良いと思います.
mkfifo b.txt
# 気になる人は ls -l b.txt してみると普段見慣れないものが見れると思います
./a 2> b.txt
tail -f b.txt | less
(追記おわり)
(追記その2)
一応なんとかなった気ではいますが,やっぱり一個のコマンドで出来てこそな気もしますので,
./a >>>???&&& | less
のようなナニかをするだけで,less
に標準エラー出力「だけ」が流し込まれる方法をご存知の方が居ましたら,教えて頂ければ幸いです.
(追記その2おわり)