Uscita di colore incoerente dal comando `ls`


28

Insegno a un corso di introduzione a UNIX / Linux in un college locale e uno dei miei studenti ha posto la seguente domanda:

Perché alcuni file nella mia directory sono colorati di bianco e altri sono grigi? I bianchi sono quelli che ho creato oggi e i grigi sono file esistenti?

Quando ho esaminato questo aspetto, ho prima pensato che la risposta sarebbe stata nella LS_COLORSvariabile, ma ulteriori indagini hanno rivelato che gli elenchi dei colori erano diversi quando si utilizza l' -lopzione rispetto -alall'opzione con il lscomando. Guarda le seguenti schermate:

usando ls -l il file chiamato '3' appare come bianco

usando l'opzione -al lo stesso file mostra un grigio

L'uso ls -ldel file denominato "3" viene visualizzato come bianco, ma utilizzando l' -alopzione lo stesso file mostra un grigio.

È un bug in ls o qualcuno sa perché questo sta accadendo?


Scritto il titolo della tua domanda: tale colorazione non ha nulla a che fare con il lscomando stesso.
Ha

FWIW, il più vicino che puoi raggiungere facendo un pasticcio con LS_COLORS è LS_COLORS='rs=0;1' ls -l, ma sembra molto diverso.
wjandrea,

4
@Drew Lo sai solo dopo aver esaminato il problema. Ovviamente lspuò cambiare il colore della sua uscita.
pipe l'

@pipe: Nah, lo so da molto prima che ci fosse il colore. Non è necessario fornire il colore, anche se le versioni recenti di ls possono fornire il colore. ;-)
Ha

Risposte:


68

Sembra che il tuo prompt-string ( $PS1) stia impostando l'attributo grassetto sui caratteri per rendere i colori più belli e non annullarli . L'output di lsnon ne è a conoscenza e non viene impostato in grassetto. Quindi, dopo la prima stampa a colori di ls, tutto sembra più scuro .


1
Sì, era quello. Ultimo cambio di colore in $ PS1 impostato in grassetto + bianco (1; 37) - Grazie!
Bill R

3
Quindi puoi contrassegnarlo come accettato.
Thomas Dickey,

0

L'intero output di ls verrà stampato nell'ultimo colore attivo . Se lsviene chiamato senza colore:

$ printf '\e[0;31m color test\n'; /bin/ls
 color test
filea  fileb  filec  filed  filee  filef  fileg  fileh

stamperà l'elenco dei file in rosso .

Oppure, se non è necessario cambiare colore per ls, l'ultimo colore rimarrà:

$ mkdir t1; cd t1; touch file{a..h}
$ printf '\e[0;31m color test\n'; /bin/ls --color -l
 color test
total 0
-rw-r--r-- 1 user user 0 Feb 23 01:16 filea
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user 0 Feb 23 01:16 filec
-rw-r--r-- 1 user user 0 Feb 23 01:16 filed
-rw-r--r-- 1 user user 0 Feb 23 01:16 filee
-rw-r--r-- 1 user user 0 Feb 23 01:16 filef
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileh

Comunque, tutto in rosso.

Ma, non appena è lsnecessario impostare un colore (e quindi ripristinare i colori sui valori predefiniti utilizzati dalla console), il colore utilizzato da quel momento in poi sarà il valore predefinito della console.

$ printf '\e[0;31m color test\n'; /bin/ls --color -la
 color test
total 8
drwxr-xr-x 2 user user 4096 Feb 23 01:16 .
drwxr-x--- 7 user user 4096 Feb 23 01:15 ..
-rw-r--r-- 1 user user    0 Feb 23 01:16 filea
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user    0 Feb 23 01:16 filec
-rw-r--r-- 1 user user    0 Feb 23 01:16 filed
-rw-r--r-- 1 user user    0 Feb 23 01:16 filee
-rw-r--r-- 1 user user    0 Feb 23 01:16 filef
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileh

Con le prime tre righe (fino al punto blu) stampate in rosso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.