Jon*_*ler 14

在他们的文章"UNIX环境中的程序设计"中,Pike和Kernighan讨论了cat程序如何增加控制参数.在某个地方,虽然不是那篇文章,但有一条关于" cat从伯克利挥舞旗帜回来"的评论.这与echo开发选项的问题类似.(我在BSD(Mac OS X)手册中找到了相关文章的参考cat:Rob Pike,"UNIX Style,或者cat -v Considered Harmful",USENIX Summer Conference Proceedings,1983.另见http:// quotes .cat-v.org/programming /)

在他们的书"The UNIX Programming Environment"中,Kernighan&Pike(是的,那两个)再次引用Doug McIlroy关于'echo'应该做什么没有争论的主题(大约1984年):

哲学的另一个问题是echo如果没有论证应该怎么做 - 具体来说,它应该打印一个空行还是什么都没有.echo我们所知道的所有当前实现都打印出一个空白行,但过去的版本没有,并且在这个主题上有很多争论.Doug McIlroy在他关于这个主题的讨论中传达了正确的神秘主义感受:

UNIX和Echo

那里住着新泽西州的UNIX,一个公平的女仆,其中的学者们远行羡慕.由于她的纯洁而感到眼花缭乱,所有人都试图支持她,一个是为了她的处女恩典,另一个是为了她的文明,而另一个因为她在执行严格的任务方面的敏捷性,即使在更富裕的土地上也很少完成.如此大的内心和适应自然的是,UNIX采用了除了最富裕的追求者之外的所有人.很快,许多后代成长并繁荣并扩散到地球的尽头.

大自然对自己微笑,并且比其他凡人更热切地回答UNIX.那些不太懂礼貌的谦卑民众对她的回声感到高兴,如此精确而清澈透明,他们几乎不相信她可以用同样的石头和树林来回答,这些石头和树林将他们自己的吼叫声塞进旷野.兼容的UNIX必须完美回应她所要求的任何内容.

当一个不耐烦的swain向UNIX询问"没有回声"时,UNIX故意张开嘴,没有回应,然后再次关闭它.

"不管你的意思是什么,"年轻人要求,'这样张开嘴?从此以后,当你不应该回声时,永远不要张开嘴!并且UNIX有责任.

"但是我想要一个完美的表演,即使你什么都不回应,"一位敏感的年轻人恳求道,"没有完美的回声可以来自闭口." 不想得罪任何一个,UNIX同意对不耐烦的年轻人和麻木不仁的年轻人说不同的话.她称之为"敏感无所谓\n".

然而现在,当她说' \n'时,她并没有真正说什么,所以她不得不两次张开嘴,一次说\n'和一次什么都不说,所以她没有取悦敏感的青年,他们立即说,' \n听起来对我来说完全没什么,但第二个却毁了它.我希望你收回他们中的一个.因此,无法忍受犯罪的UNIX同意撤消一些回声,并称之为' \c'.现在,敏感的年轻人可以通过一起要求\n"和" 来听到完美的回音\c.但是他们说,在他听到之前,他死于过多的记谱法.


Korn shell引入(或至少包含)printf基于C语言printf()函数的命令,并使用格式字符串来控制材质的显示方式.它是比复杂格式更好的工具echo.但是,由于报价中概述的历史,echo不仅仅是回应; 它解释了回应的内容.

并且echo无意中解释命令行参数需要更多代码而不是解释它们.基本的echo命令是:

#include <stdio.h>
int main(int argc, char **argv)
{
    const char *pad = "";
    while (*++argv)
    {
        fputs(pad, stdout);
        fputs(*argv, stdout);
        pad = " ";
    }
    fputc('\n', stdout);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以实现这一目标.但是更复杂的版本echo必须在打印之前仔细检查它们的参数 - 这需要更多的代码.并且不同的系统已经决定他们想要对他们的参数进行不同数量的解释,从而导致不同数量的代码.


Ken*_*ric 7

你会发现实际上并没有那么多膨胀.

  1. 大多数代码行都是注释.
  2. 大多数不是注释的代码行都是用法文档,因此当有人使用'echo --help'它会做一些事情.
  3. 上述代码之外的代码主要是处理echo可以采用的参数,以及\n和\ t等符号的"特殊"扩展是它们的等效字符,而不是字面上回显它们.

此外,大多数情况下,你甚至没有运行echo命令,大多数时候'echo'会调用内置的shell.至少在我的机器上,你必须输入/bin/echo --help以获取所有高级功能/文档,因为echo --help仅仅是echo--help

举个好例子,在shell中运行它.

 echo '\e[31mhello\e[0m'
Run Code Online (Sandbox Code Playgroud)

然后运行:

 echo -e '\e[31mhello\e[0m'
Run Code Online (Sandbox Code Playgroud)

你会注意到截然不同的结果.

前者只是按原样发出输入,但后者将打印出hello红色.

另一个例子,使用'十六进制'代码:

$echo '\x64\x65\x66'
\x64\x65\x66

$echo -e '\x64\x65\x66'
def
Run Code Online (Sandbox Code Playgroud)

绝对不同的行为.openbsd实现不能这样=).