我理解这一点的方式是命令
cat file
将显示文件的内容和
cat < file
将文件的内容作为输入。我正在尝试这个并创建了两个文件。一个名为file1.txt,另一个名为file2.txt。在file1.txt中,我写了file2.txt,所以输入命令
cat < file1.txt
,我希望显示file2.txt的内容;但是,两者都有
cat file1.txt and cat < file1.txt
正在显示file1.txt的内容。我想我误解了&lt;。
答案 0 :(得分:2)
如果传递一个或多个文件名,cat
将显示这些文件的内容。否则,它将打印在stdin上传递的任何内容。
cat file
cat
收到一个文件名,打开文件并打印其内容
cat < file
shell将stdin重定向到指定文件:它打开文件并将其内容提供给stdin上的cat
。 cat
没有收到任何参数。没有参数,它会打印stdin上的任何内容 - 文件的内容。
净结果:cat file
和cat < file
做同样的事情。
答案 1 :(得分:1)
当使用参数文件运行cat
时,它将打开并从每个文件读取到标准输出。因此,使用cat file1.txt
,cat
会打开file1.txt
并将其内容打印到标准输出:
$ cat file1.txt
file2.txt
在没有参数文件的情况下运行cat
时,它将从标准输入读取(例如,就像您直接键入cat)并写入标准输出。但< file1.txt
告诉 shell (例如bash)打开文件file1.txt
,并通过标准输入将其重定向到cat
:
$ cat < file1.txt
file2.txt
正如你所看到的,效果是一样的,猫会读取给定的文件;区别在于谁打开文件。在第一种情况下,cat
被告知打开文件本身,而在第二种情况下,shell打开它,cat
除了通过其进入的数据流之外什么也不知道。标准输入,它应该打印。
最后,如果要将file1.txt
的内容用作参数到cat
,则需要使用语法
$ cat $(< file1.txt) # same as: cat file2.txt
[...contents of file2.txt]
答案 2 :(得分:0)
让我们从{9}的根源中了解cat
的概念,例如从plan9(进化的根源)中了解一下:
# \sys\src\cmd\cat.c
#include <u.h>
#include <libc.h>
void
cat(int f, char *s)
{
char buf[8192];
long n;
while((n=read(f, buf, (long)sizeof buf))>0)
if(write(1, buf, n)!=n)
sysfatal("write error copying %s: %r", s);
if(n < 0)
sysfatal("error reading %s: %r", s);
}
void
main(int argc, char *argv[])
{
int f, i;
argv0 = "cat";
if(argc == 1)
cat(0, "<stdin>");
else for(i=1; i<argc; i++){
f = open(argv[i], OREAD);
if(f < 0)
sysfatal("can't open %s: %r", argv[i]);
else{
cat(f, argv[i]);
close(f);
}
}
exits(0);
}
从消息源中可以清楚地看出,如果将< file
作为参数添加到cat
,它将从stdin(f = 0)读取并写入stdout(1):
while((n=read(f, buf, (long)sizeof buf))>0)
if(write(1, buf, n)!=n)