Creo que puedo estar pasando por alto un punto relativamente fundamental con respecto a Shell. La salida del comando ls por defecto separa la salida con nuevas líneas, pero el shell muestra la salida en una sola línea.
¿Puede alguien explicarme esto? Siempre había supuesto que la salida estaba simplemente separada por espacios, pero ahora que veo la salida separada por nuevas líneas, esperaría que la salida se muestre en líneas separadas.
Ejemplo:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
od muestra que la salida está separada por nuevas líneas:
cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000 t e x t 1 \n t e x t 2 \n t e x t
0000020 3 \n
0000022
Si hay nuevas líneas, entonces ¿por qué la salida no se muestra como:
text1
text2
text3
ls
. Es útil, pero es claramente inconsistente y sorprendente. Pero tenga en cuenta que algunos comandos que producen resultados en color eliminarán los colores cuando se canalicen también.ls
siempre imprime uno por línea ylc
siempre imprime en columnas.dpkg -l
usará todo el ancho de la pantalla, pero si se imprime en una tubería, se supone que el terminal tiene 80 columnas de ancho , y abrevia la salida para que se ajuste si es necesario.Su descubrimiento destaca la razón principal por la que analizar la salida de
ls
siempre es una mala idea. Vea la wiki de Greg para una explicación completa .Piensa en tu problema a la inversa. Notó que ls a veces imprime y a veces no imprime nuevas líneas entre su salida. Para usar en scripts o cuando la
-1
bandera lo fuerza , lo hace. Una nueva línea al final de cada archivo. Lo que no hay garantía de que cada nueva línea represente un nuevo nombre de archivo . De hecho, si un nombre de archivo contiene una nueva línea en sí, la salida de ls será absolutamente irreparable. Considere estos nombres de archivo:Cuando tienes
ls -1
un directorio con eso, obtienes algo que se ve así:¿No asumirías naturalmente que había cuatro archivos? También lo haría cualquier script que analice la salida de ls. En realidad, hay tres archivos, uno de ellos con un nombre complicado, pero no podrá resolverlo a partir de la salida de ls. *
* A menos que estuvieras usando la
-l
bandera y notaras que la salida estaba borrada, pero tus scripts aún se ahogarían.fuente
ls
, la-b
opción puede ayudar. Convierte la nueva línea en\n
, etc.