Aşağıdaki kabuk komutunun giriş akışının yalnızca tek satırlarını yazdırması bekleniyordu:
echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done)
Ama bunun yerine sadece ilk satırı yazdırır: aaa.
Aynı şey -c( --bytes) seçeneğiyle kullanıldığında gerçekleşmez :
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done)
Bu komut 1234512345beklendiği gibi çıkar. Ancak bu yalnızca yardımcı programın coreutils uygulamasında çalışır head. Busybox çıkışı sadece bu yüzden uygulama hala fazladan karakter yiyor 12345.
Sanırım bu özel uygulama yöntemi optimizasyon amacıyla yapıldı. Satırın nerede bittiğini bilemezsiniz, bu yüzden kaç karakter okumanız gerektiğini bilmezsiniz. Giriş akışından fazladan karakter tüketmemenin tek yolu, akış bayt baytını okumaktır. Ancak akıştan her seferinde bir bayt okumak yavaş olabilir. Bu yüzden headgiriş akışını yeterince büyük bir arabellek okur ve sonra bu arabellekteki satırları sayar.
Aynı şey --bytesseçenek kullanıldığında da söylenemez . Bu durumda kaç bayt okumanız gerektiğini bilirsiniz. Böylece tam olarak bu bayt sayısını okuyabilir ve bundan daha fazlasını değil. Corelibs uygulama bu fırsatı kullanır, ancak busybox bir değil, hala bir tampon içine gerekenden daha fazla bayt okur gelmez. Muhtemelen uygulamayı basitleştirmek için yapılır.
Yani soru. headYardımcı programın giriş akışından istenenden daha fazla karakter tüketmesi doğru mu? Unix yardımcı programları için bir tür standart var mı? Ve varsa, bu davranışı belirtir mi?
PS
Ctrl+CYukarıdaki komutları durdurmak için tuşuna basmanız gerekir. Unix yardımcı programları ötesinde okumada başarısız olmaz EOF. Tuşuna basmak istemiyorsanız daha karmaşık bir komut kullanabilirsiniz:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 | [ `wc -c` -eq 0 ] && break >/dev/null; done)
basitlik için kullanmadım.