How to preserve the newline character (\n) when capture output of a command in a variable
output=$(head $file)
keeps embedded newlines in the value of output
, and trims all trailing newlines.
It's how you reference the variable that makes the difference.
Placing the variable reference within double quotes, for example:
echo "$output"
prints the embedded newlines, but not the trailing newlines, which were deleted by the command expansion $(...)
.
This works because the shell interprets only dollar sign, command expansion (back quotes and $(...)
), and back slashes within double quotes; the shell does not interpret whitespace (including newlines) as field separators when inside double quotes.
It is a known flaw of "command expansion" $(...)
or `...`
that the last newline is trimmed.
If that is your case:
$ output="$(head -- "$file"; echo x)" ### capture the text with an x added.
$ output="${output%?}" ### remove the last character (the x).
Will correct the value of output.
To also preserve the exit status:
output=$(head < "$file"; r=$?; echo /; exit "$r")
exit_status=$?
output=${output%/}
Note that using /
is safer than x
as there are some character sets used by some locales where the encoding of some characters end in the encoding of x
(while the encoding of /
would generally not be found in other characters as that would make path lookup problematic for instance).