Por que echo `ls -l` não possui novas linhas?

Por que echo `ls -l` não possui novas linhas?

Estou executando o WSL (Windows Subsystem for Linux) e quando uso a ls -lfunção no terminal, recebo novas linhas impressas, ou seja, cada arquivo está em uma nova linha, por exemplo:

total 12K
drwxrwxrwx 1 user user 4.0K Apr  4 23:28 .
drwxr-xr-x 1 user user 4.0K Apr  4 23:28 ..
-rw-rw-rw- 1 user user    0 Mar 28 01:03 a1.file
-rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml
-rw-rw-rw- 1 user user    0 Mar 13 00:19 file1
-rw-rw-rw- 1 user user  513 Mar 13 00:19 file2.txt
-rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt
-rw-rw-rw- 1 user user  405 Apr  4 23:26 ls_l.txt
-rw-rw-rw- 1 user user    0 Apr  4 23:28 ls_l2.txt
-rw-rw-rw- 1 user user   89 Mar 13 00:18 pattern
-rw-rw-rw- 1 user user   86 Mar 28 01:41 somefile.file

Porém quando utilizo echo `ls -l` > file1.txt, tem a mesma coisa que ls -lnormalmente mas tudo em uma linha, onde cada linha é separada por espaços e não por novas linhas por exemplo:

total 12K drwxrwxrwx 1 user user 4.0K Mar 27 22:45 . drwxr-xr-x 1 user user 4.0K Mar 27 22:45 .. -rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml -rw-rw-rw- 1 user user 0 Mar 13 00:19 file1 -rw-rw-rw- 1 user user 513 Mar 13 00:19 file2.txt -rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt -rw-rw-rw- 1 user user 403 Mar 27 22:45 ls_l.txt -rw-rw-rw- 1 user user 89 Mar 13 00:18 pattern

Observe que tenho estes aliases relevantes:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls -lah'

Responder1

Citando !!

Quando você executa ls -l, sim, ele gera novas linhas (conforme você reporta). No entanto , quando você faz echo `ls -l` ,isso, não há novas linhas à vista. Tente.

A razão é que uma `...`construção é uma expansão de comando, e a maioria das expansões (há outras) são afetadas pela divisão do shell (quando não são citadas). A divisão do shell remove qualquer um dos caracteres da variável IFS, que, por padrão, contém <space><tab><newline>. Todas as novas linhas são ls -lremovidas e a string é dividida nesse ponto. Este último echoconsegue unir cada parte dividida separando-as com um único espaço.

Então, sim, ambos, o antigo e o correto e preferido a qualquer momento, novo:

echo `ls -l`
echo $(ls -l)

Listará os arquivos no diretório atual em uma string sem novas linhas se IFS for o padrão.

Redirecionar essa string para um arquivo gravará uma string nesse arquivo, como era de se esperar.

echo $(ls -l) > file

Para manter as novas linhas, cite a expansão:

echo "$(ls -l)"

Ou evite usar o obsoleto `...`:

echo "`ls -l`"

E para obter a saída em um arquivo, basta redirecioná-la para o arquivo:

echo "$(ls -l)" > file

informação relacionada