Pertimbangkan perintah berikut:
bash -c "echo x; cat 1" | tee 1
.
Pemahaman saya adalah bahwa ia akan bercabang ke shell baru, menulis x
ke stdout, menulis file 1 not found
ke stderr, keluar dan mengembalikan kontrol ke proses induk, dan menulis x
ke stdout dan ke 1
. Oleh karena itu, saya akan mengharapkan hasil akhir x
, dan file tersebut 1
berisi string x
.
Namun, ini bukan masalahnya. Pada kenyataannya, file 1
biasanya berisi setidaknya dua contoh x
, dan kadang-kadang ribuan baris x
s. Pada tes batch menjalankan perintah sepuluh ribu kali, jumlah rata-rata x
s ditulis ke file adalah 52,3, dan median adalah 1. Mekanik apa yang menyebabkan ini? Distribusi probabilitas apa yang memodelkan perilaku ini? Saya menduga bahwa itu adalah geometris kondisional dan seragam.
tee
telah membuka file untuk ditulis sebelumcat
membukanya untuk dibaca, Anda mungkin mendapatkan banyakx
-es dalam file tersebut. Dalam hal ini, "perulangan" akan berakhir kapan sajacat
membaca lebih cepat daripadatee
menulis, mencapai akhir file.x
ditulis ke file adalah 4,35. Saya kira itu akan sangat tergantung pada beban mesin.Jawaban:
Ini sangat aneh, jadi saya mencoba untuk menyelidikinya dengan bantuan strace. Jalankan perintah Anda dalam satu lingkaran 1000 kali:
Menemukan file dengan baris terbanyak (
wc -l */1 | sort -nr | head -n2
), dan memeriksa yang sesuaitrace.log
. Saya pasti bisa melihat banyak:Di mana 7567 adalah
tee 1
dan 7568 adalahcat 1
. Keduanya pasti berganti-ganti, jadi ya, seperti yang diduga, ini semua tentang waktu pelaksanaan (dan saya membayangkan konteks beralih) dari dua perintah.sumber