tra-loi-cau-hoi-phat-trien-web.com

Điều gì gây ra nền xanh này trong đầu ra ls?

screencap of ls output on linux machine

Có hai thư mục được hiển thị bởi 'ls'. Thông thường thư mục bất cứ nơi nào có màu xanh trên nền đen. Nhưng cái đầu tiên là màu xanh trên màu xanh lá cây và không thể đọc được. Tại sao lại thế này? Làm thế nào để làm cho nó có màu xanh trên nền đen, hoặc ít nhất là một cái gì đó sáng trên một cái gì đó tối?

Đây là trên Ubuntu 12.04, sử dụng bash trong Gnome Terminal. Trong Konsole, màu xanh hơi đậm hơn và có thể đọc được, mặc dù có thể tốt hơn.

158
DarenW

Ngoài các tệp màu dựa trên loại của chúng (màu ngọc lam cho tệp âm thanh, màu đỏ sáng cho Lưu trữ và tệp nén và màu tím cho hình ảnh và video), ls cũng tô màu các tệp và thư mục dựa trên thuộc tính của chúng:

  • Văn bản màu đen với nền màu xanh lá cây biểu thị rằng một thư mục có thể ghi được bởi những người khác ngoài người dùng và nhóm sở hữu và có tập bit dính (o+w, +t).
  • Văn bản màu xanh lam với nền màu xanh lục biểu thị rằng một thư mục có thể ghi được bởi những người khác ngoài người dùng và nhóm sở hữu và không có tập bit dính (o+w, -t).

Stephano Palazzo tại Hỏi Ubunt đã tạo ra bức tranh rất hướng dẫn này qua các màu thuộc tính khác nhau:

What the different colors mean in the terminal

Như terdon chỉ ra, cài đặt màu có thể được sửa đổi thông qua dircolors . Có thể truy cập danh sách các cài đặt màu khác nhau bằng dircolors --print-database.

Mỗi dòng đầu ra, chẳng hạn như BLK 40;33;01, có dạng:

[TARGET] [TEXT_STYLE];[FOREGROUND_COLOR];[BACKGROUND_COLOR]
  • TARGET chỉ ra mục tiêu cho quy tắc tô màu

  • TEXT_STYLE biểu thị kiểu văn bản:

    • 00 = không
    • 01 = đậm
    • 04 = gạch dưới
    • 05 = nháy mắt
    • 07 = đảo ngược,
    • 08 = che giấu
  • FOREGROUND_COLOR chỉ ra màu nền trước:

    • 30 = đen
    • 31 = đỏ
    • 32 = xanh
    • 33 = màu vàng
    • 34 = màu xanh,
    • 35 = Đỏ tươi
    • 36 = lục lam
    • 37 = trắng
  • BACKGROUND_COLOR cho biết màu nền:

    • 40 = đen
    • 41 = đỏ
    • 42 = xanh
    • 43 = màu vàng
    • 44 = màu xanh,
    • 45 = Đỏ tươi
    • 46 = lục lam
    • 47 = trắng

Các trường có thể được bỏ qua bắt đầu từ bên phải, vì vậy, ví dụ .tar 01;31 có nghĩa là đậm và đỏ.

XTerm và hầu hết các trình giả lập thiết bị đầu cuối hiện đại khác hỗ trợ 256 màu.

Mã màu tiền cảnh 256 màu của XTerm có dạng:

38;5;[FOREGROUND_COLOR]

Mã màu nền 256 màu của XTerm có dạng:

48;5;[BACKGROUND_COLOR]

cả hai FOREGROUND_COLORBACKGROUND_COLOR là một số trong phạm vi 0-255. Danh sách đầy đủ các mã màu cho chế độ 16 và 256 được hiển thị trong ảnh chụp màn hình bên dưới:

16 and 256 color mode color codes

176
Thomas Nyman

Màu sắc của ls có thể đại diện cho các quyền, mặc định cho một số hệ thống là hiển thị các thư mục nơi mọi người đều có quyền ghi với nền màu xanh lá cây:

enter image description here

Bạn có thể thay đổi màu sắc bằng cách chỉnh sửa biến $LS_COLORS Bằng cách sử dụng dircolors (từ man ls):

   Using color to distinguish file types is disabled both by  default  and
   with  --color=never.  With --color=auto, ls emits color codes only when
   standard output is connected to a terminal.  The LS_COLORS  environment
   variable can change the settings.  Use the dircolors command to set it.

Cú pháp được thừa nhận là loại gây phiền nhiễu ở đây nhưng bạn có thể thay đổi màu này bằng cách tạo một tệp có màu bạn muốn và lưu nó dưới dạng ~/.dircolors:

dircolors -p > ~/.dircolors

Lệnh đó sẽ in mặc định thành ~/.dircolors. Sau đó, bạn sẽ cần chỉnh sửa tệp đó và thay đổi dòng này:

OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky

Ví dụ: để làm cho văn bản màu đen trên nền đỏ (xem tại đây để biết danh sách mã màu):

OTHER_WRITABLE 30;41 # dir that is other-writable (o+w) and not sticky

