Existem dois problemas independentes decorrentes desta questão.
-
O comando
ls
é construído para agir de maneira diferente quando grava no terminal e quando grava em um arquivo ou pipe. Você pode ver isso comparando esses dois comandosls ls | cat
No primeiro exemplo,
ls
pode ver que está gravando no terminal e, portanto, formata sua saída para um leitor humano. No segundo exemplo,ls
pode ver que está gravando em um arquivo ou pipe e, portanto, produz uma entrada por linha. Você pode substituir as duas configurações pelos argumentos-1
ou-C
. -
Quando você atribui
ls -l
a uma variável, as novas linhas são mantidas. No entanto, no seu caso, você não está citando a variável quando a usa, de modo que cada execução de "espaço em branco" (tudo o que não imprime caracteres visíveis) é convertido em espaço único. Compare estes resultadosvar=$(ls -l); echo $var var=$(ls -l); echo "$var"
Consulte $ VAR vs $ {VAR } e para citar ou não citar para mais detalhes. Observe também que usei $(...)
em preferência a '...'
. A resposta duplicada sugerida, compreensão do backtick explica por quê.