Несовместимый вывод цвета из команды `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

Похоже, что ваша prompt-string ( $PS1) устанавливает атрибут bold для символов, чтобы цвета были лучше, а не сбрасывал их. Вывод из lsне знает об этом, и не выделено жирным шрифтом. Так что после первого вывода цвета lsвсе выглядит тусклее.

Томас Дики
источник
1
Да, это было это. Последнее изменение цвета в наборе $ PS1 жирным шрифтом + белый (1; 37) - Спасибо!
Билл Р
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

Первые три строки (до синей точки) напечатаны красным.

Исаак
источник