¿Qué causa este fondo verde en la salida de ls?

141

captura de pantalla de la salida ls en la máquina Linux

Hay dos directorios mostrados por 'ls'. Normalmente los directorios en cualquier lugar son de color azul sobre fondo negro. Pero el primero es azul sobre verde e imposible de leer. ¿Por qué es esto? ¿Cómo hacer que sea azul sobre negro, o al menos algo claro sobre algo oscuro?

Esto está en Ubuntu 12.04, usando bash en Gnome Terminal. En Konsole, el azul es ligeramente más oscuro y es posible leerlo, aunque podría ser mucho mejor.

DarenW
fuente

Respuestas:

162

Además de colorear archivos basados ​​en su tipo (turquesa para archivos de audio, rojo brillante para Archivos y archivos comprimidos, y púrpura para imágenes y videos), lstambién colorea archivos y directorios en función de sus atributos:

  • El texto negro con fondo verde indica que un directorio puede ser escrito por otros, aparte del usuario propietario y el grupo, y tiene el bit fijo establecido ( o+w, +t).
  • El texto azul con fondo verde indica que un directorio puede ser escrito por otros, aparte del usuario propietario y el grupo, y no tiene el bit fijo establecido ( o+w, -t).

Stephano Palazzo en Ask Ubuntu ha hecho esta imagen muy instructiva sobre los diferentes colores de atributos:

¿Qué significan los diferentes colores en la terminal?

Como señaló Terdon , la configuración de color se puede modificar a través de dircolors. Se puede acceder a una lista de las diferentes configuraciones de coloración dircolors --print-database.

Cada línea de salida, como BLK 40;33;01, tiene la forma:

[TARGET] [TEXT_STYLE];[FOREGROUND_COLOR];[BACKGROUND_COLOR]
  • TARGET indica el objetivo para la regla de colorear

  • TEXT_STYLE indica el estilo del texto:

    • 00 = ninguno
    • 01 = negrita
    • 04 = subrayado
    • 05 = parpadeo
    • 07 = reverso,
    • 08 = oculto
  • FOREGROUND_COLOR indica el color de primer plano:

    • 30 = negro
    • 31 = rojo
    • 32 = verde
    • 33 = amarillo
    • 34 = azul,
    • 35 = magenta
    • 36 = cian
    • 37 = blanco
  • BACKGROUND_COLOR indica los colores de fondo:

    • 40 = negro
    • 41 = rojo
    • 42 = verde
    • 43 = amarillo
    • 44 = azul,
    • 45 = magenta
    • 46 = cian
    • 47 = blanco

Los campos pueden omitirse comenzando desde la derecha, por lo que, por ejemplo, .tar 01;31significa negrita y rojo.

XTerm y la mayoría de los emuladores de terminales modernos admiten 256 colores.

Un código de color de primer plano XTerm de 256 colores tiene la forma:

38;5;[FOREGROUND_COLOR]

Un código de color de fondo XTerm de 256 colores tiene la forma:

48;5;[BACKGROUND_COLOR]

donde ambos FOREGROUND_COLORy BACKGROUND_COLORes un número del rango 0-255. En la siguiente captura de pantalla se muestra una lista completa de códigos de color para los modos de color 16 y 256:

16 y 256 códigos de color de modo de color

Thomas Nyman
fuente
55
Los códigos BACKGROUND_COLOR no son lo mismo que FOREGROUND_COLOR; Los códigos de fondo son 40-47
Ryan V. Bissell
38;5;inicia un código de color de primer plano xterm de 256 colores. 48;5;inicia un código de color de fondo xterm de 256 colores. Cian en mi salida de dircolors 38;5;51 no es 36aunque el resultado sea el mismo.
stevesliva
1
@stevesliva: Gracias por tu comentario. He editado la respuesta para indicar los códigos de color de fondo correctamente y describir los códigos de color de primer plano y fondo de 256 colores.
Thomas Nyman
55

Los colores de lspueden representar los permisos, los valores predeterminados para algunos sistemas son mostrar directorios donde todos tienen permisos de escritura con un fondo verde:

ingrese la descripción de la imagen aquí

Puede cambiar los colores editando su $LS_COLORSvariable usando dircolors(desde man ls):

   Using color to distinguish file types is disabled both by  default  and
   with  --color=never.  With --color=auto, ls emits color codes only when
   standard output is connected to a terminal.  The LS_COLORS  environment
   variable can change the settings.  Use the dircolors command to set it.

La sintaxis es ciertamente un poco molesta aquí, pero puede cambiar este color creando un archivo con los colores que desee y guardándolo como ~/.dircolors:

dircolors -p > ~/.dircolors

Ese comando imprimirá los valores predeterminados en ~/.dircolors. Luego deberá editar ese archivo y cambiar esta línea:

OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky

Por ejemplo, para convertirlo en texto negro sobre un fondo rojo (vea aquí una lista de códigos de color):

OTHER_WRITABLE 30;41 # dir that is other-writable (o+w) and not sticky

