How to make output of any shell command unbuffered?

后端 未结 4 1976
天命终不由人
天命终不由人 2020-11-22 16:25

Is there a way to run shell commands without output buffering?

For example, hexdump file | ./my_script will only pass input from hexdump to my_script in

相关标签:
4条回答
  • 2020-11-22 16:59

    You could also use the script command to make the output of hexdump line-buffered (hexdump will be run in a pseudo terminal which tricks hexdump into thinking its writing its stdout to a terminal, and not to a pipe).

    # cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/
    stty -echo -onlcr
    script -q /dev/null hexdump file | ./my_script         # FreeBSD, Mac OS X
    script -q -c "hexdump file" /dev/null | ./my_script    # Linux
    stty echo onlcr
    
    0 讨论(0)
  • 2020-11-22 17:06

    AFAIK, you can't do it without ugly hacks. Writing to a pipe (or reading from it) automatically turns on full buffering and there is nothing you can do about it :-(. "Line buffering" (which is what you want) is only used when reading/writing a terminal. The ugly hacks exactly do this: They connect a program to a pseudo-terminal, so that the other tools in the pipe read/write from that terminal in line buffering mode. The whole problem is described here:

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

    The page has also some suggestions (the aforementioned "ugly hacks") what to do, i.e. using unbuffer or pulling some tricks with LD_PRELOAD.

    0 讨论(0)
  • 2020-11-22 17:08

    The command unbuffer from the expect package disables the output buffering:
    Ubuntu Manpage: unbuffer - unbuffer output

    Example usage:

    unbuffer hexdump file | ./my_script
    0 讨论(0)
  • 2020-11-22 17:13

    Try stdbuf, included in GNU coreutils and thus virtually any Linux distro. This sets the buffer length for input, output and error to zero:

    stdbuf -i0 -o0 -e0 command
    
    0 讨论(0)
提交回复
热议问题