In a Linux environment, the base64 tool can be used to base64 encode or decode data. If called directly the tool expects a file path but it is also possible to use stdin. This means we can use echo or printf together with a pipe to encode (or decode) a string without writing it to a file first.

But be careful which command you use! The same string 'foobar' will result in a different base64 encoded string, depending on whether echo or printf was used:

echo 'foobar' | base64
Zm9vYmFyCg==

printf 'foobar' | base64
Zm9vYmFy

But why is that so? The short answer: echo always adds an end-of-line character to the string, and this character gets encoded too in the base64 string.

echo 'foobar' | od -c
0000000   f   o   o   b   a   r  \n
0000007

printf 'foobar' | od -c
0000000   f   o   o   b   a   r
0000006

The end-of-line character is not only added by echo. Using the <<< redirection also has this effect.

encodedString=$( base64 <<< 'foobar' )
❯ base64 --decode <<< $encodedString | od -c
0000000   f   o   o   b   a   r  \n
0000007

🧐And remember “Base64 is an encoding, not an encryption”.