Yalnızca ilk veya iki satırı istiyorsanız, aşağıdaki hile türü çalışır ve çıktı akışını okumak için iki farklı komut kullanmanın neden olduğu arabelleğe alma sorunlarını önler:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
read
Kabuk dahili ve böylece kullanarak, sadece çıkış bir satır girdi bütün bir tampon tüketmez read
aşağıdaki komutu için yaprakları çıkış her şey.
İki farklı komut kullanan örnekleriniz tarafından gösterilen arabelleğe alma sorunlarını vurgulamak istiyorsanız sleep
, zamanlama sorunlarını ortadan kaldırmak için bunlara a ekleyin ve sağdaki komutlardan herhangi birini okumadan önce soldaki komutun tüm çıktısını oluşturmasına izin verin o:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
Şimdi, yukarıdaki örneklerin her ikisi de aynı şekilde başarısız olur - head
sadece bir satırı üretmek için çıktının tüm bir tamponunu okur ve bu tampon aşağıdakiler için mevcut değildir grep
.
Hangi satırların eksik olduğunu söyleyebilmek için çıktı satırlarını numaralandıran bazı örnekler kullanarak arabelleğe alma sorununu daha net görebilirsiniz:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
Arabelleğe alma sorununu görmenin basit bir yolu, seq
bir sayı listesi oluşturan kullanmaktır . Hangi sayıların kaybolacağını kolayca söyleyebiliriz:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
İlk satırı okumak ve yankılamak için kabuğu kullanan hile çözümüm, uyku gecikmesi eklendiğinde bile doğru çalışıyor:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
Aşağıda, her seferinde beş satırını üretmek için çıktının tüm bir arabelleğini head
nasıl head
tükettiğini gösteren tamponlama sorunlarını
gösteren tam bir örnek verilmiştir . Bu tüketilen arabellek, sıradaki bir sonraki head
komut için kullanılamaz
:
$ 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
Sayısına bakıldığında 1861
yukarıda biz tampon boyutu tarafından kullanılan hesaplayabilir head
sayarak seq
çıkışı 1
için
1860
:
$ seq 1 1860 | wc -c
8193
head
Kendi çıktısının sadece birkaç satırını üretmek için bile, bir seferde tam bir 8KB (8 * 1024 bayt) boru çıkışı okuyarak tamponlama yaptığını görüyoruz .
head
Vegrep
orada hiçbir şey.