Skip to content

Latest commit

 

History

History
72 lines (51 loc) · 4.15 KB

echo-vs-printf.md

File metadata and controls

72 lines (51 loc) · 4.15 KB

echo-vs-printf

It's time for one of your Bash-coded applications to write a bit of content to the console, or perhaps a filesystem. How do you do so?

Dramatic personae

Most of us learn echo early in our Bash careers. echo is so capable that it's possible to code successfully for years without touching on printf as an alternative to echo. What's the point of the latter, then? Is one just like the other, with a default terminal newline? Do experienced coders have any reason more interesting than pretension for their frequent use of printf?

There is, in fact, more to the story. While quite a few commentators apparently believe that "... [t]he only difference ... is echo will output an extra newline ...", that's not the whole truth:

  • printf is better standardized;
  • The two differ especially in how they handle escape characters; and
  • echo's variations are large enough to constitute security surprises.

Standardization

On MacOS 13.2.1, for instance, /bin/bash pops up as ... version 3.2.57 ... Modern Linux distributions tend to operate with version 5.1.4 or greater. The echo available within /bin/bash behaves differently with regard to -n in versions 3.2 and before, compared to 4.0 and later. One summary: "Applications aiming for maximum portability are strongly encouraged to use printf ..." Also, "... printf is a preferred alternative ..."

Conclusion: the behavior of printf is more uniform across different bash environments than is that of echo. Bluntly, "... there's never a good reason to use echo ..."

Escape characters

More recent echo doesn't honor escaped characters. More specifically, S='ab\tcd\n'; echo "$S"; printf "$S"; printf %s "$S" with most current Linuxes results in

ab\tcd\n
ab	cd
ab\tcd\n

while on MacOS one sees

ab	cd

ab	cd
ab\tcd\n

Security

Although echo can be easier, and perhaps require fewer keystrokes, to program in common cases, the examples above make it clear that printf is more consistent and flexible across different environments. echo's surprises are so many that its use arguably creates security hazards.

[Provide explicit example of security risk.]

Performance considerations

Production-level Bash programming probably is best off to eschew echo entirely, in favor of printf. To repeat the conclusions above: printf is more consistent and manageable.

However, echo is faster. On yet another hand, if you have a production-level program [follow up with essay on safe Bash programming?] where echo's speed advantage is consequential ... well, you probably need a more delicate analysis than fits in this little essay. As a starting point: don't leave home without ShellCheck [provide page on ShellCheck].

printf vs print

[Explain. Explain print -r ...]

Why do these notes appear here rather than in Stackoverflow or elsewhere?

[Explain. No advertising. Just documented, pertinent facts.]