答案1
答案2
我知道
cat
可以做到这一点,但其主要目的是连接而不仅仅是显示内容。
的目的cat
正是如此,读取文件并输出到stdout。
答案3
首先,cat
写入标准输出,该输出不一定是终端,即使是cat
作为交互式 shell 命令的一部分键入的。如果即使标准输出被重定向,您确实需要向终端写入一些内容,那也不是那么容易(您需要指定哪个终端,如果从脚本执行命令,甚至可能没有终端),尽管有一个如果该命令只是管道的一部分,则可以(ab)使用标准错误输出。但既然你表示这cat
实际上可以完成工作,我想你并不是在问这种情况。
如果您的目的是将写入标准输出的内容发送到管道中,那么 usingcat
将符合无用猫奖,因为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
首先转储前面的文件有效的文件,然后抱怨无效的文件(至少我的猫是这样的)。
答案4
我知道这是一个过去时的问题。从技术上讲,由于将文件内容打印到是stdout
一种串联形式,cat
因此在语义上是合适的。不要忘记这printf
在语义上是为了格式化和打印数据。 Bash 还提供了重定向文件输入和输出的语法。这些的组合可能会产生这样的结果:
printf '%s' "$(<file.txt)"