Mempertimbangkan T&J ini tentang urutan eksekusi di shell yang terkait dengan pengalihan, dan terlepas dari kenyataan bahwa jika file tidak ada, file akan dibuat terlebih dahulu sehingga cat example.txt | shuf > example.txt
tidak mengeluh bahwa file tidak ada - yang hanya mengkonfirmasi urutan dari apa yang saya mengerti - lalu mengapa sekitar sekali setiap seribu kali di sistem saya, shuffle berfungsi ketika saya melakukan ini (cadangan masing-masing berisi 15 nilai statis di baris mereka)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
Bagaimana mungkin ada pengecualian terhadap aturan tersebut?
Jawaban yang Diterima:
Di sini:
cat test | shuf > test
>
diutamakan dalam arti bahwa ini berarti:
(cat test) | (shuf > test)
dan bukan:
(cat test | shuf) > test
Meskipun jika kami menggunakan dua file yang berbeda, tidak akan ada perbedaan antara kedua pengelompokan ini.
Apa yang menjadi signifikan ketika Anda menggunakan file yang sama adalah bahwa dua perintah di kedua sisi pipa dijalankan secara bersamaan . Perintah tersebut adalah cat test
dan shuf > test
. >
berarti “terbuka untuk menulis dan memotong”, sedangkan cat
akan "membuka untuk membaca", membaca, dan menutup. Karena kedua hal itu terjadi bersamaan , hubungan antara urutan operasi kolektif mereka tak tentu . Ada kemungkinan cat
akan bisa menyeruput file sebelum shell mengelola shuf > test
memotongnya. Tapi itu peluang tipis, karena ada lebih banyak yang terlibat; itu hanya akan terjadi jika cat
sangat beruntung dalam kaitannya dengan penjadwalan shuf > test
.
Moral cerita: Jangan lakukan ini — gunakan dua file saja.