Mengapa perintah ini membuat file yang sangat besar?

19

Saya sedang bereksperimen hari ini dengan beberapa operasi tambahan dan, dalam keingintahuan saya, menjalankan ini (di mana file1.txt tidak kosong dan file2.txt kosong):

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

Ketika saya melihatnya butuh beberapa saat, saya menekan Ctrl+ Cuntuk mengakhirinya. Pada saat itu, file1.txt berukuran ratusan MB.

Berpindah nama file tidak menghasilkan efek yang sama; hanya ketika file berada dalam urutan ini apakah pengalihan tidak terbatas terjadi. Apa yang sebenarnya terjadi yang menyebabkan ini?

Mat
sumber

Jawaban:

24

Anda tidak bisa mengatakan catuntuk menggunakan beberapa standar seperti itu, pengalihan terakhir didahulukan jadi:

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

setara dengan:

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

yang jelas-jelas cepat mengisi sistem file, mengingat fakta bahwa file sumber menjadi tujuan juga tumbuh tanpa batas asalkan file1.txtcukup besar untuk tidak dibaca sekaligus.

Sebagian besar catimplementasi modern harus mendeteksi kekambuhan dan membatalkan:

Solaris cat:

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

Gnu cat:

cat: file1.txt: input file is output file

Mereka tetap bisa dibodohi dengan sesuatu seperti:

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

Penggunaan kucing yang baik dan tidak sia-sia ...

Jlliagre
sumber
19
Itu banyak kucing, meong.
slm
2
Anda membuat kepala saya berputar tetapi Anda menjawab pertanyaan saya!
Matt
7
Dan ketika saya bertanya tentang ini di Google+ (tidak mendapatkan jawaban), secara otomatis menandai posting saya dengan #Cat dan #Caturday
Matt
3

Saya tidak dapat mereproduksi ini dalam shell Bash:

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

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

1 file dibuat dengan panjang 0 tetapi kemudian saya mendapatkan pesan di atas:

$ 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

Berdasarkan jawaban @ jlliagre, saya tidak yakin mengapa saya mendapatkan 2 file. Mungkin tergantung pada catimplementasinya.

EDIT # 1

@jlliagre memperbarui jawabannya untuk menunjukkan kode ini yang ia nyatakan setara:

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

Jadi sekarang saya tahu mengapa saya mendapatkan yang kosong file2.txt. Notasi ini legal:

>> file2.txt

Dan akan membuat file kosong.

slm
sumber
Coba lagi dengan file1.txtmemulai non-kosong.
Gilles 'SO- stop being evil'
@Gilles - Saya baru saja membaca ulang dan menyadarinya, haruskah saya melihat sesuatu yang berbeda, saya masih mendapatkan kesalahan? Atau Anda hanya mengatakan bahwa b / c contoh dalam jawaban saya salah? Saya memperbaiki jawabannya BTW.
slm
@Gilles - itu downvote Anda, bukan? Apakah hanya untuk sesuatu yang spesifik atau kurang bernilai dari jawabannya?
slm
1
Tidak yakin mengapa jawaban Anda ditolak, +1 karena pengalaman sebelum menjawab, sesuatu yang tidak saya lakukan sendiri ...
jlliagre
+1; terima kasih atas eksperimen Anda! Saya mulai memahami pengalihan dan catperilaku dengan lebih baik.
Matt