引用する私の答えtmp
プロセスを置き換えるための入力と同じファイルを使用し、tmp
親シェルの同じファイルに出力を書き込みます。これにより、プロセスの置き換えから読み込み、シェルで書き込むと中断が発生しますか?
コメントとディスカッション内容に基づいて同様の投稿探してみると葛藤はないようですね?
grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp
コメントの関連ディスカッション:
エレガントに見えますが、
tmp
同時に読み書きするのではありませんか? –クワジモド@Quasímodoいいえ、サブシェルは読み取り専用で開き、思考処理が完了した後にリダイレクトが完了し、書き込みの
tmp
ためにシェルが再び開きます(しかし私はまだこれの専門家ではないので100%はわかりません)。確認してください) – α?sнιιgrep
tmp
@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>
出力に影響を与えずにファイルをトリミングするには、リダイレクトしてください。)