我对此的理解是,命令
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的内容。我想我误解了<的定义。
发布于 2017-04-09 08:52:44
如果传递一个或多个文件名,cat将显示这些文件的内容。否则,它将打印在stdin上传递的所有内容。
cat filecat接收一个文件名,打开该文件并打印其内容
cat < fileshell将标准输入重定向到指定的文件:它打开文件并将其内容提供给标准输入上的cat。cat不接收任何参数。如果没有参数,它将打印stdin上的所有内容--文件的内容。
最终结果:cat file和cat < file做了同样的事情。
发布于 2017-04-09 08:54:53
当使用参数文件运行cat时,它将打开这些文件中的每个文件并将其读取到标准输出。因此,使用cat file1.txt,cat打开file1.txt并将其内容打印到标准输出:
$ cat file1.txt
file2.txt当cat在没有参数文件的情况下运行时,它将从标准输入读取(例如,就像您直接输入cat一样)并写入标准输出。但是< file1.txt告诉外壳程序(例如bash)打开文件file1.txt,并通过标准输入将其重定向到cat:
$ cat < file1.txt
file2.txt正如您所看到的,效果是相同的,即cat将读取给定的文件;不同之处在于谁打开该文件。在第一种情况下,cat被告知打开文件本身,而在第二种情况下,外壳程序打开文件,并且cat不知道任何东西,只知道有一个数据流通过它的标准输入进入,它应该打印出来。
最后,如果希望将file1.txt的内容用作cat的参数,则需要使用以下语法
$ cat $(< file1.txt) # same as: cat file2.txt
[...contents of file2.txt]发布于 2019-08-22 23:56:38
让我们从它的根源来看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,它将从标准输入(f=0)中读取并写入标准输出(1):
while((n=read(f, buf, (long)sizeof buf))>0)
if(write(1, buf, n)!=n)https://stackoverflow.com/questions/43301867
复制相似问题