¿Por qué echo `ls -l` no tiene nuevas líneas?

¿Por qué echo `ls -l` no tiene nuevas líneas?

Estoy ejecutando WSL (Subsistema de Windows para Linux) y cuando uso la ls -lfunción en la terminal, se imprimen nuevas líneas, es decir, cada archivo está en una nueva línea, por ejemplo:

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

Sin embargo, cuando uso echo `ls -l` > file1.txt, tiene lo mismo que ls -lnormalmente pero todo en una línea, donde cada línea está separada por espacios y no por líneas nuevas, por ejemplo:

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

Tenga en cuenta que tengo estos alias relevantes:

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

Respuesta1

Citando!!

Cuando ejecuta ls -l, sí, genera nuevas líneas (según informa). Sin embargo , cuando lo hace, echo `ls -l` ,no se ven nuevas líneas. Intentalo.

La razón es que una `...`construcción es una expansión de comando, y la mayoría de las expansiones (hay otras) se ven afectadas por la división del shell (cuando no se cita). La división de Shell elimina cualquiera de los caracteres de la variable IFS, que, de forma predeterminada, contiene <space><tab><newline>. Todas las nuevas líneas ls -lse eliminan y la cadena se divide en ese punto. Posteriormente, echoconsigue unir cada parte dividida separándolas con un solo espacio.

Entonces, sí, tanto el antiguo como el correcto y preferido en cualquier momento el nuevo:

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

Enumerará los archivos en el directorio actual en una cadena sin nuevas líneas si IFS es el predeterminado.

Al redirigir esa cadena a un archivo, se escribirá una cadena en ese archivo, como debería esperarse.

echo $(ls -l) > file

Para conservar las nuevas líneas, cite la expansión:

echo "$(ls -l)"

O evite utilizar el obsoleto `...`:

echo "`ls -l`"

Y para obtener el resultado en un archivo, simplemente rediríjalo al archivo:

echo "$(ls -l)" > file

información relacionada