(2 jawaban)
Tutup 2 tahun yang lalu.
Saya tahu ini semacam duplikat dari pertanyaan lain (Mengapa perintah sort ini memberi saya file kosong?) tetapi saya ingin memperluas pertanyaan sebagai tanggapan atas jawaban yang diberikan.
Perintah
shuf example.txt > example.txt
Mengembalikan file kosong, karena shell memotong file sebelum mengacaknya, hanya menyisakan file kosong untuk diacak. Namun,
cat example.txt | shuf > example.txt
akan menghasilkan file yang diacak seperti yang diharapkan.
Mengapa metode pipa bekerja ketika pengalihan sederhana tidak? Jika file terpotong sebelum perintah dijalankan, bukankah seharusnya metode kedua juga membiarkan file kosong?
Jawaban yang Diterima:
Masalahnya adalah > example.txt mulai menulis ke file itu, sebelum shuf example.txt mulai membacanya. Jadi karena belum ada keluaran, example.txt kosong, shuf membaca file kosong, dan sebagai shuf tidak menghasilkan output dalam kasus ini, hasil akhir tetap kosong.
Perintah Anda yang lain mungkin mengalami masalah yang sama. > example.txt dapat mematikan file sebelum cat example.txt mulai membacanya; itu tergantung pada urutan shell mengeksekusi hal-hal itu, dan berapa lama waktu yang dibutuhkan cat untuk benar-benar membuka file.
Untuk menghindari masalah seperti itu sepenuhnya, Anda dapat menggunakan shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt .
Atau Anda bisa menggunakan shuf example.txt --output=example.txt sebagai gantinya.