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 1234512345
beklendiğ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 head
giriş akışını yeterince büyük bir arabellek okur ve sonra bu arabellekteki satırları sayar.
Aynı şey --bytes
seç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. head
Yardı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+C
Yukarı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.