`ls 2 >tmp >tmp` コマンドと `ls > tmp` コマンドの違い

`ls 2 >tmp >tmp` コマンドと `ls > tmp` コマンドの違い

ls 2>tmp >tmp白黒の違いが何であるかはわかりませんls > tmp。それらはすべて本質的に同じことをしているように見え、tmpファイルを作成してコマンドの結果を保存しますls

答え1

短い答え:ls 2>tmp >tmpリダイレクトstdoutstderrファイルへtmp。そしてファイルls > tmpにのみリダイレクトされます。stdouttmp

これを試してみて、違いを確認してください。

$ 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出力はバッファリングされているため、終了前に最後まで書き込まれる可能性が高いため、lsstderr出力を上書きします。

例:

$ 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

この場合、シェルはtmpfd 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

関連情報