サブシェルの入力と親シェルの出力に同じファイル名を使用すると競合が発生しますか?

サブシェルの入力と親シェルの出力に同じファイル名を使用すると競合が発生しますか?

引用する私の答えtmpプロセスを置き換えるための入力と同じファイルを使用し、tmp親シェルの同じファイルに出力を書き込みます。これにより、プロセスの置き換えから読み込み、シェルで書き込むと中断が発生しますか?

コメントとディスカッション内容に基づいて同様の投稿探してみると葛藤はないようですね?

grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp

コメントの関連ディスカッション:

エレガントに見えますが、tmp同時に読み書きするのではありませんか? –クワジモド

@Quasímodoいいえ、サブシェルは読み取り専用で開き、思考処理が完了した後にリダイレクトが完了し、書き込みのtmpためにシェルが再び開きます(しかし私はまだこれの専門家ではないので100%はわかりません)。確認してください) – α?sнιιgreptmp

@Quasímodoはstrace grep … grepを介して開かれ、完了すると閉じるように提案するので、シェルはgrepが完了した後に出力を作成し、tmp同時に中断されません。

答え1

やっていることによって異なります。

の場合、grep -f patterns実際のデータファイルを読み始める前にgrepファイルを事前に読み取る必要があります。patternsそれ以外の場合、最初の行が一致するかどうかはわかりません。だからここではあなたは安全です。

もちろん、切り捨てを使用してファイルにリダイレクトすると、プロセス置換コマンドがファイルを読み取る前に切り捨てられる可能性が高くなります。しかし、以下を見てください。


一般的に言えば、追加モードで出力をリダイレクトするときに出力を再入力として繰り返すことを心配します。 GNU grepをお試しください。警告を表示するのに十分スマートです。

$ seq 99999 > foo.txt
$ grep ^1 foo.txt >> foo.txt 
grep: input file ‘foo.txt’ is also the output

ただし、プロセス置換を使用してだまされた場合、動作し、データの一部が繰り返し処理されます。

$ grep ^1 <(cat foo.txt) >> foo.txt
$ grep -Fx 1933 foo.txt
1933
1933
1933
1933

もちろん、コピーは2つだけでなければなりません1933。旅行費用は変更されることがあります。


切り捨てられたリダイレクトでは、Linuxで次のテストを実行しました。

echo moi > hello.txt
cat <(cat hello.txt) > hello.txt >&2;

ここで、内部猫が実行される前にリダイレクトが処理された場合、hello.txt結果は出力されません。一方、catプロセス内の置換が最初に実行されると、ファイルが切り捨てられる前にファイルを読み取ることができます。数回繰り返します。

for x in {1..999}; do echo moi > hello.txt; cat <(cat hello.txt) 3> hello.txt; done

私のシステムに出力がありませんアイドル状態の場合moiしかし、単純な忙しいループが同時に実行されると、出力は数回から数十回です。 (3>出力に影響を与えずにファイルをトリミングするには、リダイレクトしてください。)

関連情報