cat命令中的“-u”选项有什么用途?

15

我在GNU/Linux的man cat中发现了这个。
手册简单地说了一句-u(被忽略),但没有解释原因。
出于好奇,我在谷歌上搜索,但似乎没有人问过这个问题。
然后我看了其他cat实现
我注意到,苹果的cat也实现了这个选项(参见cat.c)。在源代码中它说:

...
case 'u':
    setbuf(stdout, NULL);
    break;
...

我猜测这个选项意味着“非缓冲”。这个选项的预期用途是什么?它为什么存在,为什么被忽略?我认为一定有某种原因。


1
如果您正在寻找有关选项实际使用的信息,您可能会在SuperUserUnix and Linux堆栈交换网站上比在SO上更加幸运。 - AntonH
也许了解setbuf的作用会有所帮助:http://en.cppreference.com/w/c/io/setbuf。 - WhozCraig
我猜它的意思是“无缓冲”。 - hek2mgl
2
这个*nix命令的问题怎么会得到8个赞? - KevinDTimm
5个回答

9

根据 POSIX标准中 cat 的定义

SYNOPSIS

cat [-u] [file...]

...

OPTIONS

...

The following option shall be supported:

-u Write bytes from the input file to the standard output without delay as each is read.

通过禁用输出缓冲,可以实现该操作。

8

选项-u禁用了对stdout的缓冲。

GNU文档如下:

为标准输出使用无缓冲I/O。如果没有此选项,Posix没有指定其行为。

这可能表示当前cat的默认行为是无缓冲输出。


8

这是Unix/Linux的POSIX兼容选项。
GNU cat会自动执行此操作,没有关闭的方法。当指定了此选项时,它会被接受但被忽略,因为它对行为没有影响。

更多详细信息请参见cat(1)

-u 从输入文件中读取每个字节并立即写入标准输出,没有延迟。


8
cat -u 的概念确实是要输出无缓冲,这样即使 cat 在管道中使用时,数据也会在读取时立即写入。
当你使用 cat -u "$@" | … 且输入来自键盘时,这一点就很重要了。
GNU 的 cat 很可能没有缓冲(使用直接的 read()write() 调用),所以 -u 选项是无关紧要的——它总是在“无缓冲模式”下工作。

3

-u选项在原型非阻塞读取FIFOs时很有价值。其目的是支持以下序列:

mkfifo foo>
cat -u foo > /dev/tty13 &
cat -u > foo

在默认情况下,标准输出是否缓冲未指定。这在标准输出与终端相关联时有时很重要,因为缓冲可能会延迟输出。-u选项的存在保证了无缓冲I/O可用。如果未指定-u选项,则实现定义cat实用程序是否缓冲输出。传统上,-u选项使用IEEE Std 1003.1-2001的系统接口卷中定义的setvbuf()函数的等效实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接