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; }
readKabuk dahili ve böylece kullanarak, sadece çıkış bir satır girdi bütün bir tampon tüketmez readaş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 - headsadece 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, seqbir 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 headnasıl headtükettiğini gösteren tamponlama sorunlarını
gösteren tam bir örnek verilmiştir . Bu tüketilen arabellek, sıradaki bir sonraki headkomut 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 1861yukarıda biz tampon boyutu tarafından kullanılan hesaplayabilir headsayarak seqçıkışı 1için
1860:
$ seq 1 1860 | wc -c
8193
headKendi çı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 .
headVegreporada hiçbir şey.