これは「上書きせずに追加する方法」に関する質問ではありません。両方のコマンドの出力を結合したファイルを探しているわけではありません。これは私が犯した間違いであり、システムがなぜこのようなことをするのか知りたいのです。
完了するのに長い時間がかかり、データ(数秒ごとに1行)をstdoutに出力するコマンド(リモートsshコマンドラインから)を使用しているので、それをファイルにリダイレクトします。
command > file.out &
時々、リモートセッションは切断されますが、コマンドはバックグラウンドで実行され続けます。私はこれを知らず、同じコマンドを再実行しましたが、最初のことが終わる前に:
command > file.out &
両方のプロセスが完了したら(このサイトの回答の一部を読んだ後)、両方のコマンドの行が混乱しているファイルを持ちたいのですが、出力ファイルには両方の実行のうちの1つの出力のみが含まれます。
このファイルの2つの出力が互いに絡み合っていないのはなぜですか(コメントで警告されているように)ここ)?最終ファイルは2つの出力のどれに属しますか?
編集する:
説明されているように、質問の1つ(出力ファイルが書き込みにロックされていないのはなぜですか?)を削除しました。ここ
答え1
リダイレクトを使用して書き込み用にファイルを開くと、>
ファイルは次のようになります。切り取ったつまり、完全に消去されました。しかしそれはいいえ削除してもう一度作成してください。
あるコマンドが最初にファイルを切り取り、次にファイルに何かを書き、別のコマンドが同じ操作を実行する場合、ファイル内の最初のコマンドの場所は変更されません。これは、2つの別々の場所に同じファイルに書き込む2つのコマンドがあり、1つが別のコマンドの出力を上書きできることを意味します。書き込み順序と書き込みデータ量によって異なります。
したがって、ファイル内のデータは、2つのプログラムの出力が互いに絡み合って混在している可能性が高くなりますが、これはファイルが作成された順序、作成されたデータの量、および切り捨てられたタイミングによって異なります。文書。
以下は、2 つのコマンドのデータをインターリーブする例です。
#!/bin/sh
( { echo hello; sleep 2; echo world; } | cat >file ) &
sleep 1
echo 123 >file &
wait
このスクリプトでは、次のことが発生します。
- 最初のコマンドは書き込み用にファイルを開き、それを切り捨てます。それに書きます
hello\n
。 - しばらくすると、2番目のコマンドはファイルを切り取ります
123\n
。この時点で、最初のコマンドのファイルポインタはまだファイルのオフセットを指します。 - 最初のコマンドは引き続き
world\n
ファイルに書き込みます。
結果は、中間にヌル文字があるファイルです。
$ hexdump -C file
00000000 31 32 33 0a 00 00 77 6f 72 6c 64 0a |123...world.|
0000000c
nul(00
上記の出力では)は、最初のコマンドのファイルポインタが2番目のコマンドのファイル切り捨てにリセットされず、「穴」が生成されるという事実に由来します。 2番目のコマンドは書き込みのみです123\n
が、より多くのデータが書き込まれるとnullが上書きされます。
$ hexdump -C file
00000000 31 32 33 34 35 36 77 6f 72 6c 64 0a |123456world.|
0000000c
ここでは2番目のコマンドを作成しましたecho 1234567890
が、1234567
これがファイルに残っているすべてです。これはworld\n
、2番目のコマンドが書き込みを終了した後、最初のコマンドがファイルポインタがある場所に書き込みを続けるためです。