首先,cat
写入标准输出,它不一定是终端,即使它cat
是作为交互式shell命令的一部分而键入的。如果即使重定向了标准输出,实际上仍然需要向终端写入内容,那么就不那么容易了(您需要指定哪个终端,如果从脚本执行命令,甚至可能没有一个)。如果命令仅仅是管道的一部分,则可能会(使用)标准错误输出。但是,既然您指出cat
实际上可以完成工作,那么我想您不是在问这种情况。
如果您的目的是将写入标准输出的内容发送到管道中,则使用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
先转储以下文件有效文件,然后抱怨无效文件(至少这是我的猫的行为)。