コンピュータがこのコマンドをどのように読み取るか、私にはよくわかりません。
cat file1 file2 1> file.txt 2>&1
私が理解しているのであれば、2>&1
は標準エラーを標準出力にリダイレクトするだけです。
そのロジックにより、コマンドは次のように読み上げます。
ファイルfile1
とfile2
を連結します。
この操作からstdout
をfile.txt
に送信します。
stderr
をstdout
に送信します。
終わり?
コンピュータが何をしているかわかりません。私の論理では、コマンドは
cat file1 file2 2>&1 > file.txt
しかし、これは正しくありません。
割り当てを使用することを考える方が簡単だと思います。
>
のようなものです =
&
のようなものです $
あなたは
1 = /dev/tty
2 = /dev/tty
次に、最初の例、1> file.txt 2>&1
、する
1 = file.txt
2 = $1 # and currently $1 = file.txt
あなたと一緒に
1 = file.txt
2 = file.txt
もしあなたがそれを逆にしたなら、再びあなたは
1 = /dev/tty
2 = /dev/tty
次に2>&1 > file.txt
は
2 = $1 # and currently $1 = /dev/tty
1 = file.txt
最終結果は
1 = file.txt
2 = /dev/tty
リダイレクトしたのはstdout
ではなくstderr
だけです。
リダイレクションの順序は重要であり、それらを読む必要があります左から右。
例えば: command 2>&1 >somefile
手段:
stderr
(つまり2
)をstdout
の-current宛先に(この時点で端末).stdout
を変更してsomefile
に移動します。したがって、この場合、stderr
はターミナルに行き、stdout
はファイルに行きますが、これはおそらく望んでいないことです。
一方、 command >somefile 2>&1
手段:
stdout
をsomefile
にリダイレクトstderr
をstdout
(somefile
)と同じ宛先にリダイレクトします。この最後のケースでは、stderr
とstdout
の両方がsomefile
に移動します。
cat file1 file2 1> file.txt 2>&1
>&
実際には複製を意味します。dupシステムコールを使用して、新しいファイル記述子をすでに開いているファイルにマッピングします。
したがって、(実際にはbashで)最初に新しいstdoutを開いてから、「現在設定されているstdoutにstderrをリダイレクトする」と言う必要があります。