Đầu ra màu không nhất quán từ lệnh `ls`


28

Tôi dạy một khóa giới thiệu về UNIX / Linux tại một trường đại học địa phương và một trong những học sinh của tôi đã hỏi câu hỏi sau:

Tại sao một số tệp trong thư mục của tôi có màu trắng và những tệp khác có màu xám? Có phải những cái màu trắng là những cái tôi tạo ra ngày hôm nay và màu xám là các tập tin hiện có?

Khi tôi nhìn vào điều này, đầu tiên tôi nghĩ rằng câu trả lời sẽ có trong LS_COLORSbiến, nhưng điều tra thêm cho thấy rằng danh sách màu khác nhau khi sử dụng công -ltắc so với công -altắc với lslệnh. Xem ảnh chụp màn hình sau:

sử dụng ls -l tệp có tên '3' hiển thị màu trắng

sử dụng chuyển đổi -al cùng một tệp cho thấy màu xám

Sử dụng ls -ltệp có tên '3' hiển thị màu trắng nhưng sử dụng công -altắc, cùng một tệp sẽ hiển thị màu xám.

Đây có phải là một lỗi trong ls hoặc có ai biết tại sao điều này xảy ra không?


Viết tiêu đề câu hỏi của bạn: màu như vậy không có gì để làm với lschính lệnh.
vẽ

FWIW, gần nhất bạn có thể nhận được điều này bằng cách nhắn tin với LS_COLORS là LS_COLORS='rs=0;1' ls -l, nhưng nó trông rất khác.
wjandrea

4
@Drew Bạn chỉ biết rằng sau khi điều tra vấn đề. Rõ ràng lscó thể thay đổi màu sắc đầu ra của nó.
ống

@pipe: Nah, tôi biết rằng từ rất lâu trước khi có màu. Nó không cần cung cấp màu, ngay cả khi các phiên bản gần đây ls có thể cung cấp màu. ;-)
vẽ

Câu trả lời:


68

Dường như chuỗi nhắc nhở ( $PS1) của bạn đang đặt thuộc tính in đậm trên các ký tự để làm cho màu sắc đẹp hơn và không bỏ qua nó. Đầu ra từ lskhông biết về điều này và không đặt đậm. Vì vậy, sau khi đầu ra màu đầu tiên ls, mọi thứ trông mờ hơn.


1
Đúng, đó là nó. Thay đổi màu cuối cùng trong $ PS1 đặt đậm + trắng (1; 37) - Cảm ơn!
Bill R

3
Bạn có thể đánh dấu nó được chấp nhận, sau đó.
Thomas Dickey

0

Toàn bộ đầu ra của ls sẽ được in bằng màu hoạt động cuối cùng . Nếu lsđược gọi mà không có màu:

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

sẽ in danh sách các tập tin màu đỏ .

Hoặc, nếu không có thay đổi màu cần thiết cho ls, màu cuối cùng sẽ vẫn là:

$ 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

Tuy nhiên, tất cả trong màu đỏ.

Nhưng, ngay khi lscần đặt màu (và sau đó đặt lại màu về mặc định được sử dụng bởi bảng điều khiển), màu được sử dụng từ đó trở đi sẽ là mặc định của bảng điều khiển.

$ 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

Với ba dòng đầu tiên (lên đến dấu chấm màu xanh) được in màu đỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.