有没有办法将输出redirect到一个文件没有缓冲在UNIX / Linux?

我有一个很长的运行批处理过程,输出一些debugging和处理信息到标准输出。 如果我只是从一个terminal运行,我可以跟踪“它在哪里”,但是数据太多,滚动屏幕。

如果我redirect到输出到一个文件>> out.txt'我最终得到整个输出,但它被缓冲,所以我不能再看到它现在正在做什么。

有没有办法redirect输出,但不使其缓冲写入?

您可以使用C中的setvbuf调用(请参阅此链接 )明确设置标准stream的缓冲选项,但是如果您尝试修改现有程序的行为,则尝试使用stdbuf (显然是从版本7.5开始的coreutils一部分)。

这将stdout缓冲到一行:

 stdbuf -oL command > output 

这完全禁用stdout缓冲:

 stdbuf -o0 command > output 

您可以通过使用script命令来实现线路缓冲输出到文件:

 stty -echo -onlcr # avoid added \r in output script -q /dev/null batch_process | tee output.log # Mac OS X, FreeBSD script -q -c "batch_process" /dev/null | tee output.log # Linux stty echo onlcr 

在Ubuntu上, unbuffer程序(来自expect-dev )包为我做了窍门。 赶紧跑:

unbuffer your_command

它不会缓冲它。

就我个人而言,我更喜欢我想通过tee检查的命令的pipe道输出。

scriptlogging了太多的信息,包括按键的时间以及大量的非打印字符。 什么节省更多的是我的人类可读性。

我发现的最简单的解决scheme(不需要安装任何第三方软件包)是在Unix和Linux站点上的类似的线程中提到的:使用script命令。 这是旧的,可​​能已经安装。

 $ script -q /dev/null long_running_command | print_progress # FreeBSD, Mac OS X $ script -q -c "long_running_command" /dev/null | print_progress # Linux 

请注意, script命令的第一个文件名参数是要写入的日志文件 。 如果您只是运行script -q your_command ,则会覆盖您缩进以使用日志文件运行的命令。 在尝试之前检查man script ,以确保安全。

尝试script命令; 如果你的系统有它,它需要一个文件名作为参数,转储到标准输出的所有文本被复制到文件。 安装程序需要交互时非常有用。

将输出redirect到一个文件中,并使用tail -f命令跟随该文件。

编辑

如果这仍然有缓冲,然后使用系统日志设施(通常是无缓冲的)。 如果批处理进程作为shell脚本运行,则可以使用logger命令执行此操作。 如果批处理作业以脚本语言运行,则应该有一个日志logging工具。

你可以使用tee命令,只是魔术!

someCommand | tee logFile.log someCommand | tee logFile.log同时显示在控制台中并写入日志文件。