The following code best describes the situation. Why is the last line not outputting the trailing newline char? Each line's output is shown in the comment. I'm using GNU bash, version 4.1.5      echo -n $'a\nb\n'                  | xxd -p  # 610a620a             x=$'a\nb\n'   ; echo -n $x | xxd -p  # 610a620a     echo -ne a\nb\n                  | xxd -p  # 610a620ax=$(echo -ne a\nb\n) ; echo -n $x | xxd -p  # 610a62
Where has the trailing newline char gone from my command substitution?
shell;command line;text processing;command substitution
The command substitution function $() (and its cousin the backtick) specifically removes trailing newlines. This is the documented behavior, and you should always be aware of it when using the construct.Newlines inside the text body are not removed by the substitution operator, but they may also be removed when doing word splitting on the shell, so how that turns out depends on whether you used quotes or not. Note the difference between these two usages:$ echo -n $(echo -n 'a\nb')ab$ !! | xxd -p610a62$ echo -n  $(echo -n 'a\nb')a b$ !! | xxd -p   612062In the second example, the output wasn't quoted and the newline was interpreted as a word-split, making it show up in the output as a space!