Niespójne wyjście kolorów z polecenia `ls`


28

Uczę wprowadzenie do UNIX / Linux w lokalnej szkole, a jeden z moich studentów zadał następujące pytanie:

Dlaczego niektóre pliki w moim katalogu są białe, a inne są szare? Czy białe są tymi, które dzisiaj stworzyłem, a szare są plikami istniejącymi?

Przyglądając się temu, po raz pierwszy pomyślałem, że odpowiedź będzie w LS_COLORSzmiennej, ale dalsze dochodzenie ujawniło, że listy kolorów były różne, gdy używałeś -lprzełącznika w porównaniu z -alprzełącznikiem z lspoleceniem. Zobacz następujące zrzuty ekranu:

używając ls -l plik o nazwie „3” pokazuje się jako biały

przy użyciu przełącznika -al ten sam plik pokazuje szary

Użycie ls -lpliku o nazwie „3” pokazuje się jako biały, ale przy użyciu -alprzełącznika ten sam plik pokazuje szary.

Czy to błąd w ls, czy ktoś wie, dlaczego tak się dzieje?


Wpisz tytuł pytania: takie kolorowanie nie ma nic wspólnego z samym lspoleceniem.
Drew

FWIW, najbliżej można się do tego dostać, mieszając się z LS_COLORS LS_COLORS='rs=0;1' ls -l, ale wygląda to zupełnie inaczej.
wjandrea

4
@Drew Wiesz to dopiero po zbadaniu problemu. Oczywiście lsmoże zmienić kolor swoich wyników.
rura

@pipe: Nie, wiem o tym na długo przed pojawieniem się koloru. Nie musi zapewniać koloru, nawet jeśli najnowsze wersje ls mogą zapewniać kolor. ;-)
Drew

Odpowiedzi:


68

Wygląda na to, że twoja zachęta-ciąg ( $PS1) ustawia pogrubiony atrybut znaków, aby kolory były ładniejsze, a nie go rozbraja . Wyjście ze lsnie wie o tym, a nie wyłączony pogrubione. Więc po wydrukowaniu pierwszego koloru lswszystko wygląda na przyciemnione.


1
Tak, to było to. Ostatnia zmiana koloru w zestawie $ PS1 pogrubiona + biała (1; 37) - Dzięki!
Bill R

3
Możesz więc oznaczyć to jako zaakceptowane.
Thomas Dickey

0

Całe wyjście ls zostanie wydrukowane w ostatnim aktywnym kolorze. Jeśli lswywoływany jest bez koloru:

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

wydrukuje listę plików na czerwono .

Lub, jeśli nie ma potrzeby zmiany koloru dla ls, ostatni kolor pozostanie:

$ 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

Mimo to wszystko na czerwono.

Ale gdy tylko lstrzeba ustawić kolor (a następnie zresetować kolory do domyślnych używanych przez konsolę), od tej pory kolor będzie domyślny w konsoli.

$ 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

Z pierwszymi trzema liniami (aż do niebieskiej kropki) wydrukowanymi na czerwono.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.