bashのリダイレクト

http://home.catv.ne.jp/pp/ginoue/memo/sh-fd.html
つまり

  • 2>&1 と書いた場合は 2のディスクリプタが1のコピーになる
  • リダイレクト処理は左から処理される。
    • 2>&1 1> hoge.txtと 1> hoge.txt 2>&1 は結果が異なる。前者はstderrの出力は hoge.txt に流れ込まない。
  • パイプはリダイレクトよりも先に処理される
    • command 1>&2 | command2 とやっても command2にはcommand1がstdoutに出力する結果が渡る

2>&1 と書いたときに、2が1に「繋がる」と覚えちゃうとまずいと。
2を1につなげるためには1のファイルディスクリプタを2に「コピーする」のだと。
「繋がる」と覚えると、2>&1 1> hoge.txt とやったときに、
「2が1に繋がって1がhoge.txtに繋がるから 2 -> 1 -> hoge.txt だからすべての出力は hoge.txtに流れ込む」となっちゃう。
「コピーする」と覚えると
「2に1がコピーされて、2への出力が1(コンソール)への出力と同義となる」->「hoge.txtのfdが1にコピーされて1への出力がhoge.txtへの出力と同義となる」となる。これで、
2 -> コンソール
1 -> hoge.txt
となる。