私は今日いくつかの追加作業を試みていましたが、好奇心でこれを実行しました。ファイル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
空のファイルを生成します。