2014-05-24 10 views
5

prostu ciekawi, to jest normalne, oczekiwane zachowanie ls:Dlaczego `ls` listy wielu plików w wierszu, ale` ls pipe/redirect` listy tylko 1 plik w wierszu?

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

Ale gdy używam ls z rurą/przekierowania, to zachowują się jak ls -1:

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

Dlaczego? (i jak napisać taki program, który daje różnicę na wyjściu między stdout a rurą taką jak ta?)


P.S. Ja również ustawić alias l='ls -F' i tym razem rura/przekierowanie nie jest już ls -1 styl:

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

Bez użycia aliasu, robi polecenie w ls -1 stylu, jednakże:

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

powołać '| Informacje Coreutils” w terminalu. –

Odpowiedz

6

Można to sprawdzić linia z source:

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

wykorzystuje funkcję isatty aby sprawdzić, czy stdout wskazuje na tty i wydrukuje many_per_line, jeśli tak się stanie lub one_per_line, jeśli nie.

2

Oto jak robi to GNU ls (ls.c): Ogólne formatting'` wyjściowy

if (isatty (STDOUT_FILENO)) 
    { 
     format = many_per_line; 
    } 
    else 
    { 
     format = one_per_line; 
    } 
Powiązane problemy