无法将可用内存实用程序的 grepped 输出重定向到文件

Can't redirect grepped output of free memory utility to a file

我似乎无法将可用内存实用程序的 grepped 输出重定向到文件。该文件为空。该命令确实会产生屏幕输出。此外,删除管道 grep 后,它就可以工作了!下面是 session:

$ free -s 5 -m|grep Mem #Produces screen output
Mem:           7745         279        5645           0        1820        7185
Mem:           7745         279        5645           0        1820        7185
^C
$ free -s 5 -m|grep Mem >& mem.log
^C
$ cat mem.log #File is empty
$ ls -l mem.log #Confirming file is empty
-rw-rw-r-- 1 ubuntu ubuntu 0 Dec 10 23:59 mem.log
$ free -s 5 -m >& mem.log #Removing the grep and retrying
^C
$ cat mem.log #Now file contains the data
              total        used        free      shared  buff/cache   available
Mem:           7745         278        5645           0        1821        7186
Swap:             0           0           0

知道发生了什么事吗?这是一个错误吗?

与大多数 C 程序一样,grep 的输出在写入终端时是行缓冲的,但如果 stdout 被重定向到文件或管道则完全缓冲。完全缓冲意味着它有一个内部缓冲区,通常是 4KB,并且只在缓冲区填满时打印一些内容。

您可以通过使用 grep --line-buffered 强制它使用行缓冲来解决它。这个选项告诉它立即打印出它的匹配项。这不是默认行为,因为它比完全缓冲慢。

更好的选择是 运行 free -m 而不是 free -s 5 -m 以便 free 打印可用内存并退出。当您使用 -s 5 时,它会永远 运行s ,这反过来会导致 grep 永远 运行 并且永远不会刷新其输出,这就是为什么您每次都必须按 Ctrl-C 的原因。删除 -s 5 并且 grep 将正常工作。