Ubuntu – Why is there a /bin/echo and why would I want to use it

bashcommand lineecho

I noticed that there is a binary executable /bin/echo on my Ubuntu MATE 17.04 system.

I thought, that's odd, because

$ type echo
echo is a shell builtin

Cursory testing suggests that /bin/echo does the same sort of thing as the Bash builtin echo:

$ /bin/echo foo
$ /bin/echo $USER

So, why is there another version of echo separate from the Bash program, and why or when would I want to use it?

Best Answer

If you open up a bash prompt and type in an echo command, that uses a shell builtin rather than running /bin/echo. The reasons it is still important for /bin/echo to exist are:

  1. You're not always using a shell. Under a variety of circumstances, you run an executable directly and not through a shell.
  2. At least in theory, some shells don't have an echo builtin. This is not actually required.

To expand on #1, suppose you wanted to move all the regular files whose names started with abc anywhere in src to dest. There are several ways to do that but one of them is:

find src -name 'abc*' -type f -exec mv -nv {} dest/ \;

But suppose, rather than just running that, you want to see every command that will be run first. Well, then you can prepend echo to the command, just as you might in other contexts:

find src -name 'abc*' -type f -exec echo mv -nv {} dest/ \;

But find doesn't use a shell. That runs /bin/echo.

Besides find with -exec or -execdir, the /bin/echo executable will be called by other programs that themselves run programs but not through a shell. This happens with the xargs command (which is related to find), as well as in a number of other contexts, such as the Exec= line of a .desktop file. Another example is when you run sudo echo, which can be handy for testing if sudo is working.

Similarly, some shells have a printf builtin but /usr/bin/printf also exists.

A less common possible reason you might deliberately use /bin/echo is if you were relying on the differences between it and the echo command provided by your shell. man echo documents /bin/echo; help echo in bash documents the bash builtin. echo is not very portable, because different implementations--both across operating systems and across shells on the same operating system--support different options (e.g., -e) and differ in their treatment of backslashes. Of course, it's better to avoid relying on such details, and use printf instead, which is far more portable.

In bash, you can make the type builtin show /bin/echo as well--assuming /bin is in your $PATH as it always should be--by passing it the -a flag:

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