[reposted, with additions, from comp.unix shell, where the problem wasn't solved]
Linux, kernel 2.6.27.x, bash-3.1, gnu coreutils 6.12 Pseudo shell code (much simplified from original): decompress_file_to_stdout |\ while $not_finished do dd bs=$BS count=1 #try to insert (new) label after every $BS bytes of original data: do_other_stuff_that_writes_to_stdout done | recompress_stdin_to_different_file #end of pseudo shell code The problem is that dd never transfers a full block; $BS is about 400000, and each time through the loop, dd only transfers about 73xxx bytes, and sometimes less. This suggests [??] that the finite size of the pipe buffer is somehow involved (64k in Linux kernel 2.6.x), but this should normally not make any difference. How can I get dd to transfer a full block each time through the loop? I have RTFM about dd without being enlightened.