ls
verifica se l'output sta andando a un terminale. Se l'output non sta andando a un terminale, allora -1
è l'impostazione predefinita. (Questo può essere sovrascritto da uno dei -C
, -m
o -x
opzioni.)
Pertanto, quando ls
viene utilizzato in una pipeline e non è stato ignorato con un'altra opzione, ls
verrà utilizzato -1
. Puoi fare affidamento su questo perché questo comportamento è richiesto da POSIX
Specifica POSIX
POSIX richiede -1
come predefinito ogni volta che l'output non sta andando su un terminale:
Le specifiche POSIX :
Il formato predefinito è quello di elencare una voce per riga nell'output standard; le eccezioni sono ai terminali o quando viene specificata una delle opzioni -C, -m o -x. Se l'output è su un terminale, il formato è definito dall'implementazione.
Queste tre opzioni che sovrascrivono il formato predefinito a colonna singola sono:
-C
Scrive l'output di più colonne di testo con le voci ordinate in basso nelle colonne, secondo la sequenza di confronto. Il numero di colonne di testo e i caratteri di separazione delle colonne non sono specificati, ma devono essere adattati alla natura del dispositivo di output. Questa opzione disabilita l'output di formato lungo.
-m
Formato di output dello stream; elenca i percorsi nella pagina, separati da un carattere <comma> seguito da un carattere <spazio>. Utilizzare un carattere <newline> come terminatore di elenco e dopo la sequenza di separazione quando non vi è spazio su una riga per la voce di elenco successiva. Questa opzione disabilita l'output di formato lungo.
-x
Lo stesso di -C, tranne per il fatto che l'output di più colonne di testo viene prodotto con voci ordinate attraverso, anziché verso il basso, le colonne. Questa opzione disabilita l'output di formato lungo.
Documentazione GNU
Dal manuale di GNU :
'-1'
'--format = single-column'
Elenca un file per riga. Questo è il valore predefinito per ls quando l'output standard non è un terminale . Vedi anche le opzioni -b e -q per sopprimere l'output diretto di caratteri di nuova riga all'interno di un nome file. [Enfasi aggiunta]
Esempi
Creiamo tre file:
$ touch file{1..3}
Quando l'output arriva a un terminale, GNU ls
sceglie di usare un formato multi-colonna:
$ ls
file1 file2 file3
Quando l'output arriva a una pipeline, le specifiche POSIX richiedono che la colonna singola sia l'impostazione predefinita:
$ ls | cat
file1
file2
file3
Le tre eccezioni che sovrascrivono il comportamento predefinito a colonna singola sono -m
per la virgola separata, -C
per le colonne ordinate in basso e -x
per le colonne ordinate in:
$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1 file2 file3
$ ls -x | cat
file1 file2 file3
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(rilascia il. * se non vuoi contarli). oppure:ls -1d ./.* ./* | grep '^\./' | wc -l
(poiché i nomi dei file non possono contenere '/')