膨胀的echo命令

查看“echo”命令的以下实现: http://bxr.su/o/bin/echo/echo.c(OpenBSD) http://bxr.su/d/bin/echo/echo.c(DragonFly) http://bxr.su/n/bin/echo/echo.c(NetBSD) http://bxr.su/f/bin/echo/echo.c(FreeBSD) http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/echo.c(GNU) 当你在列表中,我相信你会注意到每个实现中不断增长的膨胀。 272线路回声程序有什么意义?     
已邀请:
在他们的文章“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&派克(是的,那两个)再次引用道格麦克罗伊关于'回声'应该做什么没有争论的主题(大约1984年):   哲学的另一个问题是,如果没有论证,应该做什么 - 具体来说,它应该打印一个空行还是什么都没有。我们所知道的所有当前
echo
实现都打印出一个空行,但过去的版本没有,并且关于这个主题的讨论很多。 Doug McIlroy在他关于这个主题的讨论中传达了正确的神秘主义感受: UNIX和Echo   那里住着新泽西州的UNIX,一个公平的女仆,其中的学者们远行羡慕。由于她的纯洁而感到眼花缭乱,所有人都试图支持她,一个是为了她的处女恩典,另一个是为了她的文明,而另一个因为她在执行严格的任务方面的敏捷性,即使在更富裕的土地上也很少完成。如此大的内心和适应自然的是,UNIX采用了除了最富裕的追求者之外的所有人。很快,许多后代成长并繁荣并扩散到地球的尽头。      大自然对自己微笑,并且比其他凡人更热切地回答UNIX。那些不太懂礼貌的谦卑民众对她的回声感到高兴,如此精确而清澈透明,他们几乎不相信她可以用同样的石头和树林来回答,这些石头和树林将他们自己的吼叫声塞进旷野。兼容的UNIX必须完美回应她所要求的任何内容。      当一个不耐烦的swain向UNIX询问“没有回声”时,UNIX故意张开嘴,没有回应,然后再次关闭它。      “不管你的意思是什么,”年轻人要求,'这样张开嘴?从此以后,当你不应该回声时,永远不要张开嘴!并且UNIX有责任。      “但是我想要一个完美的表演,即使你什么都不回应,”一位敏感的年轻人恳求道,“没有完美的回声可以来自闭口。”不想得罪任何一个,UNIX同意对不耐烦的年轻人和麻木不仁的年轻人说不同的话。她称敏感没有'
n
'。      然而现在,当她说“
n
”时,她并没有真正说什么,所以她不得不两次张开嘴,一次说“
n
”,一次不说话,所以她没有取悦敏感的青年,他们立刻说, 'ѭ6听起来对我来说完全没什么,但第二个却毁了它。我希望你收回他们中的一个。因此,无法忍受犯罪的UNIX同意撤消一些回声,称之为'
c
'。现在敏感的年轻人可以一起要求'
n
'和'
c
',听到完美的回音。但是他们说,在他听到之前,他死于过多的记谱法。 Korn shell引入(或至少包含)基于C语言
printf()
函数的
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;
}
还有其他方法可以实现这一目标。但是更复杂的版本
echo
必须在打印任何内容之前仔细检查它们的参数 - 这需要更多的代码。并且不同的系统已经决定他们想要对他们的参数进行不同数量的解释,从而导致不同数量的代码。     
你会发现实际上并没有那么多膨胀。 大多数代码行都是注释。 大多数不是注释的代码行都是用法文档,因此当有人使用'echo --help'它会做一些事情。 上述代码之外的代码主要是处理echo可以采用的参数,以及 n和 t等符号的“特殊”扩展是它们的等效字符,而不是字面上回显它们。 此外,大多数情况下,你甚至没有运行echo命令,大多数时候'echo'会调用内置的shell。至少在我的机器上,你必须键入
/bin/echo --help
才能获得所有高级功能/文档,因为
echo --help
只是回声
--help
举个好例子,在shell中运行它。
 echo 'e[31mhelloe[0m'
然后运行:
 echo -e 'e[31mhelloe[0m'
你会注意到截然不同的结果。 前者将按原样发出输入,但后者将打印出
hello
红色。 另一个例子,使用'十六进制'代码:
$echo 'x64x65x66'
x64x65x66

$echo -e 'x64x65x66'
def
绝对不同的行为。 openbsd实现不能这样=)。     
我不确定我是否喜欢第一个实现:它有一个选项太多了! 如果需要
-n
选项,那么添加
--
选项以停止选项处理将会有所帮助。这样,如果您正在编写一个读取和打印用户输入的shell脚本,那么如果用户键入
-n
,则不会出现不一致的行为。     

要回复问题请先登录注册