Thay đổi màu sắc của văn bản và nền của thiết bị đầu cuối?


73

Tôi có thể thay đổi màu thông qua tùy chọn, nhưng làm cách nào để thay đổi màu nền và màu văn bản của thiết bị đầu cuối thông qua dòng lệnh?


vĩnh viễn hay tình cờ?
Jacob Vlijm

Bạn cũng có thể sử dụng dconf. Tôi đã viết một câu trả lời cho câu hỏi tương tự trước đây: Askubfox.com/a/628129/295286
Sergiy Kolodyazhnyy

\033[00;34mFOO\033[00m
Rafael Barros

Câu trả lời:


50

Trên một số thiết bị đầu cuối tương thích với XTerm / ANSI (như xtermgnome-terminal), bạn có thể đặt màu bằng bảng màu lớn hơn bảng màu 8/16 mặc định (ví dụ: sử dụng bảng màu 88 màu, 256 màu hoặc 16777216 màu (RGB) ; cả hai xtermgnome-terminalhỗ trợ cả bảng màu 256 màu và bảng màu 16777216 (RGB)); lưu ý rằng shell có thể ghi đè lên điều này (đây là trường hợp ví dụ zsh).

Đây là tập lệnh liệt kê các màu trong bảng màu 256 cùng với mã màu ANSI của chúng trong các thiết bị đầu cuối tương thích với XTerm / ANSI với bảng màu 256 hỗ trợ:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

ảnh chụp màn hình1

ảnh chụp màn hình

Tùy thuộc vào việc bạn muốn áp dụng màu cho nền trước hay nền sau, sử dụng <fg_bg>giá trị 38hoặc 48(tương ứng) trong lệnh sau:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

Ví dụ: để đặt màu nền trước ( <fg_bg>= 38) thành màu đỏ ( <ANSI_color_code>= 196) và màu nền ( <fg_bg>= 48) thành màu đen ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

ảnh chụp màn hình3

Cần phải vẽ lại lời nhắc bằng cách sử dụng printf '\e[K'màu nền để áp dụng cho toàn bộ dòng và để màu nền trước áp dụng cho con trỏ:

ảnh chụp màn hình4

Điều tương tự có thể được thực hiện bằng cách sử dụng các giá trị RGB thay vì mã màu ANSI trong một thiết bị đầu cuối tương thích; tùy thuộc vào việc bạn muốn áp dụng màu cho nền trước hay nền, sử dụng <fg_bg>giá trị 38hoặc 48(tương ứng) trong lệnh sau:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

Ví dụ: để đặt màu nền trước ( <fg_bg>= 38) thành màu đỏ ( <R>= 255, <G>= 0, <B>= 0) và màu nền ( <fg_bg>= 48) thành màu đen ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

ảnh chụp màn hình5

Một lần nữa, cần phải vẽ lại lời nhắc bằng cách sử dụng printf '\e[K'màu nền để áp dụng cho toàn bộ dòng và để màu nền trước được áp dụng cho con trỏ:

ảnh chụp màn hình6

Sử dụng một trong hai phương pháp, bạn có thể sử dụng printf '\e[0m'để đặt lại tất cả các thuộc tính:

ảnh chụp màn hình7


1
Cả hai xtermgnome-terminalnhận ra các chuỗi thoát màu thực sự \ e [38/48; 2; R; G; Bm; tuy nhiên, làm xtermtròn màu thực tế đến gần nhất trong bảng màu 256 màu của nó. gnome-terminalhiển thị màu sắc chính xác được đưa ra trong chuỗi thoát.
egmont

2
\ e [K là nguy hiểm; trong một số trình giả lập (ví dụ xterm) nếu con trỏ xảy ra ở cạnh rất bên phải (hiển thị trực quan ở cột ngoài cùng bên phải, nhưng về mặt logic đã vượt ra ngoài vì một ký tự đã được in ở cột ngoài cùng bên phải), chữ cái cuối cùng bị xóa. Xem ví dụ: bugzilla.gnome.org/show_orms.cgi?id=740789 hoặc savannah.gnu.org/bugs/?36831 .
egmont

Tự sửa lỗi: Nếu bạn phát ra \ e [K ở đầu dòng (ở đầu dấu nhắc, thay vì ở cuối dòng) thì tất nhiên là an toàn. (Mặc dù không hoạt động với dấu nhắc hoặc lệnh đa dòng.)
egmont 13/2/2016

@egmont Cảm ơn thông tin hữu ích, tôi thấy rằng trên Gnome Bugzilla được đánh dấu là đã sửa, đây có phải là trường hợp không? Tôi không thể kiểm tra điều này vào lúc này, vì vậy tôi sẽ làm điều đó sau để kiểm tra xem đây có phải là trường hợp không (trừ khi bạn trả lời trước) và đưa thông tin đó vào câu trả lời.
kos

Yup phiên bản mới nhất của gnome-terminal không loại bỏ ký tự đó. Cho dù đây là hành vi chính xác là nghi vấn. Rốt cuộc, các trình giả lập thiết bị đầu cuối đồ họa đang mô phỏng một số thiết bị cổ xưa. Chúng ta có nên mô phỏng các quyết định thiết kế tồi của họ (như xterm ở đây) hay chúng ta nên ghi đè (như chúng ta làm trong gnome-terminal)? Đó là một câu hỏi khó mà không có câu trả lời đúng.
egmont

33

Thông tin được tìm thấy trên trang này , không bao gồm cột xem trước:

Các chuỗi được tạo thành từ nhân vật Escape (thường được đại diện bởi ( ^[hay <Esc>), theo sau là một số nhân vật khác: biểu tượng ^[FCm(trong đó FClà một trong những số trong danh sách gạch đầu dòng bên dưới).

Trong bash, Escmã có thể là một trong những điều sau đây:

  1. \e
  2. \033 (bát phân)
  3. \x1B (thập lục phân)

Lưu ý 1: Chuỗi " \e[0m" loại bỏ tất cả các thuộc tính (định dạng và màu sắc). Nó có thể là một ý tưởng tốt để thêm nó vào cuối mỗi văn bản màu.

Lưu ý 2: Màu nền và màu nền có thể khác nhau, tùy thuộc vào cấu hình của thiết bị đầu cuối và không phải tất cả các màu đều được hỗ trợ .

Đặt / Đặt lại

  • 0: Đặt lại / xóa tất cả các thuộc tính sửa đổi, tiền cảnh và nền: echo -e "\e[0mNormal Text"
  • 1: Đậm / Sáng: echo -e "Normal \e[1mBold"
  • 2: Lờ mờ: echo -e "Normal \e[2mDim"
  • 4: Gạch chân: echo -e "Normal \e[4mUnderlined"
  • 5: Blink (không hoạt động trong hầu hết các thiết bị đầu cuối trừ XTerm): echo -e "Normal \e[5mBlink"
  • 7: Đảo ngược / Đảo ngược: echo -e "Normal \e[7minverted"
  • 8: Ẩn (hữu ích cho thông tin nhạy cảm): echo -e "Normal \e[8mHidden Input"
  • 21: Đặt lại / Xóa đậm / sáng: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Đặt lại / Xóa mờ: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Đặt lại / Xóa gạch chân: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Đặt lại / Xóa nhấp nháy: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Đặt lại / Xóa đảo ngược / đảo ngược: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Đặt lại / Xóa ẩn: echo -e "Normal \e[8mHidden \e[28mNormal"

Vấn đề xung quanh

  • 39: Mặc định (thường là màu xanh lá cây, trắng hoặc xám nhạt): echo -e "Default \e[39mDefault"
  • 30: Đen: echo -e "Default \e[30mBlack"(kết hợp tốt nhất với màu nền echo -e "Default \e[30;107mBlack on white":)
  • 31: Màu đỏ (không sử dụng với nền màu xanh lá cây)
  • 32: Màu xanh lá
  • 33: Màu vàng
  • 34: Màu xanh da trời
  • 35: Đỏ tươi / Tím
  • 36: Lục lam
  • 37: Xám nhạt
  • 90: Màu xám đen
  • 91: Đỏ nhạt
  • 92: Màu xanh lợt
  • 93: Vàng nhạt
  • 94: Ánh sáng màu xanh
  • 95: Màu đỏ tươi / Hồng
  • 96: Ánh sáng lục lam
  • 97: Trắng

Lý lịch

  • 49: Màu nền mặc định (thường là đen hoặc xanh)
  • 40: Đen
  • 41: Đỏ
  • 42: Màu xanh lá
  • 43: Màu vàng
  • 44: Màu xanh da trời
  • 45: Đỏ tươi / Tím
  • 46: Lục lam
  • 47: Xám nhạt (không sử dụng với tiền cảnh màu trắng)
  • 100: Xám đậm (không sử dụng với tiền cảnh màu đen)
  • 101: Đỏ nhạt
  • 102: Light Green (không sử dụng với nền trước màu trắng)
  • 103: Vàng nhạt (không sử dụng với tiền cảnh màu trắng)
  • 104: Light Blue (không sử dụng với tiền cảnh màu vàng nhạt)
  • 105: Light Magenta / Pink (không sử dụng với tiền cảnh sáng)
  • 106: Light Cyan (không sử dụng với tiền cảnh màu trắng)
  • 107: Trắng (không sử dụng với tiền cảnh sáng)

Để đặt cả màu nền trước và màu nền cùng một lúc, hãy sử dụng mẫu có echo -e "\e[S;FG;BGm". Ví dụ: echo -e "\e[1;97;41m"(đậm màu nền trước trên nền đỏ)

Đối với tùy chọn 256 màu, xem trang nguồn.


30

Thay đổi màu sắc trên cơ sở ngẫu nhiên

Nếu nó có nghĩa là để thay đổi màu sắc trên cơ sở ngẫu nhiên :

Bạn có thể sử dụng lệnh setterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

từ màu sắc, bạn có thể chọn từ (cả trước và sau):

black|blue|green|cyan|red|magenta|yellow|white|default

để có thêm lựa chọn:

setterm -help

Thay đổi cài đặt hồ sơ (màu) của bạn

Trong 14.04, tôi không tìm thấy tùy chọn nào để sử dụng dconfđể đặt màu hoặc thiết bị đầu cuối. Tuy nhiên bạn có thể sử dụnggconftool

  • Trước tiên bạn cần lấy tên hồ sơ của bạn:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Sau đó, để đặt màu văn bản của hồ sơ của bạn:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    ví dụ để đặt màu văn bản thành màu trắng

    Tương tự với màu nền:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    ví dụ để đặt màu nền thành màu đen

Luôn luôn, để đặt tên của màu, bạn chỉ cần sử dụng whitehoặc green, từ cùng một bảng màu như lệnh setterm, ví dụ:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black

1
Chúng nên là dấu gạch ngang kép trong lệnh setterm ban đầu.
dùng1770201

Hoạt động vào ngày 14.04, nhưng không phải vào ngày 16.04 (beta; không chắc đó có phải là lý do không) ... Tuy nhiên, dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"vẫn có mẹo.
Janaka Bandara

Không hoạt động trên Ubuntu 1704, nó có vẻ tệ
Wax Cage

1
gconftool-2(đối với Ubuntu 14.04 và có thể một vài bản phát hành sau) dconfhoặc gsettingstrên các phiên bản mới hơn của Ubuntu thay đổi cài đặt của gnome-terminal và có hiệu lực ngay lập tức trên tất cả các tab và cửa sổ của cùng một cấu hình. Tôi không nghĩ OP đang tìm kiếm hành vi này.
egmont

5

Các mã màu khác nhau được sử dụng để lấy đầu ra màu cũng có thể được sử dụng để có được nền màu :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

Do đó, lệnh sau biến màu đỏ nền của tôi:

$ echo -e '\e[0;41m'

Tùy thuộc vào trình bao, trình giả lập thiết bị đầu cuối, v.v., bạn có thể không cần -e.


3

Xem câu trả lời của kos để chuyển nền trước hoặc nền sang màu cụ thể của bảng màu hoặc thậm chí là màu RGB trực tiếp trong một số thiết bị đầu cuối. Hiệu ứng của chuỗi như vậy kéo dài cho đến khi một màu khác được chọn (hoặc nó được hoàn nguyên về mặc định).

Một cách tiếp cận khác, được hỗ trợ bởi một số trình giả lập thiết bị đầu cuối, là xác định lại các giá trị RGB chính xác của màu nền trước và nền mặc định của thiết bị đầu cuối bằng cách sử dụng các chuỗi thoát OSC 10/11:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

Điều này có thể tồn tại lâu hơn nhiều (cho đến khi bị ghi đè bởi một OSC 10/11 khác hoặc đặt lại qua OSC 110/111), nhưng không giống như cách tiếp cận dconf, điều này vẫn chỉ ảnh hưởng đến thiết bị đầu cuối hiện tại.

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.