有没有一种方法可以在没有输出缓冲的情况下运行shell命令?
例如,hexdump file | ./my_script
将只会以缓冲块的方式将输入从 hexdump 传递给 my_script,而不是每行一次。
实际上,我想知道如何使任何命令成为非缓冲的通用解决方案?
有没有一种方法可以在没有输出缓冲的情况下运行shell命令?
例如,hexdump file | ./my_script
将只会以缓冲块的方式将输入从 hexdump 传递给 my_script,而不是每行一次。
实际上,我想知道如何使任何命令成为非缓冲的通用解决方案?
尝试使用stdbuf
,它包含在GNU coreutils中,因此几乎可以在任何Linux发行版中找到。这将输入、输出和错误的缓冲区长度都设置为零:
stdbuf -i0 -o0 -e0 command
stdbuf -o0 bash
可以运行完整的会话,并且所有我的脚本和别名都可用,并且所有命令都没有输出缓冲,这正是我想要的。当退出这个 bash
实例时,缓冲区当然会恢复。我正在使用 Ubuntu 16.04。 - AFHif [[ "$0" == "-bash" ]]; then exec /usr/bin/stdbuf -i0 -oL -eL /bin/bash -l; fi
- IcarusNMexec
模式对我很有用,可以将输出发送到日志文件,并且所有的输出行都是缓冲的,而不是完全禁用缓冲:exec > >(stdbuf -i0 -oL -eL awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | stdbuf -i0 -oL -eL tee "$LOGFILE") 2>&1
- JinnKoexpect
包中的unbuffer
命令可以禁用输出缓冲:
Ubuntu手册:unbuffer - unbuffer输出
示例用法:
unbuffer hexdump file | ./my_script
unbuffer
或使用LD_PRELOAD
进行一些技巧操作。你也可以使用 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
时,该程序会缓冲输出,但在终端中运行时不会。所以,脚本可以正常工作!谢谢! - TerrenceSunscript
的man
页面,“某些交互式命令(如vi(1)
)会在typescript文件中创建垃圾。Script最适合不操作屏幕的命令,其结果旨在模拟硬拷贝终端。” - RandomDSdevel