cat file和cat<之间有什么区别?文件

时间:2017-04-09 00:43:17

标签: unix

我理解这一点的方式是命令

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;。

的定义

3 个答案:

答案 0 :(得分:2)

如果传递一个或多个文件名,cat将显示这些文件的内容。否则,它将打印在stdin上传递的任何内容。

cat file

cat收到一个文件名,打开文件并打印其内容

cat < file

shell将stdin重定向到指定文件:它打开文件并将其内容提供给stdin上的catcat没有收到任何参数。没有参数,它会打印stdin上的任何内容 - 文件的内容。

净结果:cat filecat < file做同样的事情。

答案 1 :(得分:1)

当使用参数文件运行cat时,它将打开并从每个文件读取到标准输出。因此,使用cat file1.txtcat会打开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)