Невідповідний кольоровий вихід з команди `ls`


28

Я викладаю курс вступу в UNIX / Linux в місцевому коледжі, і один із моїх студентів задав таке питання:

Чому деякі файли в моєму каталозі пофарбовані в білий колір, а інші - сірі? Чи є білі ті, які я створив сьогодні, а сірі - це існуючі файли?

Коли я переглянув це, я спершу подумав, що відповідь буде в LS_COLORSзмінній, але подальше дослідження показало, що списки кольорів відрізняються при використанні -lперемикача проти -alкоммутатора з lsкомандою. Дивіться наступні знімки екрана:

за допомогою ls -l файл з назвою "3" відображається як білий

за допомогою перемикача -al той самий файл показує сірий колір

Використання ls -lфайлу з назвою "3" показує білий колір, але за допомогою -alперемикача той самий файл показує сірий колір.

Це помилка в ls чи хтось знає, чому це відбувається?


Напишіть назву питання: таке фарбування не має нічого спільного з lsсамою командою.
Дрю

FWIW, найближче до цього можна дійти, возившись з LS_COLORS LS_COLORS='rs=0;1' ls -l, але це виглядає зовсім інакше.
wjandrea

4
@Drew Ви знаєте це лише після вивчення проблеми. Очевидно, lsможна змінити колір його виходу.
труба

@pipe: Ні, я знаю, що задовго до цього був колір. Він не повинен надати колір, навіть якщо останні версії ls можуть надавати колір. ;-)
Дрю

Відповіді:


68

Виглядає так, ніби ваш строковий рядок ( $PS1) встановлює жирний атрибут для символів, щоб зробити кольори приємнішими, а не зняти їх. Вихід lsне знає про це, і робить незадані жирним шрифтом. Тож після першого виходу кольорів lsусе виглядає тьмянішим.


1
Так, це було все. Остання зміна кольору в $ PS1 встановлена ​​жирним шрифтом + білим (1; 37) - Дякую!
Білл R

3
Ви можете відзначити його прийнятим.
Томас Дікі

0

Весь вихід ls буде надрукований в останньому активному кольорі. Якщо lsвикликається без кольору:

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

надрукує список файлів червоним кольором .

Або якщо для ls не потрібна зміна кольору, останній колір залишиться:

$ 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

Все-таки все в червоному кольорі.

Але, як тільки lsпотрібно встановити колір (а потім скинути кольори до типових параметрів, які використовує консоль), колір, який використовується з цього моменту, стане консольним за замовчуванням.

$ 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

Перші три рядки (до синьої точки) друкуються червоним кольором.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.