web-dev-qa-db-fra.com

Sortie de couleur incohérente de la commande `ls`

J'enseigne un cours d'introduction à UNIX/Linux dans un collège local et l'un de mes étudiants a posé la question suivante:

Pourquoi certains fichiers de mon répertoire sont-ils blancs et d'autres gris? Les blancs sont-ils ceux que j'ai créés aujourd'hui et les gris sont des fichiers existants?

En examinant cela, j'ai d'abord pensé que la réponse serait dans le LS_COLORS variable, mais une enquête plus approfondie a révélé que les listes de couleurs étaient différentes lors de l'utilisation de -l interrupteur contre -al basculez avec la commande ls. Voir les captures d'écran suivantes:

using ls -l the file named '3' shows as white

using the -al switch the same file shows a gray

En utilisant ls -l le fichier nommé '3' apparaît en blanc mais en utilisant le -al changer le même fichier montre un gris.

Est-ce un bug dans ls ou quelqu'un sait-il pourquoi cela se produit?

28
Bill R

Il semble que votre chaîne d'invite ($PS1) définit l'attribut bold sur les caractères pour rendre les couleurs plus agréables, et non désarmant . La sortie de ls ne sait rien à ce sujet, et le fait non mis en gras. Ainsi, après la première sortie couleur de ls, tout semble plus sombre.

68
Thomas Dickey

La sortie entière de ls sera imprimée dans la dernière couleur active. Si ls est appelé sans couleur:

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

affichera la liste des fichiers en rouge.

Ou, si aucun changement de couleur n'est nécessaire pour ls, la dernière couleur restera:

$ 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

Pourtant, tout en rouge.

Mais, dès que ls doit définir une couleur (puis réinitialiser les couleurs à celles par défaut utilisées par la console), la couleur utilisée à partir de ce moment sera la console par défaut.

$ 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

Avec les trois premières lignes (jusqu'au point bleu) imprimées en rouge.

0
Isaac