将文件内容输出到标准输出的命令?

con*_*d00 40 less cat stdout

我知道cat可以做到这一点,但它的主要目的是连接而不是仅仅显示内容。

我也知道lessand more,但我正在寻找一些简单的(不是寻呼机),它只是将文件的内容输出到终端,并且它是专门为此而制作的,如果有的话。

cha*_*aos 54

最明显的一个是cat。但是,也看看headtail。还有其他 shell 实用程序可以逐行打印文件:sed, awk, grep. 但那些是交替文件内容或在文件内搜索。

我做了一些测试来估计哪个是最有效的。我运行所有低谷strace,看看哪个系统调用最少。我的文件有 1275 行。

  • awk: 1355 个系统调用
  • cat: 51 个系统调用
  • grep: 1337 个系统调用
  • head: 93 个系统调用
  • tail: 130 个系统调用
  • sed: 1378 个系统调用

如您所见,即使cat旨在连接文件,它也是最快和最有效的。sedawkgrep逐行打印文件,这就是为什么他们有超过 1275 个系统调用的原因。

  • 计算系统调用的好主意! (15认同)
  • +1,答案更准确(关于 cat 的含义),更完整(替代)和研究(系统调用) (2认同)

Jan*_*Jan 24

我知道cat可以做到这一点,但它的主要目的是连接而不是仅仅显示内容。

目的cat正是如此,读取文件并输出到标准输出。

  • 信不信由你,无论如何,cat 正是你要找的。 (21认同)
  • 不,@confused00,简是对的。问题是——终端*是*标准输出——你看到了吗?例如,做`readlink /dev/fd/1` - 如果在标准提示符下运行,你应该在那里得到你的 tty 的名字。因此,将输入连接到输出就是您要执行的操作。 (5认同)
  • 逻辑是,打印*一个*文件的内容只是按顺序打印*一个或多个*文件的内容的一种特殊情况。 (3认同)
  • @mikeserv 是的,我明白你的意思,我想我太执着于“连接”的含义。 (2认同)

Mar*_*wen 11

首先,cat写入标准输出,它不一定是终端,即使cat是作为交互式 shell 命令的一部分输入的。如果您确实需要在重定向标准输出时向终端写入某些内容,这并不容易(您需要指定哪个终端,如果命令是从脚本执行的,甚至可能没有终端),尽管如果命令只是管道的一部分,则可以(ab)使用标准错误输出。但是,既然您表示cat确实可以完成这项工作,那么我想您不是在问这种情况。

如果您的目的是将写入标准输出的内容发送到管道中,则 usingcat将有资格获得无用使用 Cat 奖,因为cat file | pipeline(其中pipeline代表任何管道)可以更有效地完成,因为<file pipeline. 但同样,从你的措辞我推断这不是你的意图。

所以你在担心什么并不是很清楚。如果您发现输入cat太长,您可以定义一个或两个字符的别名(在标准 Unix 中仍有一些这样的名称未使用)。但是,如果您担心cat会花费无用的周期,那么您不应该这样做。

如果有一个程序null不接受任何参数,只是将标准输入复制到标准输出(管道的中性对象),那么您可以使用<file null. 没有这样的程序,虽然它很容易编写(一个只有一行main函数的 C 程序可以完成这项工作),但是cat不带参数的调用(或者cat -如果你想明确的话)就是这样做的。

如果有一个nocat程序只接受一个文件名参数,尝试打开文件,如果不能,则抱怨它,否则继续从文件复制到标准输出,那么这正是您所要求的。它只是比 稍微难写一点null,主要工作是打开文件、测试和可能的抱怨(如果你很细致,你可能还想包括一个只有一个参数的测试,否则抱怨)。但同样cat,现在提供了一个参数,就可以做到这一点,所以不需要任何nocat程序。

一旦你成功地编写了nocat程序,为什么只停留在一个论点上呢?将代码包装到一个循环for(;*argp!=NULL;++argp)中真的一点也不费力,最多向二进制文件中添加几条机器指令,并避免抱怨参数数量错误(这样可以节省更多指令)。Voilà 的原始版本cat,连接文件。(老实说,您需要稍微调整一下,以便在没有参数的情况下它的行为就像null.)

当然,在真正的cat节目中,他们添加了一些花里胡哨的东西,因为他们总是这样做。但本质是,“串联”方面的cat成本实际上根本不需要任何努力,无论是程序员还是执行它的机器。cat包含nullnocat解释了此类程序不存在的事实。cat如果结果进入管道,请避免使用单个参数,但如果它仅用于在终端上显示文件内容,即使我链接到的页面也承认这是 的有用用途cat,所以不要犹豫。


您可以cat通过围绕假设nocat功能的简单循环来测试它是否真正实现,方法是调用cat多个文件名,其中一个无效名称,而不是在第一个位置:与其立即抱怨该文件不存在,不如cat先转储前面的有效文件,然后抱怨无效文件(至少我的猫是这样的)。


jim*_*mij 10

正在zsh尝试中

<file
Run Code Online (Sandbox Code Playgroud)

我相信这是打印文件的最短方法。它使用“隐藏” cat(或者more如果 stdout 是终端),但是用于打印的命令由READNULLCMD变量控制,您可以直接通过命令名称甚至某些函数安全地覆盖该变量。例如打印带有行号的文件:

numcat() { nl -s'> ' -w2 - }
READNULLCMD=numcat
<file
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 5

POSIX 将cat定义为:

姓名

cat - 连接并打印文件

概要

cat [-u] [文件...]

描述

cat 实用程序应按顺序读取文件,并将其内容以相同的顺序写入标准输出。

所以我认为这里的连接意味着按顺序读取文件


Jam*_*Lay 5

我知道这是一个过去时的问题。从技术上讲,由于将文件内容打印到stdout是一种连接形式,因此cat在语义上是合适的。不要忘记它printf在语义上旨在格式化和打印数据。Bash 还提供了重定向文件输入和输出的语法。这些的组合可能会产生这样的结果:

printf '%s' "$(<file.txt)"
Run Code Online (Sandbox Code Playgroud)

  • 除了特别迂回之外,显示的命令并不等同于`cat file.txt`,因为它会删除任何尾随的换行符(`$(...)` 会这样做)。 (4认同)

wis*_*cky 5

只是作为演示,你可以这样做

cp foo /dev/stdout
Run Code Online (Sandbox Code Playgroud)