我知道cat可以做到这一点,但它的主要目的是连接而不是仅仅显示内容。
我也知道lessand more,但我正在寻找一些简单的(不是寻呼机),它只是将文件的内容输出到终端,并且它是专门为此而制作的,如果有的话。
cha*_*aos 54
最明显的一个是cat。但是,也看看head和tail。还有其他 shell 实用程序可以逐行打印文件:sed, awk, grep. 但那些是交替文件内容或在文件内搜索。
我做了一些测试来估计哪个是最有效的。我运行所有低谷strace,看看哪个系统调用最少。我的文件有 1275 行。
awk: 1355 个系统调用cat: 51 个系统调用grep: 1337 个系统调用head: 93 个系统调用tail: 130 个系统调用sed: 1378 个系统调用如您所见,即使cat旨在连接文件,它也是最快和最有效的。sed,awk并grep逐行打印文件,这就是为什么他们有超过 1275 个系统调用的原因。
Jan*_*Jan 24
我知道
cat可以做到这一点,但它的主要目的是连接而不是仅仅显示内容。
目的cat正是如此,读取文件并输出到标准输出。
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包含null并nocat解释了此类程序不存在的事实。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)
我知道这是一个过去时的问题。从技术上讲,由于将文件内容打印到stdout是一种连接形式,因此cat在语义上是合适的。不要忘记它printf在语义上旨在格式化和打印数据。Bash 还提供了重定向文件输入和输出的语法。这些的组合可能会产生这样的结果:
printf '%s' "$(<file.txt)"
Run Code Online (Sandbox Code Playgroud)