ls 2>tmp >tmp
白黒の違いが何であるかはわかりませんls > tmp
。それらはすべて本質的に同じことをしているように見え、tmpファイルを作成してコマンドの結果を保存しますls
。
答え1
短い答え:ls 2>tmp >tmp
リダイレクトstdout
とstderr
ファイルへtmp
。そしてファイルls > tmp
にのみリダイレクトされます。stdout
tmp
これを試してみて、違いを確認してください。
$ ls asdsadasd 2>tmp >tmp
$ cat tmp
ls: cannot access asdsadasd: No such file or directory
$ ls asdsadasd > tmp
ls: cannot access asdsadasd: No such file or directory
$ cat tmp
<Nothing happen here>
答え2
次の操作を実行しないでください。
ls 2> tmp > tmp
上記のシェルはtmp
ファイルディスクリプタ2に書き込むために開き、tmp
再びファイルディスクリプタ1に書き込むために開き、次を実行しますls
。ファイル記述子同じファイルを指す2つの別々のオープンファイルの説明。
ファイル記述子1(ファイルリストの場合はstdout)とファイル記述子2(エラーメッセージの場合はstderr)の両方に書き込まれると、ls
これらの出力は上書きされます(tmp
名前付きパイプではなく通常のファイルであると仮定)。
実際、stdout出力はバッファリングされているため、終了前に最後まで書き込まれる可能性が高いため、ls
stderr出力を上書きします。
例:
$ ls /x /etc/passwd 2> tmp > tmp
$ cat tmp
/etc/passwd
ccess /x: No such file or directory
以下を使用する必要があります。
ls > tmp 2>&1
または
ls 2> tmp >&2
この場合、シェルはtmp
fd 2で開き、そのfdをfd 1にコピーするため、fd 1と2は同じオープンファイル記述を共有し、tmp
出力は上書きされません。
$ ls /x /etc/passwd 2> tmp >&2
$ cat tmp
ls: cannot access /x: No such file or directory
/etc/passwd