Bu komut neden çok büyük bir dosya oluşturuyor?


19

Bugün bazı ekleme işlemleri ile deniyordum ve merakımda, bu koştu (burada dosya1.txt boş değildi ve file2.txt boştu):

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

Biraz zaman aldığını görünce, bitirmek için Ctrl+ Ctuşuna bastım . O zamana kadar, file1.txt dosyası yüzlerce MB boyutundaydı.

Dosya adlarının değiştirilmesi aynı etkiyi yaratmaz; yalnızca dosyalar bu sırada olduğunda sonsuz yönlendirme gerçekleşir. Buna neden olan tam olarak neler oluyor?

Yanıtlar:


24

Bu şekilde catbirden fazla standart kullanmayı söyleyemezsiniz , son yönlendirme önceliklidir, bu nedenle:

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

şuna eşittir:

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

hedef dosya olan kaynak dosyanın süresiz olarak büyümesi koşuluyla file1.txt, bir kerede okunmayacak kadar büyük olması nedeniyle , dosya sistemini hızlı bir şekilde doldurur .

Çoğu modern catuygulama özyinelemeyi tespit etmeli ve iptal etmelidir:

Solaris kedisi:

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

Gnu Kedisi:

cat: file1.txt: input file is output file

Zaten böyle bir şeyle kandırılabilirler:

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

Kedilerin çok işe yaramayan güzel bir kullanımı ...


19
Bu bir sürü kedi, miyav.
slm

2
Başımı döndürdün ama soruma cevap verdin!
Matt

7
Ve bunu Google + 'da sorduğumda (yanıt alamadım), yayınımı otomatik olarak #Cat ve #Caturday
Matt

3

Bunu bir Bash kabuğunda çoğaltamadım:

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

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

1 dosya 0 uzunlukta oluşturulur ancak sonra yukarıdaki mesajı alıyorum:

$ 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 kullanıcısının cevabına dayanarak neden 2 dosyayı aldığımı bilmiyorum. Uygulamaya bağlı olabilir cat.

DÜZENLEME # 1

@jlliagre, eşdeğeri olarak belirttiği bu kodu göstermek için yanıtını güncelledi:

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

Şimdi neden boş olduğumu biliyorum file2.txt. Bu gösterim yasaldır:

>> file2.txt

Ve boş bir dosya oluşturur.


file1.txtBoş olmayandan başlayarak tekrar deneyin .
Gilles 'SO- kötü olmayı bırak'

@Gilles - Bunu tekrar okudum ve fark ettim, farklı bir şey görmeli miyim, yine de hatayı alıyorum? Yoksa cevabımdaki b / c örneğinin yanlış olduğunu mu söylüyorsunuz? BTW cevabını düzelttim.
slm

@Gilles - Bu senin düştüğün oydu, değil mi? Sadece belirli bir şey için mi yoksa cevabın değeri için mi?
slm

1
Cevabınızın neden
oylandığından

+ 1; deneme için teşekkürler! Yönlendirmeleri ve catdavranışı daha iyi anlamaya başlıyorum .
Matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.