2014-05-24 12 views
5

Solo per curiosità, questo è un comportamento di normale ls del previsto:Perché `ls` elenca più file per riga, ma` ls pipe/redirect` elenca solo 1 file per riga?

[email protected]:~$ ls 
Codes Documents Music Pictures Templates 
Desktop Downloads Papers Public Videos 

Ma quando uso ls con tubo/reindirizzamento, si comportano come ls -1:

[email protected]:~$ ls | cat 
Codes 
Desktop 
Documents 
Downloads 
Music 
Papers 
Pictures 
Public 
Templates 
Videos 

Perché? (e come scrivere un programma simile che dà un output diverso tra stdout e pipe come questo?)


P.S. Ho anche impostare alias l='ls -F', e questa volta il tubo/reindirizzamento non è più ls -1 stile:

[email protected]:~$ l | cat 
Codes/ Documents/ Music/ Pictures/ Templates/ 
Desktop/ Downloads/ Papers/ Public/ Videos/ 

Senza utilizzare l'alias, lo fa il comando in ls -1 stile, però:

$ ls -F | cat 
Codes/ 
Desktop/ 
Documents/ 
Downloads/ 
Music/ 
Papers/ 
Pictures/ 
Public/ 
Templates/ 
Videos/ 
+1

invoke 'informazioni coreutils' nel terminale. –

risposta

6

È possibile controllare questo linea dalla source:

if (format == long_format) 
    format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line); 

Si utilizza la funzione isatty per controllare se stdout punta a un tty e per stampare many_per_line se lo fa o in caso contrario.

2

Ecco come GNU ls fa (ls.c): Generale formatting'` uscita

if (isatty (STDOUT_FILENO)) 
    { 
     format = many_per_line; 
    } 
    else 
    { 
     format = one_per_line; 
    } 
Problemi correlati