bash: force exec'd process to have unbuffered stdout bash: force exec'd process to have unbuffered stdout bash bash

bash: force exec'd process to have unbuffered stdout


GNU coreutils-8.5 also has the stdbuf command to modify I/O stream buffering:

http://www.pixelbeat.org/programming/stdio_buffering/

So, in your example case, simply invoke:

stdbuf -oL /usr/bin/some_binary > /tmp/my.log 2>&1

This will allow text to appear immediately line-by-line (once a line is completed with the end-of-line "\n" character in C). If you really want immediate output, use -o0 instead.

This way could be more desirable if you do not want to introduce dependency to expect via unbuffer command. The unbuffer way, on the other hand, is needed if you have to fool some_binary into thinking that it is facing a real tty standard output.


You might find that the unbuffer script that comes with expect may help.


Some command line programs have an option to modify their stdout stream buffering behaviour. So that's the way to go if the C source is available ...

# two command options ...man file | less -p '--no-buffer'man grep | less -p '--line-buffered'# ... and their respective source code# from: http://www.opensource.apple.com/source/file/file-6.2.1/file/src/file.cif(nobuffer)   (void) fflush(stdout);# from: http://www.opensource.apple.com/source/grep/grep-28/grep/src/grep.cif (line_buffered)   fflush (stdout);

As an alternative to using expect's unbuffer script or modifying the program's source code, you may also try to use script(1) to avoid stdout hiccups caused by a pipe:

See: Trick an application into thinking its stdin is interactive, not a pipe

# Linuxscript -c "[executable string]" /dev/null# FreeBSD, Mac OS Xscript -q /dev/null "[executable string]"