cat命令如何在没有参数的情况下复制其标准输入?

3

我正试图理解为什么和如何 cat 命令会以其特定的方式解析标准输入。

当我将 cat 的标准输入设置为 "infile.txt" 时,标准输入会被简单地写入到标准输出:

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

这符合我的预期。但是当我使用cat并将其stdin设置为我的(p)tty时,stdin会被复制到stdout直到读取到EOF为止。
~$ cat
foo bar test
foo bar test
input is duplicated
input is duplicated
^C
~$

对于每一组:

  • 用户输入时,第一行将被显示。(这不会写入到stdout/stderr)
  • 用户按下[enter]后,第二行将被输出。(这将被写入stdout)

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

由于catinfile.txt读取每个字符,它不应该也像简单的~$ cat示例一样打印出已读取的字符吗?

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

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

2个回答

4
cat 命令只输出一次它的输入,而实际上是终端输出了用户的输入。例如,您可以通过键入以下命令来关闭终端回显:
stty -echo

然后(盲目地)启动cat并开始输入 - 不会有重复输出。


这比我预期的简单多了。现在对我来说很清楚,键入的字符不会立即提供给cat使用。我认为这是我困惑的根源。谢谢。 - Jmate

1
基本上,cat 的工作原理如下:
while (block = read_block(input)) {
    write_block(block, output);
}

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


我发现另一个命令 wc -c,当没有任何参数使用时,会打开一个多行编辑器,当我按下回车键时,它只是跳到下一行,输出上没有任何内容。你知道如何在没有参数的情况下使用它吗? - Shayan

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