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
~$
每对:
- 第一行显示为用户键入。 (这不是写入 stdout/stderr)
- 第二行是在用户按下
[enter]
后生成的。 (这是写入标准输出)
这怎么可能?据我了解,sh
以这样的方式解析上述两个命令,即 cat
被调用 (argc=1, argv=["cat"])。因此,对 cat
的调用是相同的。如果是这种情况,那么为什么 ~$ cat < infile.txt
示例中的输出没有重复?
当 cat
从 infile.txt
的标准输入中读取每个字符时,它不应该也打印出读取的字符(就像在简单的 ~$ cat
情况下那样)吗?
我看过这个简单的(大概)实现 [1],但它的行为方式与 ubuntu 18.04 的 cat 不同。它不会像简单的 ~$ cat
示例那样打印出重复的输入。
基本上cat
的工作方式如下:
while (block = read_block(input)) {
write_block(block, output);
}
块大小取决于 stdin 是 tty 还是文件。当 stdin 来自 tty 时,输入是行缓冲的,否则是块缓冲的。
cat
只输出一次输入。它也是输出用户输入的终端。
例如,您可以通过键入
来禁用终端回显
stty -echo
然后(盲目地)开始 cat
并开始输入 - 没有重复输出。
我正在尝试理解 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
~$
每对:
- 第一行显示为用户键入。 (这不是写入 stdout/stderr)
- 第二行是在用户按下
[enter]
后生成的。 (这是写入标准输出)
这怎么可能?据我了解,sh
以这样的方式解析上述两个命令,即 cat
被调用 (argc=1, argv=["cat"])。因此,对 cat
的调用是相同的。如果是这种情况,那么为什么 ~$ cat < infile.txt
示例中的输出没有重复?
当 cat
从 infile.txt
的标准输入中读取每个字符时,它不应该也打印出读取的字符(就像在简单的 ~$ cat
情况下那样)吗?
我看过这个简单的(大概)实现 [1],但它的行为方式与 ubuntu 18.04 的 cat 不同。它不会像简单的 ~$ cat
示例那样打印出重复的输入。
基本上cat
的工作方式如下:
while (block = read_block(input)) {
write_block(block, output);
}
块大小取决于 stdin 是 tty 还是文件。当 stdin 来自 tty 时,输入是行缓冲的,否则是块缓冲的。
cat
只输出一次输入。它也是输出用户输入的终端。
例如,您可以通过键入
来禁用终端回显stty -echo
然后(盲目地)开始 cat
并开始输入 - 没有重复输出。