Ele lê por linha, mas você esqueceu de citar ${x[@]} , o que significa que o operador split + glob foi aplicado a ele.
readarray x < <(ls -la)
printf %s "${x[@]}"
Ou para remover o último caractere de nova linha de cada uma dessas linhas:
readarray -t x < <(ls -la)
printf 'line: %s\n' "${x[@]}"
Ou usando o operador split + glob :
IFS=$'\n' # split on newline
set -o noglob
x=($(ls -la))
(ao contrário de readarray -rt , esse método remove linhas vazias embora (improvável embora não impossível de ocorrer na saída de ls -la ))
Se você quiser ter a lista de nomes de arquivos (incluindo os ocultos) sem as outras informações de ls -l , prefira usar:
shopt -s nullglob dotglob
x=(*)
Ao contrário de ls -a , não inclui . nem .. . Se você realmente quisesse, você faria:
shopt -s nullglob
x=(.* *)