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?



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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.