首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cat文件和cat < file有什么不同

cat文件和cat < file有什么不同
EN

Stack Overflow用户
提问于 2017-04-09 08:43:17
回答 3查看 1.5K关注 0票数 2

我对此的理解是,命令

代码语言:javascript
复制
cat file 

将显示文件的内容和

代码语言:javascript
复制
cat < file 

将接受文件的内容作为输入。我尝试了一下,创建了两个文件。一个名为file1.txt,另一个名为file2.txt。在file1.txt中,我编写了file2.txt,因此通过键入以下命令

代码语言:javascript
复制
cat < file1.txt

,我期望显示file2.txt的内容;然而,两个cat file1.txt and cat < file1.txt都显示了file1.txt的内容。我想我误解了<的定义。

EN

回答 3

Stack Overflow用户

发布于 2017-04-09 08:52:44

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

代码语言:javascript
复制
cat file

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

代码语言:javascript
复制
cat < file

shell将标准输入重定向到指定的文件:它打开文件并将其内容提供给标准输入上的catcat不接收任何参数。如果没有参数,它将打印stdin上的所有内容--文件的内容。

最终结果:cat filecat < file做了同样的事情。

票数 2
EN

Stack Overflow用户

发布于 2017-04-09 08:54:53

当使用参数文件运行cat时,它将打开这些文件中的每个文件并将其读取到标准输出。因此,使用cat file1.txtcat打开file1.txt并将其内容打印到标准输出:

代码语言:javascript
复制
$ cat file1.txt
file2.txt

cat在没有参数文件的情况下运行时,它将从标准输入读取(例如,就像您直接输入cat一样)并写入标准输出。但是< file1.txt告诉外壳程序(例如bash)打开文件file1.txt,并通过标准输入将其重定向到cat

代码语言:javascript
复制
$ cat < file1.txt
file2.txt

正如您所看到的,效果是相同的,即cat将读取给定的文件;不同之处在于谁打开该文件。在第一种情况下,cat被告知打开文件本身,而在第二种情况下,外壳程序打开文件,并且cat不知道任何东西,只知道有一个数据流通过它的标准输入进入,它应该打印出来。

最后,如果希望将file1.txt的内容用作cat的参数,则需要使用以下语法

代码语言:javascript
复制
$ cat $(< file1.txt) # same as: cat file2.txt
[...contents of file2.txt]
票数 2
EN

Stack Overflow用户

发布于 2019-08-22 23:56:38

让我们从它的根源来看cat的概念,比如说从plan9 (进化的根源):

代码语言:javascript
复制
# \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):

代码语言:javascript
复制
    while((n=read(f, buf, (long)sizeof buf))>0)
        if(write(1, buf, n)!=n)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43301867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档