¿Cuál es el separador mágico entre nombres de archivo en la salida ls?

20

La salida de ls(sin argumentos) parece separar los nombres de archivo con saltos de línea.

Evidencia:

  • ls | grep foofunciona como se espera, con el greptratamiento de cada nombre de archivo como una línea de entrada separada.

  • ls > files.txt; vim files.txt -> en Vim, cada archivo está en una línea separada

Y, sin embargo, en la terminal, la salida de lspone múltiples archivos en una línea, separando los nombres de los archivos con espacios para formar columnas bien alineadas:

$ ls
a.txt  b.txt  c.txt

Entonces mi pregunta es, ¿cómo hace esto?

¿Está usando algún carácter de control especial para 'falsificar' una nueva línea? ¿O sabe cuándo su salida se canaliza a otro comando y formatea su salida de manera diferente en este caso?

Chris B
fuente

Respuestas:

24

¿O sabe cuándo su salida se canaliza a otro comando y formatea su salida de manera diferente en este caso?

Si. Del manual completo (disponible info lssi la documentación está instalada):

Si la salida estándar es una terminal, la salida está en columnas (ordenadas verticalmente) y los caracteres de control se muestran como signos de interrogación; de lo contrario, la salida aparece una por línea y los caracteres de control se muestran tal cual.

Si le gusta la salida de una columna, puede ejecutar

ls -1

para ponerlo en la terminal también.

Daniel Andersson
fuente
77
Específicamente, la función se lsutiliza para determinar si la salida es o no un terminal isatty(3).
Blrfl
También algo relacionado, si uno quiere probar esto en un simple script de shell, puede ejecutar tty -sy verificar su estado de retorno.
Daniel Andersson
10

lslo detecta cuando canaliza su salida. Puedes verlo en la documentación:

Si la salida estándar es una terminal, la salida está en columnas (ordenadas verticalmente) y los caracteres de control se muestran como signos de interrogación; de lo contrario, la salida aparece una por línea y los caracteres de control se muestran tal cual.

Si desea que cada archivo en la salida se coloque en una línea separada independientemente de la redirección de la tubería, puede usar

ls -1
MilanorTSW
fuente