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?

Bill R.
źródło
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.

Thomas Dickey
źródło
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.

Izaak
źródło