$ cat a.sh #!/bin/bash echo -n "apple" | shasum -a 256 $ sh -x a.sh + echo -n apple + shasum -a 256 d9d20ed0e313ce50526de6185500439af174bf56be623f1c5fe74fbb73b60972 - $ bash -x a.sh + echo -n apple + shasum -a 256 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b -
And the last one is correct. Why is that? and how to solve it?
Advertisement
Answer
Per POSIX, echo
supports no options.
Therefore, when echo -n
is run with sh
, it outputs literal -n
instead of interpreting -n
as the no-trailing-newline option:
$ sh -c 'echo -n "apple"' -n apple # !! Note the -n at the beginning.
Note: Not all sh
implementations behave this way; some, such as on Ubuntu (where dash
acts as sh
), do support the -n
option, but the point is that you cannot rely on that, if your code must run on multiple platforms.
The portable POSIX-compliant way to print to stdout is to use the printf
utility:
printf %s "apple" | shasum -a 256