No necesita tener todos los valores predeterminados, también puede crear un archivo con una sola línea, redefiniendo solo el que desea cambiar. De todos modos, una vez que haya creado el archivo, cárguelo con:

eval "$(dircolors ~/.dircolors)";

Y aquí está en acción:

ingrese la descripción de la imagen aquí

Para que eso suceda automáticamente, agregue el evalcomando anterior a su ~/.bashrcarchivo.

terdon
fuente
8
Los colores predeterminados a menudo parecen indicar que el autor original nos odia a nosotros y a nuestros ojos ...
kurtm
1
Gracias. ¿POR QUÉ a veces escribes ~ / .dirname, y a veces ~ / dircolors, y a veces ~ / .dircolors? se supone que son lo mismo?
Tim
Gracias. ¿Por qué en eval "$(dircolors ~/dircolors)";lugar de una forma más directa como dircolors ~/dircolors?
Tim
@Tim debido a que dircolors solo imprime la configuración, debe evaluarla para poder leerla.
terdon
para que sean leídos por quien?
Tim
11

Si bien todas las respuestas técnicas son ciertas, consideraría un poco una advertencia informal, que dispensaba un poco los derechos generosamente o copiaba criss + cross ... (a menudo todos lo hacemos, para que las cosas funcionen inicialmente, eh ?)

¿Cómo hacerlo azul sobre negro, ...?

Un buen "de-más verde" para volver a los derechos que probablemente desee, es esta declaración:

chmod -R a-x,o-w,+X thatGreenFolderWithSubfolders/

Comprenda mejor lo que hace, si comprende el propósito de mayúsculas + X "ejecución especial", es decir, consulte Wikipedia

Solo es realmente útil cuando se usa con '+' y generalmente en combinación con la opción -R para dar acceso grupal u otro a un gran árbol de directorios sin configurar el permiso de ejecución en archivos normales (como archivos de texto), lo que normalmente sucedería si acabas de usar "chmod -R a + rx ...

Frank Nocke
fuente
8

Tuve la misma pregunta, la respuesta de terdon es agradable, pero creo que hay una confusión entre dirname y dircolors.

De todos modos, después de algunas investigaciones adicionales, podría cambiar los colores, así que estoy compartiendo mi solución aquí. ¡Puede ser útil para alguien algún día!

Entonces, 3 pasos simples:

Primero, como dijo terdon, copie los colores predeterminados en un archivo

dircolors -p > ~/.dircolors

Luego modifique este archivo. Puede encontrar algunos valores para los colores en el interior, pero encontré más aquí :)

Y finalmente, agregue la siguiente línea a su ~/.bashrcarchivo para que los colores se carguen automáticamente cuando abra un terminal:

eval 'dircolors ~/.dircolors' > /dev/null

Voilà :)

KevinG
fuente
1
de ~/.zshrcque tenía que ir con if [[ -f ~/.dircolors ]] ; then eval $(dircolors -b ~/.dircolors) elif [[ -f /etc/DIR_COLORS ]] ; then eval $(dircolors -b /etc/DIR_COLORS) fi. Lo siento, el salto de línea es terrible
Eric D. Johnson
2

Para solucionar rápidamente el problema (haga que los archivos que se pueden escribir sean amarillos en nobg):

LS_COLORS+=':ow=01;33'

Reemplace 33por 34azul en nobg. Aún más simple, para que sea nofg en nobg:

LS_COLORS+=:ow=

Para que su cambio sea permanente, agréguelo a su perfil.

echo "export LS_COLORS+=':ow=01;33'" >> ~/.profile

Para ver las reglas no relacionadas con la extensión de LS_COLORS:

echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'

sedcoloca cada regla en una línea y grepelimina las reglas comenzando por*.'.


Para explorar los lscolores en su terminal, considere usar

C="$LS_COLORS"
function sc () {
    echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'
}
function t () {
    ls /mnt # Or the path to your example directory.
}

Entonces

LS_COLORS="$C:ow=38;5;250;48;5;025";t

Como se indicó en otra respuesta (la de Thomas Nyman), 38;5;es el prefijo para el término x de 256 colores en primer plano y para el término x de 256 colores 48;5;en segundo plano. Sin embargo, todos los terminales no admiten 256 colores.

También vea -¿Qué significan los diferentes colores en ls? - en AskUbuntu.

loxaxs
fuente
1

Bueno, esto significa que esta carpeta tiene permisos si ejecuta esto:

сhmod og-w AU_LI

eliminará bgcolor :)

Gorodeckij Dimitrij
fuente
0

Para solucionar este problema, pruebe el parámetro ow sobre LS_COLORS

Por ejemplo:

~LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.zip=33:*.tgz=33'
~ls -l

ingrese la descripción de la imagen aquí

Ahora agregas la opción ow

~export LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.zip=33:*.tgz=33:ow=0'
~ls -l

ingrese la descripción de la imagen aquí

PYK
fuente
0

Puede cambiar el tono de verde en Putty para que el texto sea legible.

Abra Putty y vaya a Window \ Colors, seleccione "ANSI Green", configúrelo en un verde más oscuro (R: 0 G: 70 B: 0).

Erhan Alankus
fuente