シンボルのリダイレクトはどのように順番に機能しますか?

シンボルのリダイレクトはどのように順番に機能しますか?

ファイル1、ファイル2、ファイル3があります。


ファイル 1 には以下が含まれます。1

ファイル 2 には以下が含まれます。2

ファイル 3 には以下が含まれます。3

私はコマンドを使用します

cat file1 > file2 > file3

結果:

ファイル11

file2(何も含まない)

ファイル31


なぜこの路線のどれが破壊されるのですか?基本的に私が後ろから見ることができないものは何ですか?

(「追加」を使用する補助メモ>>はもはやありません)

答え1

Bourne/POSIX スタイルシェルのリダイレクトバッシュのような、ダッシュ、kshなど

表示される順序で左から右に処理します。

> x 開いているそして切りましたfile、x標準出力に書き込むためのファイル記述子を設定します。xあなたの命令:

cat file1 > file2 > file3

する:

  1. 開いて切るfile2
  2. このファイル記述子に書き込むように標準出力を設定します。
  3. 開いて切るfile3
  4. このファイル記述子に書き込むように標準出力を設定します。
  5. 走るcat file1

最終結果は、標準出力がランタイムをfile3指すことですcatfile2どちらもfile3現在の内容を消去し、file3(の内容)出力をここに書き込みます。catfile1


出力を複数のストリームに分割して別々のファイルに書き込む場合は、次のことができます。使用tee:

cat file1 | tee file2 > file3

その他のシェル(特にzsh)は動作が異なり、コマンドは予想される結果を提供しますfile2file3file1


ここではこれはcat不要で、<入力リダイレクトも操作を実行します。

答え2

fd を複数回リダイレクトすると、すべてのリダイレクトが実行され、最後のリダイレクトが残ります。

$ strace -f -e open bash -c 'cat file1 > file2 > file3'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
[pid 20508] open("file2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 20508] open("file3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
[pid 20508] open("file1", O_RDONLY)     = 3

したがってfile2、開いて切り取ってからfile3開きます。

関連情報