Answers:
正如大多数其他人所观察到的,如果将“ -n”放置在echo
命令之后但紧随其后的位置,则将按字面意义进行解释。
从历史上看,UNIX实用程序都是这样的-它们仅在命令名称后立即寻找选项。可能是BSD或GNU率先提出了更灵活的样式(尽管我可能是错的),因为即使现在POSIX仍将旧方法指定为正确的方法(请参见指南9,也适用man 3 getopt
于Linux系统)。无论如何,即使这些天大多数Linux实用程序都使用新样式,也存在一些类似的坚持echo
。
Echo
从标准的角度来看,这是一个烂摊子,因为到POSIX出现时,至少有两个根本上相互冲突的版本在起作用。一方面,您具有SYSV样式,该样式可解释反斜杠转义的字符,但否则将按原样对待其参数,不接受任何选项。另一方面,您具有BSD样式,该样式将首字母-n
作为特殊情况对待,并且从字面上绝对输出其他所有内容。既然如此echo
方便,您就有成千上万个依赖于一种行为或另一种行为的shell脚本:
echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --
由于“按字面意义处理所有内容”的语义,即使不加echo
破坏也无法添加新选项。如果GNU在上面使用了弹性选项方案,地狱就会崩溃。
顺便说一句,为了使Bourne Shell实现之间达到最佳兼容性,请使用printf
而不是echo
。
更新以解释为什么echo
特别不使用灵活选项。
echo
,也有一些实现可以识别-e
或-E
作为选项。为了便于携带,请勿以开头-
或使用printf %s -e
。
echo -n "bar"
给“ bar”,而echo "bar" -n
给“ bar -n”