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