无Tcl环境下如何实现unbuffer无缓冲效果?
无需Tcl实现无缓冲输出的替代方案
一、Shell脚本解决方案
用stdbuf直接控制(推荐)
很多GNU/Linux发行版默认自带stdbuf,不需要root权限就能用,它可以直接指定命令的缓冲策略:
- 禁用标准输出的缓冲:
stdbuf -o0 <你的命令> - 同时禁用标准输入和输出缓冲:
stdbuf -i0 -o0 <你的命令>
awk脚本转发
如果系统没有stdbuf,可以写个简单的awk脚本实现无缓冲转发:
创建脚本文件unbuffer.sh:
#!/bin/sh awk '{print; fflush(stdout)}'
给脚本加执行权限:chmod +x unbuffer.sh
使用方式:<你的命令> | ./unbuffer.sh,或者通过重定向传递命令输出:./unbuffer.sh < <(你的命令)
Perl脚本转发
Perl的方案更简洁,同样写个脚本:
#!/bin/sh perl -pe '$|=1'
使用方式和awk版本完全一致,$|=1会强制关闭Perl标准输出的缓冲。
二、C代码实现方案
如果上面的工具都不可用,自己写个C程序编译使用,不需要root权限:
创建代码文件unbuffer_alt.c:
#include <stdio.h> #include <unistd.h> int main() { char buf[4096]; ssize_t read_len; // 关闭stdout的缓冲 setvbuf(stdout, NULL, _IONBF, 0); // 从标准输入读取数据,直接写到标准输出 while ((read_len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) { write(STDOUT_FILENO, buf, read_len); } return 0; }
编译:gcc -o unbuffer_alt unbuffer_alt.c
使用方式:<你的命令> | ./unbuffer_alt
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

