我在man cat
(GNU / Linux)中遇到过这个问题。
手册只是说-u (ignored)
而不解释原因。
出于好奇,我在Google上search,但似乎没有人问过这个。
然后我看着cat
其他实现 。
我注意到苹果的猫也实现了这个选项(见cat.c )。 在源代码中说
... case 'u': setbuf(stdout, NULL); break; ...
我猜这个选项意味着“无缓冲”。 什么是这个选项的inteneded使用? 为什么它在那里,为什么忽略? 我想这一定是有原因的。
根据cat
的POSIX标准 :
概要
cat [-u] [file...]
…
OPTIONS
…
应支持以下选项:
-u从输入文件中将字节无延迟地写入标准输出,因为每个字节都被读取。
这可以通过禁用输出上的缓冲来实现。
cat -u
背后的想法的确是输出应该是没有缓冲的,所以即使cat
在管道中,数据也会在读取时被及时写入。
使用cat -u "$@" | …
实际上,输入来自键盘。
有可能是GNU cat
没有缓冲(使用直接read()
和write()
调用),所以-u
选项是无关紧要的 – 它总是以“无缓冲模式”工作。
选项-u
禁用缓冲到stdout
。
GNU文档读取:
使用无缓冲的I / O标准输出。 没有这个选项Posix不指定行为。
这也许表明cat
的当前默认行为是不输出缓冲的。
这是Unix / Linux的POSIX兼容选项。 GNU cat
会自动执行此操作,并且无法将其关闭。 指定时,它被接受但被忽略,因为它对行为没有影响。
更多细节cat(1)
:
-u
从输入文件中将字节无延迟地写入标准输出,因为每个字节都被读取。
-u
选项在从FIFOs
进行非阻塞式读取的原型中具有价值。 意图是支持以下顺序:
mkfifo foo>
cat -u foo> / dev / tty13&
猫-u> foo在默认情况下标准输出是否缓冲是未指定的。 当标准输出与终端相关联时,这有时是有意义的,因为缓冲可能会延迟输出。 -u选项的存在保证了未缓冲的I / O可用。 如果没有指定-u选项,则实现定义cat实用程序是否缓冲输出。 传统上,-u选项是使用IEEE Std 1003.1-2001的System Interfaces卷中定义的setvbuf()函数的等价物来实现的。