哪个是更好的printf或echo?


Answers:


27

优选和使用最广泛的不是同一件事。虽然printf由于多种原因而更好,但大多数人仍在使用,echo因为语法更简单。

您首选的主要原因printf是:

  1. echo 未标准化,它将在不同系统上表现不同。
  2. 您很难预测自己实际运行的时间echo foo。为了说明,在我的Debian系统上:

    $ type -a echo
    echo is a shell builtin
    echo is /bin/echo
    

    如您所见,有两种不同的echo命令,一种是内置的shell(在本例中为bash),另一种是单独的二进制文件。请注意,它bash也具有printf内置函数,但其​​行为更加标准化,因此不再是问题(感谢@RaduRădeanu指出)。

  3. 由于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上类似问题的答案:

/unix//a/65819/22222


1
给出好的答案。它帮助我更喜欢printf作为更好的口译员。
潘迪2014年

3
在第2点,情况同样如此printf(请参阅参考资料type -a)。
RaduRădeanu2014年

2
@RaduRădeanu是正确的,但是在POSIX中printf更严格地定义,我认为内置函数遵循相同的标准。POSIX的规格echo,另一方面是不太严格,甚至明确状态会有实现和其之间的差异printf应该是首选。
terdon

哇。因此,使用,echo根本上讲零客观的技术优势那是对的吗?
JamesTheAwesomeDude

1
@JamesTheAwesomeDude不,绝对没有技术优势。使用echo而不是的唯一原因printf是格式可以更简单。如果您知道要打印的内容,echo foo则比更快,更容易键入printf 'foo\n'。除此之外,在编写需要打印变量的脚本时,永远没有充分的理由使用echo
terdon

4

询问哪个更可取本身是不完整的。

如果只希望发出一行或多行以换行符结尾的文本,则回显就足够了。如果打算使用更巧妙的方法,特别是包括不包含换行符的“分行”,那么printf最适合该目的


根据echo实现的不同,使用可以轻松完成“避免换行” echo -n。实际上,这-n是echo的最可移植的功能。根据POSIX的说法,SystemV缺少此功能,但大多数Unices中都存在。
terdon

我已经在足够多的unice中工作,甚至没有尝试避免使用echo换行符。编写可在SCO,AIX,HP-UX和Linux上移植的脚本非常困难。
蒙迪·哈德2014年

哦,绝对,那里没有争论。我只想说换行符是最少的问题。尝试移植到非GNU系统后,所有赌注都会关闭。我认为您可以依靠-nBSD和SystemV,但是我不知道其他任何事情。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.