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 read
built-in ke shell dan tidak mengkonsumsi seluruh buffer input hanya untuk output satu baris, jadi menggunakan read
semua sisa output untuk perintah berikut.
Jika Anda ingin menonjolkan masalah buffering yang ditunjukkan oleh contoh Anda yang menggunakan dua perintah berbeda, tambahkan a sleep
untuk 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 - head
membaca 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 seq
yang 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 head
masalah buffering, menunjukkan bagaimana
head
mengkonsumsi seluruh buffer output hanya untuk menghasilkan lima barisnya setiap kali. Buffer yang dikonsumsi tidak tersedia untuk head
perintah 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 1861
atas, kita dapat menghitung ukuran buffer yang digunakan head
dengan menghitung seq
output dari 1
ke
1860
:
$ seq 1 1860 | wc -c
8193
Kita melihat bahwa head
buffering dengan membaca 8KB penuh (8 * 1024 byte) dari output pipa pada suatu waktu, bahkan untuk menghasilkan hanya beberapa baris output sendiri.
head
dangrep
melakukan apa-apa di sana.