cat命令(无参数)如何复制其stdin?

时间:2019-04-26 09:28:07

标签: c linux bash stdout cat

我试图了解cat命令如何/为什么以其方式解析标准输入。

当我将cat的标准输入设置为“ infile.txt”时,标准输入将简单地写入标准输出:

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

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

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

对于每对:

  • 第一行显示为用户类型。 (这不会写入stdout / stderr)
  • 用户按下[enter]后将产生第二行。 (这是写到stdout的)

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

catinfile.txt的标准输入中读取每个字符时,它是否还应该打印出读取的字符(就像在简单的~$ cat中一样)?

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

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

2 个答案:

答案 0 :(得分:3)

cat仅输出一次输入。终端也输出用户输入。

例如,您可以通过键入来禁用终端回显

stty -echo

然后盲目地启动cat并开始键入-没有重复的输出。

答案 1 :(得分:0)

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

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

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

相关问题