2011-12-21 15 views
8

impresión directamente al terminal:¿Por qué ls dar salida diferente al hilo

$ ls 
a.out avg.c avg.h 

tuberías a cat

$ ls | cat 
a.out 
avg.c 
avg.h 

¿Por qué ls dar una salida diferente basado en destino?

+0

Fwiw, considero que este comportamiento erróneo. La larga tradición de ser fácilmente capaz de hilvanar enormes tuberías de comandos se hace mucho más difícil cuando dichos comandos cambian su ouput cuando es enviado a diferentes lugares. – paxdiablo

Respuesta

6

ls realmente puede determinar si se está enviando a un terminal o un archivo (con la llamada a la biblioteca isatty). Si detecta una consola, intentará hacerla más compacta para facilitar la visualización.

+0

encontrar una página web: http://www.ginac.de/~kreckel/fileno – kev

6

ls se comporta de forma automática como ls -1 al hilo.

Esto es por lo general lo que quiere cuando se está de tuberías de ls a awk o algo por el estilo, ya que tratará la salida del ls sobre una base de línea por línea.

Para anular este comportamiento predeterminado, puede utilizar ls -C | cat.

+0

Además, no usa colores cuando se canaliza. Entonces, si quiere los códigos de escape coloridos, puede usar 'ls -C --color = yes | gato'. Puede ser útil con 'ls -C --color = yes | menos -R' –

1

para que cada línea es sólo una entrada, permitiendo que el comando de la salida se conduce a trabajar como probablemente sería de esperar. Por ejemplo (dada su salida ls), la siguiente probablemente no sería lo que quiere:

$ ls | sort -r 
a.out avg.c avg.h 

Pero debido sort no sabía que había más de un elemento por línea, que no podía hacer nada. Compare esto con lo que realmente ocurre:

$ ls | sort -r 
avg.h 
avg.c 
a.out 

Puede lograr el (inesperado) en primer lugar el comportamiento al pasar a -Cls.

Cuestiones relacionadas