リダイレクション

Linuxの勉強会で得た知識を少し紹介。
リダイレクションの不思議な挙動についてです。

$ echo "test" > file
$ cat file
test
$ echo "test2" >> file
$ cat file
test
test2

これはよく使う感じです。
上記2つのリダイレクションについては、標準出力の内容をfileに書き出すという処理です。

標準エラー出力を記録したい場合は次のようにします。

$ ls -la hoge
ls: cannot access hoge: No such file or directory
$ ls -la hoge 2> error
$ cat error 
ls: cannot access hoge: No such file or directory

では、同じファイルに標準出力と標準エラー出力の両方を書き出す場合はどうすればいいのでしょう?

$ ls ddd aaa
ls: cannot access aaa: No such file or directory
ddd

$ ls ddd aaa 1> log 2>&1
$ cat log
ls: cannot access aaa: No such file or directory
ddd

これで完了。
またはこれでもOK。

$ ls ddd aaa 1>> log 2>> log

ではこれはどうでしょう?
・その1

$ ls ddd aaa 1> log 2> log

・その2

$ ls ddd aaa 2>&1 1> log

答え
その1

$ ls ddd aaa 1> log 2> log
$ cat log
ddd
cannot access aaa: No such file or directory

標準出力か標準エラー出力のどっちかだけが出力されるのかと思いきや、エラー出力の上から標準出力の内容で書き換えるという処理が発生。

その2

$ ls -la ddd aaa 2>&1 1> log
ls: cannot access aaa: No such file or directory
$ cat log
ddd

この場合は、logには標準出力の内容のみしか書かれません。