Komutlar genellikle girdilerini arabelleğe almaz. read()
Büyük bir yığın için bir yapacaklardı , ancak bir borudan okurken, boruda çok fazla bayt yoksa, read()
sistem çağrısı var olduğu kadar çok karakterle geri dönecek ve uygulama genellikle .
Buna Bunun önemli bir istisnası olduğunu mawk
yeniden tutacak hangi read()
girdi tampon dolana kadar ing.
Uygulamalar yine de çıktılarını (stdout) tamponlar . Her zamanki davranış, çıktı bir tty'ye gidecekse, arabelleğe alma satır bazında olacaktır (yani, çıktı için tam bir satır veya çok fazla bir blok dolu olana kadar stdout'a yazmaya başlamayacaktır. uzun satır), diğer her dosya türü için tamponlama bloklarla yapılır (yani, yazmak için bir blok dolu olana kadar yazmaya başlamaz (4KiB / 8KiB gibi bir şey ... yazılım ve sisteme bağlıdır) )).
Bu durumda, LongRunningCommand
büyük olasılıkla çıktısını bloklarla tamponlar (çıktısı bir tty değil bir boru olduğu için) ve tr
çıktısı muhtemelen terminal olduğu için büyük olasılıkla çıktısını satır satır tamponlar.
Ancak, her yeni satır karakterini çıktısından kaldırdığınızdan, hiçbir zaman bir satır çıkmaz, bu nedenle arabelleğe alma blokla olur.
Burada hem LongRunningCommand
ve hem de arabelleğe almayı devre dışı bırakmak istiyorsunuz tr
. GNU veya FreeBSD sistemlerinde:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Çizgileri virgülle birleştirmek istiyorsanız, daha iyi bir yaklaşım kullanmak olduğunu unutmayın paste -sd , -
. Bu şekilde çıktı yeni satır karakteriyle sonlandırılır (muhtemelen arabelleğe almayı devre dışı bırakmanız gerekir).
stdbuf
LongRunningCommand'a mı yoksa tr'ye mi yoksa her ikisine de farklı mı başvurdunuz ?