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?


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 .


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.