В основном, это проблема:
$ echo Hello"$(printf '\n')"World
HelloWorld
Что я упустил из виду?
Это поведение является на самом деле частью спецификации POSIX для замены команды:
Оболочка должна развернуть замену команды путем выполнения команды в подсреде оболочки (см. Среду выполнения Shell), и замена замены команды (текст команды плюс включение "$ ()" или одинарные левые кавычки) со стандартным выводом команды, удаляя последовательности одного или нескольких символов в конце замены. Встроенные символы до конца вывода не должны быть удалены; однако, их можно рассматривать как разделители полей и устранить во время полевого разделения, в зависимости от значения IFS и заключения в кавычки, которое является в действительности. Если вывод содержит какие-либо пустые байты, поведение является неуказанным.
Так нормальное правило заключения в кавычки "$(...)"
только сохраняет незапаздывание новых строк.
Некоторые предложения для сохранения запаздывания новых строк даны в оболочке: продолжайте запаздывать новые строки ('\n') в замене команды
См. также При печати переменной, которая содержит новые строки, почему последняя новая строка разделяется? для обсуждения объяснения позади спецификации.