有没有一种方法可以运行shell命令而无需输出缓冲?
例如,hexdump file | ./my_script
将仅以缓冲块的形式将输入从hexdump传递到my_script,而不是逐行传递。
其实我想知道一个通用的解决方案,如何使任何命令都没有缓冲?
Answers:
AFAIK,没有丑陋的骇客就无法做到。写入管道(或从管道读取)会自动打开完整缓冲,您对此无能为力:-(。“ Line buffering”(这是您想要的)仅在读取/写入终端时使用。丑陋的黑客正是这样做的:他们将程序连接到伪终端,以便管道中的其他工具以行缓冲模式从该终端读取/写入该问题。
该页面还提供了一些建议(前面提到的“丑陋的hack”),例如,使用unbuffer
或使用一些技巧LD_PRELOAD
。
试试stdbuf
,它包含在GNU coreutils中,因此几乎包含在任何Linux发行版中。这会将输入,输出和错误的缓冲区长度设置为零:
stdbuf -i0 -o0 -e0 command
unbuffer
我做得更好。stdbuf
传递了任何信号(SIGUSR2
就我而言),我发送给了它command
(这是我想发生的事情),而unbuffer
似乎并不想这样做。
stdbuf -o0 bash
使用我所有的脚本和别名运行一个完整的会话,并且在任何命令上都没有输出缓冲,这正是我想要的。在此bash
实例退出时,缓冲当然会恢复。我正在使用Ubuntu 16.04。
if [[ "$0" == "-bash" ]]; then exec /usr/bin/stdbuf -i0 -oL -eL /bin/bash -l; fi
exec
将输出发送到日志文件的模式为我工作,所有输出行都已缓冲而不是完全禁用:exec > >(stdbuf -i0 -oL -eL awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | stdbuf -i0 -oL -eL tee "$LOGFILE") 2>&1
您还可以使用该script
命令使hexdump
行缓冲输出(hexdump
将在伪终端中运行,这会诱使用户hexdump
考虑将其stdout写入终端而不是管道)。
# 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
stdbuf
失败了,但是脚本的作用却很吸引人。程序在将输出通过管道传输到时会缓冲输出tee
,但在终端中运行时则不会。因此,脚本有效!谢谢!