Bashのリダイレクト

標準出力とエラー出力の両方をファイルにリダイレクトしたければ $ ./hoge &> all_log.txt とする.実はこれは $ ./hoge > all_log.txt 2>&1 の略記で, 2>&1 が「エラー出力(ディスクリプタ2)に出るはずの文字列が標準出力(ディスクリプタ1)に出るようにする(長いな)」という意味だ.ここで $ ./hoge 2>&1 > all_log.txt とやってしまうと,エラー出力はファイルに残らずにコンソールに出る(見ただけでは分からないが,実は標準出力として表示される).man bash の REDIRECTION の項には「左から右へ」というフレーズがあるんだが,私はずーっとこの辺りが腑に落ちなかった.「エラー出力を標準出力につなげてから標準出力を all_log.txt にリダイレクト」こそ 2>&1 > all_log.txt なんじゃないのか,と.
しかし man fopen(3) 辺りを読んでいたときふと気がついた. 2>&1 > all_log.txt とするとき, 2>&1 の時点ではディスクリプタ 1 は普段通りコンソールを指している.よってディスクリプタ 2 に関連付けられたエラー出力の行き先はコンソールになる.次に > all_log.txt が解釈されるとディスクリプタ 1 の指す出力先が all_log.txt に変更され,(標準出力のみの)ログが取られる.逆に > all_log.txt 2>&1 だと先にディスクリプタ 1 が all_log.txt を指すようになり,その状態でディスクリプタ 2 に関連付けられたエラー出力が 1 が現在指す all_log.txt に変更される.ディスクリプタとファイル(ストリーム)そのものを区別して考えるのが必要なようだ.あと右辺値と左辺値の区別.
しかし FILE * から fileno(3) でファイルディスクリプタを得ても何に使うんだか,何がうれしいんだか分からない.???