2つのパイプが同時にファイルにリダイレクトされるとどうなりますか?

2つのパイプが同時にファイルにリダイレクトされるとどうなりますか?

次のコマンドがある場合:

# first
 cat /dev/random | base64 > test.txt &
# second
 cat /dev/random | base64 > test.txt &

最初のコマンドを実行してから2番目のコマンドを実行して両方のコマンドをkill停止した場合(使用)、そのコマンドはどこから来ましたかtest.txt?最初の命令ですか、2番目の命令ですか、それとも両方ですか?

次のテストを実行しましたが、上記の内容の何もないと思いますか?理由はわかりません。

$ cat /dev/random | base64 | tee 1.txt > test.txt &
$ cat /dev/random | base64 | tee 2.txt > test.txt &

# $ kill task1_id task2_id

$ ll -h
total 1.8G
drwxrwxrwx 1 user user 4.0K Dec  9 16:55 ./
drwxrwxrwx 1 user user 4.0K Dec  9 16:51 ../
-rwxrwxrwx 1 user user 627M Dec  9 16:55 1.txt*
-rwxrwxrwx 1 user user 585M Dec  9 16:55 2.txt*
-rwxrwxrwx 1 user user 627M Dec  9 16:55 test.txt*

$ md5sum *.txt
f83c833de426f22152e91f5c31bb0a7c  1.txt
e7535f298cc935c81064bfaf26dcd244  2.txt
35e7830de4decc1572b8b16d54170851  test.txt

ベストアンサー1

本当に台無しですね。このようにして意味のあるものは何も得られません。

まず、プロセスの1つがファイルを開いて切り取り、次にファイルに何かを書き込みます。書き込みポインタは終了位置に残ります。

次に、2番目のプロセスはファイルを開いて切り取り(最初のプロセスがこれまでに作成したすべての項目を削除しますが、これは重要ではありません)、ファイルに内容を書き込みます。書き込みポインタは終了位置に残ります。

その後、プロセスはできるだけ書き込みます。その時点の各書き込みポインタの位置。ただし、その順序はオペレーティングシステムのスケジューリングの決定に依存します。つまり、本質的にランダムです。同期状態が維持されるという保証はないため、異なる時点で部分的に上書きできます。結果は、2つのデータセットの混合である可能性があります。

簡単なテストyes:

$ yes AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA > test.txt & \
  yes BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB > test.txt & \
  sleep .3; kill %1 %2
$ uniq -c test.txt
  14556 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
      1 BBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  76367 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      1 AAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
1033303 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
      1 AAAAA
1532199 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

uniq -c繰り返し行数を数えると、ここではB約14556行が印刷され、次にA76367行が印刷されるなどの方法で表示されます。yes完全な行を含むブロックを作成する必要があるため、2つのプロセスが互いに上書きされるため、混合行が発生する必要があります。

追加のリダイレクトを使用すると、>> test.txtすべての書き込みはファイルの最後に移動し(書き込み中は個々の書き込みポインタの位置は無視されます)、上書きは発生せず、すべての入力データがインターリーブ(任意)されます。

おすすめ記事