Estoy ejecutando WSL (Subsistema de Windows para Linux) y cuando uso la ls -l
funció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 -l
normalmente 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 -l
se eliminan y la cadena se divide en ese punto. Posteriormente, echo
consigue 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