有没有办法将输出重定向到文件而不在 unix/linux 上缓冲?

Jam*_*ean 59 unix stdout

我有一个长时间运行的批处理进程,它将一些调试和进程信息输出到标准输出。如果我只是从终端运行,我可以跟踪“它在哪里”,但是数据会变得太多并从屏幕上滚动。

如果我重定向到输出到文件 '> out.txt' 我最终会得到整个输出,但它被缓冲了,所以我现在看不到它在做什么。

有没有办法重定向输出但使其不缓冲其写入?

Edu*_*nec 62

您可以使用setvbufC 中的调用显式设置标准流的缓冲选项(请参阅此链接),但是如果您尝试修改现有程序的行为,请尝试stdbufcoreutils显然是从 7.5 版开始)。

stdout最多缓冲一行:

stdbuf -oL command > output
Run Code Online (Sandbox Code Playgroud)

stdout完全禁用缓冲:

stdbuf -o0 command > output
Run Code Online (Sandbox Code Playgroud)


小智 9

您可以使用如下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
Run Code Online (Sandbox Code Playgroud)


小智 9

在 Ubuntu 上,unbuffer程序(来自expect-dev)包为我解决了问题。赶紧跑:

unbuffer your_command

它不会缓冲它。


Ste*_*HHH 6

我发现的最简单的解决方案(不需要安装任何第三方软件包)在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
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*s S 4

尝试script命令;如果您的系统有它,它会将文件名作为参数,转储到 stdout 的所有文本都会复制到该文件中。当安装程序需要交互时,它非常有用。