cat 命令(没有参数)如何复制它的标准输入?

How does the cat command (with no args) duplicate its stdin?

我正在尝试理解 how/why cat 命令以它的方式解析其标准输入。

当我将 cat 的标准输入设置为 "infile.txt" 时,标准输入只是写入标准输出:

~$ echo foo bar test > infile.txt 
~$ cat < infile.txt
foo bar test
~$

这是我所期望的。但是,当我 运行 cat 的标准输入设置为我的 (p)tty 时,标准输入被复制到标准输出,直到读取 EOF:

~$ cat
foo bar test
foo bar test
input is duplicated
input is duplicated
^C
~$

每对:

这怎么可能?据我了解,sh 以这样的方式解析上述两个命令,即 cat 被调用 (argc=1, argv=["cat"])。因此,对 cat 的调用是相同的。如果是这种情况,那么为什么 ~$ cat < infile.txt 示例中的输出没有重复?

catinfile.txt 的标准输入中读取每个字符时,它不应该也打印出读取的字符(就像在简单的 ~$ cat 情况下那样)吗?

我看过这个简单的(大概)实现 [1],但它的行为方式与 ubuntu 18.04 的 cat 不同。它不会像简单的 ~$ cat 示例那样打印出重复的输入。

[1] https://gist.github.com/pete/665971#file-unix7-cat-c

基本上cat的工作方式如下:

while (block = read_block(input)) {
    write_block(block, output);
}

块大小取决于 stdin 是 tty 还是文件。当 stdin 来自 tty 时,输入是行缓冲的,否则是块缓冲的。

cat 只输出一次输入。它也是输出用户输入的终端。

例如,您可以通过键入

来禁用终端回显
stty -echo

然后(盲目地)开始 cat 并开始输入 - 没有重复输出。