Bạn không cần phải có tất cả các giá trị mặc định, bạn cũng có thể chỉ cần tạo một tệp với một dòng duy nhất, xác định lại chỉ là tệp bạn muốn thay đổi. Dù sao, một khi bạn đã tạo tệp, tải nó bằng:

eval "$(dircolors ~/.dircolors)";

Và đây là hành động:

enter image description here

Để điều đó tự động xảy ra, hãy thêm lệnh eval ở trên vào tệp ~/.bashrc Của bạn.

56
terdon

Mặc dù tất cả các câu trả lời kỹ thuật là đúng, tôi sẽ coi đó là một cảnh báo không chính thức, rằng bạn đã bỏ quyền một chút để hào phóng hoặc sao chép criss + cross ... (hầu hết chúng ta đều làm, để mọi thứ hoạt động ban đầu, eh ?)

Làm thế nào để làm cho nó có màu xanh trên nền đen, ...?

Một tuyên bố tốt nhất để lấy lại các quyền mà bạn rất muốn, là tuyên bố này:

chmod -R a-x,o-w,+X thatGreenFolderWithSubfolders/

Hiểu rõ nhất những gì nó làm, nếu bạn hiểu mục đích của chữ hoa + X thực thi đặc biệt, tức là xem Wikipedia

Nó chỉ thực sự hữu ích khi được sử dụng với '+' và thường kết hợp với tùy chọn -R để cấp cho nhóm hoặc quyền truy cập khác vào cây thư mục lớn mà không đặt quyền thực thi trên các tệp thông thường (như tệp văn bản), điều này thường xảy ra nếu bạn vừa sử dụng "chmod -R a + rx ...

13
Frank Nocke

Tôi đã có cùng một câu hỏi, câu trả lời của terdon có hay không nhưng tôi nghĩ có sự nhầm lẫn giữa dirname và dircolors?

Dù sao, sau một số nghiên cứu sâu hơn tôi có thể thay đổi màu sắc, vì vậy tôi đang chia sẻ giải pháp của mình ở đây. Nó có thể hữu ích cho một số người một ngày nào đó!

Vì vậy, 3 bước đơn giản:

Đầu tiên, như terdon đã nói, sao chép các màu mặc định vào một tệp

dircolors -p > ~/.dircolors

Sau đó sửa đổi tập tin này. Bạn có thể tìm thấy một số giá trị cho màu sắc bên trong, nhưng tôi đã tìm thấy nhiều hơn tại đây :)

Và cuối cùng, thêm dòng sau vào tệp ~/.bashrc Để màu được tự động tải khi bạn mở thiết bị đầu cuối:

eval 'dircolors ~/.dircolors' > /dev/null

Võngà :)

9
KevinG

Để nhanh chóng khắc phục sự cố, (làm cho các tệp có thể ghi khác có màu vàng trên nobg):

LS_COLORS+=':ow=01;33'

Thay thế 33 bởi 34 cho màu xanh trên nobg. Thậm chí đơn giản hơn, để làm cho nó nofg trên nobg:

LS_COLORS+=:ow=

Để thay đổi vĩnh viễn, hãy thêm nó vào .profile của bạn:

echo "export LS_COLORS+=':ow=01;33'" >> ~/.profile

Để xem các quy tắc không liên quan đến tiện ích mở rộng của LS_COLORS:

echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'

sed đặt mỗi quy tắc trên một dòng và grep xóa các quy tắc bắt đầu bằng *.'.


Để khám phá các màu ls trên thiết bị đầu cuối của bạn, hãy xem xét sử dụng

C="$LS_COLORS"
function sc () {
    echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'
}
function t () {
    ls /mnt # Or the path to your example directory.
}

Sau đó

LS_COLORS="$C:ow=38;5;250;48;5;025";t

Như đã nêu trong một câu trả lời khác (của Thomas Nyman), 38;5; là tiền tố cho 256 màu tiền cảnh và 48;5; cho nền 256 màu hạn. Mặc dù vậy, 256 màu không được hỗ trợ bởi tất cả các thiết bị đầu cuối.

Xem thêm - Các màu khác nhau có ý nghĩa gì trong ls? - trên AskUbfox.

6
loxaxs

Để khắc phục điều này, hãy thử tham số ow cho LS_COLORS

Ví dụ:

~LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.Zip=33:*.tgz=33'
~ls -l

enter image description here

Bây giờ bạn thêm ow (OTHER_WRITABLE) Lựa chọn

~export LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.Zip=33:*.tgz=33:ow=0'
~ls -l

enter image description here

1
PYK

Chà, điều này có nghĩa là thư mục này có quyền nếu bạn chạy nó:

nó sẽ loại bỏ bgcolor :)

1
Gorodeckij Dimitrij

Bạn có thể thay đổi tông màu xanh lục trong PuTTY để làm cho văn bản có thể đọc được.

Mở PuTTY và đi đến Window\Colors, chọn "ANSI Green", đặt nó thành màu xanh đậm hơn (R: 0 G: 70 B: 0).

0
Erhan Alankus