Jika Anda hanya menginginkan satu atau dua baris pertama, jenis trik berikut ini berfungsi dan menghindari masalah buffering yang disebabkan oleh penggunaan dua perintah berbeda untuk membaca aliran keluaran:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
Ini readbuilt-in ke shell dan tidak mengkonsumsi seluruh buffer input hanya untuk output satu baris, jadi menggunakan readsemua sisa output untuk perintah berikut.
Jika Anda ingin menonjolkan masalah buffering yang ditunjukkan oleh contoh Anda yang menggunakan dua perintah berbeda, tambahkan a sleepuntuk menghilangkan masalah waktu dan izinkan perintah di sebelah kiri untuk menghasilkan semua outputnya sebelum perintah di sebelah kanan mencoba membaca salah satu Itu:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
Sekarang, kedua contoh di atas gagal dengan cara yang sama - headmembaca seluruh buffer dari output hanya untuk menghasilkan satu baris, dan buffer itu tidak tersedia sebagai berikut grep.
Anda dapat melihat masalah buffering dengan lebih jelas dengan menggunakan beberapa contoh yang memberi nomor pada garis keluaran sehingga Anda dapat mengetahui baris mana yang hilang:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
Cara sederhana untuk melihat masalah buffering adalah menggunakan seqyang menghasilkan daftar angka. Kami dapat dengan mudah mengetahui nomor mana yang hilang:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
Solusi trik saya menggunakan shell untuk membaca dan mengulangi baris pertama bekerja dengan benar bahkan dengan penundaan tidur ditambahkan:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
Di bawah ini adalah contoh lengkap yang menunjukkan headmasalah buffering, menunjukkan bagaimana
headmengkonsumsi seluruh buffer output hanya untuk menghasilkan lima barisnya setiap kali. Buffer yang dikonsumsi tidak tersedia untuk headperintah berikutnya
dalam urutan:
$ seq 1 100000 | { sleep 5 ; head -5 ; head -5 ; head -5 ; head -5 ; }
1
2
3
4
5
1861
1862
1863
1864
499
3500
3501
3502
3503
7
5138
5139
5140
5141
Melihat angka di 1861atas, kita dapat menghitung ukuran buffer yang digunakan headdengan menghitung seqoutput dari 1ke
1860:
$ seq 1 1860 | wc -c
8193
Kita melihat bahwa headbuffering dengan membaca 8KB penuh (8 * 1024 byte) dari output pipa pada suatu waktu, bahkan untuk menghasilkan hanya beberapa baris output sendiri.
headdangrepmelakukan apa-apa di sana.