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

28

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 la LS_COLORSvariable, mais une enquête plus approfondie a révélé que les listes de couleurs étaient différentes lors de l'utilisation du -lcommutateur par rapport au -alcommutateur avec la lscommande. Voir les captures d'écran suivantes:

en utilisant ls -l le fichier nommé '3' apparaît en blanc

en utilisant le commutateur -al le même fichier montre un gris

L'utilisation ls -ldu fichier nommé «3» apparaît en blanc mais en utilisant le -alcommutateur, le même fichier affiche un gris.

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

Bill R
la source
Par rapport au titre de votre question: une telle coloration n'a rien à voir avec la lscommande elle-même.
Drew
FWIW, le plus proche que vous pouvez obtenir en jouant avec LS_COLORS est LS_COLORS='rs=0;1' ls -l, mais cela semble très différent.
wjandrea
4
@Drew Vous savez seulement qu'après avoir enquêté sur le problème. Évidemment, lspeut changer la couleur de sa sortie.
pipe
@pipe: Non, je sais que bien avant la couleur. Il n'a pas besoin de fournir de couleur, même si les versions récentes de ls peuvent fournir de la couleur. ;-)
Drew

Réponses:

68

Il semble que votre prompt-string ( $PS1) définit l'attribut bold sur les caractères pour rendre les couleurs plus agréables et ne les désactive pas. La sortie de lsne sait pas à ce sujet et n'est pas définie en gras. Donc, après la première sortie couleur de ls, tout semble plus sombre .

Thomas Dickey
la source
1
Oui, c'était ça. Dernier changement de couleur en $ PS1 mis en gras + blanc (1; 37) - Merci!
Bill R
3
Vous pouvez alors le marquer comme accepté.
Thomas Dickey
0

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

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

imprimera 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 qu'il lsfaut définir une couleur (puis réinitialiser les couleurs à la valeur par défaut utilisée par la console), la couleur utilisée à partir de ce moment sera la valeur par défaut de la 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

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

Isaac
la source