Ter um literal \n
get alterado para uma nova linha não é sobre a divisão de palavras, mas echo
processando a barra invertida. Algumas versões de echo
fazem isso, outras não ... O echo
do Bash não processa escape de barra invertida por padrão (sem a opção -e
flag ou xpg_echo
), mas, por exemplo, as versões de dash e Zsh de echo
do.
$ cat test.txt
hello\nworld
$ bash -c 'echo "$(cat test.txt)"'
hello\nworld
$ zsh -c 'echo "$(cat test.txt)"'
hello
world
Use printf
:
$ bash -c 'printf "%s\n" "$(cat test.txt)"'
hello\nworld
$ zsh -c 'printf "%s\n" "$(cat test.txt)"'
hello\nworld
Veja também: Por que o printf é melhor que o eco?
Independentemente disso, você deve colocar as aspas ao redor da substituição do comando para evitar a divisão de palavras e globbing em shells semelhantes a sh. (zsh só faz a divisão de palavras (não globbing) após a substituição de comando (não sobre o parâmetro ou expansões aritméticas), exceto no modo sh.)