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


19

今日私はいくつかの追加操作を試していましたが、私の好奇心でこれを実行しました(file1.txtは空ではなくfile2.txtは空でした):

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

しばらく時間がかかったのを見て、Ctrl+ Cを押して終了します。それまでに、file1.txtのサイズは数百MBでした。

ファイル名を切り替えても同じ効果は得られません。ファイルがこの順序である場合にのみ、無限リダイレクトが発生します。これが実際に何が起こっているのですか?

回答:


24

catそのように複数の標準出力を使用するように指示することはできません。最後のリダイレクトが優先されます。

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

と同等です:

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

宛先であるソースファイルが無制限にfile1.txt大きくなり、一度に読み取れないほど大きい場合は、明らかにファイルシステムがすぐにいっぱいになります。

最新のcat実装では、再帰性を検出して中止する必要があります。

Solaris cat:

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

Gnu猫:

cat: file1.txt: input file is output file

とにかく次のようなものでだまされる可能性があります。

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

猫のあまり役に立たない素敵な...


19
それは猫がたくさん、ニャーです。
slm

2
あなたは私の頭を回転させましたが、あなたは私の質問に答えました!
マット

7
私がGoogle+(答えが得られませんでした)にこの件について尋ねられたとき、それは自動的に私の記事をタグ付け#Cat#Caturday
マット

3

これを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

そして、空のファイルを作成します。


file1.txt空ではない状態からやり直してください。
ジル 'SO-悪であるのをやめる'

@Gilles-それを読み直して気づいたのですが、何か違うものが見つかればエラーが発生しますか?または、私の答えの例が間違っていると言っているだけですか?BTWという答えを修正しました。
slm

@Gilles-それはあなたの下票でしたよね?それは何か特定のものか、答えの価値の欠如のためだけですか?
slm

1
なぜあなたの答えが投票されたのかわからない、答える前に経験するために+1、私は自分でやらなかった何か
...-jlliagre

+1; あなたの実験に感謝します!私はリダイレクトとcat動作をよりよく理解し始めています。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.