pengalihan kucing

11

Katakanlah file yang dipanggil abcada di direktori saat ini dan memiliki beberapa teks di dalamnya. Saat Anda menjalankan perintah:

cat abc > abc

Mengapa isi file abchilang?
Mengapa perintah menghapus teks di dalamnya dan file menjadi file kosong?

Tulsi Kanodia
sumber
Dan untuk solusinya, lihat Bisakah saya membuat cutperubahan file pada tempatnya?
Gilles 'SANGAT berhenti menjadi jahat'
10
Sebuah laser pointer adalah alat yang sangat efektif untuk kucing redirection. </pun>
WBT
Kucing saya merespons dengan sangat buruk terhadap pengalihan ...
Kel Umbris
Untuk menghindari masalah ini, saya menggunakan shellscript kecil yang saya sebut anjing :cat abc | dog abc
joeytwiddle
Pilihan lain, jika Anda tidak keberatan dengan output di layar, adalah menggunakan tee.
Andrea Lazzarotto

Jawaban:

27

Karena urutan bagaimana segala sesuatu dilakukan.

Saat kamu melakukan:

cat abc > abc

>adalah operator redirection output, ketika shell melihat ini ia membuka file dalam mode pemotongan menggunakan O_TRUNCflag open(2)yaitu open("abc", O_TRUNC), jadi apa pun yang ada di dalam file akan hilang. Perhatikan bahwa, pengalihan ini dilakukan terlebih dahulu oleh shell sebelum catperintah dijalankan.

Jadi ketika perintah cat abcdijalankan, file abcsudah terpotong maka catakan menemukan file kosong.

heemayl
sumber
1
Bagaimana dengan cat abc >> abc? Lalu apa yang terjadi?
Tulsi Kanodia
2
@TulsiKanodia - yang menyebabkan loop tak terbatas. Setiap kali kucing membaca satu baris, ia menambahkan yang lain sebelum pindah ke yang berikutnya.
user3490
3
Ini terdeteksi dan dicegah. Sebaliknya, teks cat: filename: input file is output file(di mana filenamenama file yang Anda pilih) dicetak pada stdout lama.
UTF-8
@TulsiKanodia Lihat unix.stackexchange.com/questions/154903/why-does-cat-xx-loop
Gilles 'SO- stop being evil'
5

Menambahkan ke jawaban @ heemayl , jika Anda ingin kode menjadi lebih jelas tentang urutan di mana hal-hal terjadi, Anda bisa meletakkan pengalihan apa saja di awal perintah:

> abc cat abc
l0b0
sumber