このコマンドが非常に大きなファイルを生成するのはなぜですか?

このコマンドが非常に大きなファイルを生成するのはなぜですか?

私は今日いくつかの追加作業を試みていましたが、好奇心でこれを実行しました。ファイル1.txt空ではありません。ファイル2.txt空):

$ cat file1.txt >> file2.txt >> file1.txt

時間がかかると思われる場合はCtrl+を押してC終了します。いつ、ファイル1.txtサイズは数百MBです。

ファイル名を切り替えても同じ効果はありません。ファイルがこの順序である場合にのみ、無限リダイレクトが発生します。この状況の原因は正確に何ですか?

答え1

この方法では複数の基準が使用できず、cat最後のリダイレクトが優先されます。

cat file1.txt >> file2.txt >> file1.txt

以下と同じ:

>> file2.txt ; cat file1.txt >> file1.txt

ターゲットとなるソースファイルも無限に大きくなることを考えると、file1.txtすぐに読みやすいほど大きい限り、これは明らかにファイルシステムを非常に迅速にいっぱいにするでしょう。

ほとんどの最新のcat実装では、再帰を検出して中断する必要があります。

ソラリス猫:

cat: input/output files 'file1.txt' identical

ヌープ猫:

cat: file1.txt: input file is output file

とにかく、彼らは次のことに騙されます。

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

猫をうまく活用しますが、役に立たないわけではありません…

答え2

Bashシェルではこれを再現できません。

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

長さ0のファイルが1つ作成されましたが、上記のメッセージが表示されます。

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

@jlliagreの答えによれば、これら2つのファイルを受け取る理由が何であるかよくわかりません。これはcat実装によって異なります。

編集#1

@jlliagreは、彼が言った内容が同等のコードであることを示すために答えを更新しました。

>> file2.txt ; cat file1.txt >> file1.txt

今、なぜ私が空虚になるのか分かりますfile2.txt。この表記法は正当です。

>> file2.txt

空のファイルを生成します。

関連情報