Answers:
优选和使用最广泛的不是同一件事。虽然printf
由于多种原因而更好,但大多数人仍在使用,echo
因为语法更简单。
您首选的主要原因printf
是:
echo
未标准化,它将在不同系统上表现不同。您很难预测自己实际运行的时间echo foo
。为了说明,在我的Debian系统上:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
如您所见,有两种不同的echo
命令,一种是内置的shell(在本例中为bash),另一种是单独的二进制文件。请注意,它bash
也具有printf
内置函数,但其行为更加标准化,因此不再是问题(感谢@RaduRădeanu指出)。
由于echo
支持命令行开关的某些(但不是全部)实现,因此很难打印以a开头的字符串-
。尽管许多程序都支持--
表示开关的结尾和参数的开头(例如,grep -- -a file
将在file
包含的行中查找-a
),echo
但不能。那么,您如何echo
打印-n
?
$ echo -n ## no output
$ echo '-n' ## no output
$ echo "-n" ## no output
$ echo \-n ## no output
$ echo -e '\055n' ## using the ASCII code works but only on implementations
-n ## that support -e
printf
可以轻松做到这一点:
$ printf -- '-n\n'
-n
$ printf '%s\n' -n
-n
$ printf '\055n\n'
-n
要获得比您想知道的printf
更好的信息echo
,请参阅http://unix.stackexchange.com上类似问题的答案:
printf
作为更好的口译员。
printf
(请参阅参考资料type -a
)。
echo
根本上讲零客观的技术优势。那是对的吗?
echo
而不是的唯一原因printf
是格式可以更简单。如果您知道要打印的内容,echo foo
则比更快,更容易键入printf 'foo\n'
。除此之外,在编写需要打印变量的脚本时,永远没有充分的理由使用echo
。
询问哪个更可取本身是不完整的。
如果只希望发出一行或多行以换行符结尾的文本,则回显就足够了。如果打算使用更巧妙的方法,特别是包括不包含换行符的“分行”,那么printf最适合该目的。
echo
实现的不同,使用可以轻松完成“避免换行” echo -n
。实际上,这-n
是echo的最可移植的功能。根据POSIX的说法,SystemV缺少此功能,但大多数Unices中都存在。
-n
BSD和SystemV,但是我不知道其他任何事情。