Cite a variável:
echo "$z"
Sem aspas, cada palavra em $z se torna um argumento separado para echo , com aspas a variável inteira é um único argumento - newlines e all.
Se eu fizer z='ls' e, em seguida, echo $z , ele irá imprimir o diretório listado, mas sem novas linhas ou formatação. Eu suponho que a falta de formatação colorida é impossível de contornar, mas seria possível obtê-lo com as novas linhas lá?
Você pode obter cores dizendo
z=$(ls --color)
ou, para ser explícito,
x=$(ls --color=always)
$(command) é (essencialmente) equivalente a 'command' ;
consulte Qual é o benefício de usar $ () em vez de backticks em scripts de shell?
O padrão de ls é --color=auto , o que significa usar cores somente ao gravar em um terminal
(isto é, quando a saída padrão é um terminal).
$(command) e 'command' executam o command com saída para um canal; --color=always diz a ls para usar cores, mesmo neste caso.
Você pode testar isso facilmente comparando
ls | cat
com
ls --color | cat