2014-05-02 24 views
7

Perché c'è una differenza nell'uscita tra questi due comandi:Perché `ls | cat`! = `ls`?

ls | cat 

ls 

Il primo sembra separare nomi di file con una nuova riga.

Questo vale anche per i comandi suc ha ls > outfile e cose simili.

Sono su Mac OSX, se questo fa alcuna differenza.

risposta

10

Il comando ls controlla il tipo di file del suo output standard. Se rileva un "tty", emette un output a più colonne. Se rileva qualsiasi altro tipo di file (come un file disco o una pipe), emette un singolo output di colonna.

Tty è l'abbreviazione di teletype. Ai vecchi tempi, si usava un teletipo reale per interagire con un sistema Unix. Quindi se l'output standard era un teletype, ls produrrebbe un output ottimizzato per gli esseri umani. Altrimenti, produrrebbe un output ottimizzato per i programmi.

Con l'avvento di altri modi per eseguire una shell interattiva, come sessioni telnet e sistemi di finestre, gli autori di Unix hanno creato lo pseudo-teletype, o "pty", un "dispositivo" solo software che finge di essere un teletype . Un programma (come il server telnet, il server ssh o la finestra del terminale) può usare un pty per fare in modo che un altro programma (la shell) pensi che stia parlando con un teletype.

È possibile utilizzare il flag -C per forzare ls per emettere l'output a più colonne. È possibile utilizzare il flag -1 (cifra uno) per forzare l'output di una singola colonna.

+1

+1, ma penso che intendessi che '-1', non' -x', forza l'output di _single_-column; '-x' produce ancora l'output _multi_-column, ma" con le voci ordinate trasversalmente, piuttosto che in basso, le colonne ". - http://man.cx/ls – mklement0

+0

@ mklement0 Grazie. Ho corretto la mia risposta. –