Salida de color inconsistente del comando `ls`

28

Enseño un curso de Introducción a UNIX / Linux en una universidad local y uno de mis alumnos hizo la siguiente pregunta:

¿Por qué algunos de los archivos en mi directorio son de color blanco y otros son grises? ¿Son los blancos los que creé hoy y los grises son archivos existentes?

Al LS_COLORSinvestigar esto, primero pensé que la respuesta estaría en la variable, pero una investigación adicional reveló que las listas de colores eran diferentes cuando se usaba el -linterruptor versus el -alinterruptor con el lscomando. Vea las siguientes capturas de pantalla:

usando ls -l el archivo llamado '3' se muestra como blanco

usando el modificador -al, el mismo archivo muestra un gris

El uso ls -ldel archivo llamado '3' se muestra en blanco, pero al usar el -alinterruptor, el mismo archivo muestra un gris.

¿Es esto un error en ls o alguien sabe por qué sucede esto?

Bill R
fuente
Escribe el título de tu pregunta: ese color no tiene nada que ver con el lscomando en sí.
Dibujó
FWIW, lo más cercano que puedes llegar a esto al jugar con LS_COLORS es LS_COLORS='rs=0;1' ls -l, pero se ve muy diferente.
wjandrea
44
@Drew Solo lo sabes después de investigar el problema. Obviamente lspuede cambiar el color de su salida.
tubería
@pipe: No, sé que desde mucho antes había color. No necesita proporcionar color, incluso si las versiones recientes de ls pueden proporcionar color. ;-)
Dibujó

Respuestas:

68

Parece que su prompt-string ( $PS1) está configurando el atributo en negrita en los caracteres para que los colores sean más agradables, y no lo desarma . El resultado de lsno sabe sobre esto, y se pone en negrita. Entonces, después de la primera salida de color ls, todo se ve más oscuro .

Thomas Dickey
fuente
1
Sí, eso fue todo. Último cambio de color en $ PS1 en negrita + blanco (1; 37) - ¡Gracias!
Bill R
3
Puede marcarlo como aceptado, entonces.
Thomas Dickey
0

Toda la salida de ls se imprimirá en el último color activo . Si lsse llama sin color:

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

imprimirá la lista de archivos en rojo .

O, si no se necesita un cambio de color para ls, el último color permanecerá:

$ 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

Aún así, todo en rojo.

Pero, tan pronto como sea lsnecesario establecer un color (y luego restablecer los colores a los valores predeterminados utilizados por la consola), el color utilizado a partir de ese momento será el predeterminado de la consola.

$ 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 las primeras tres líneas (hasta el punto azul) impresas en rojo.

Isaac
fuente