Làm cách nào tôi có thể thay đổi màu sắc của xterm bằng chuỗi thoát Ansi?


25

Tôi muốn thay đổi màu sắc (nền, phông chữ, tiền cảnh) của xterm của tôi từ dòng lệnh. Tôi đã nghe nói rằng điều này có thể được thực hiện bằng cách sử dụng các chuỗi thoát ANSI.

Nếu điều này là có thể:

  • Làm thế nào được thực hiện?
  • Tôi có thể sử dụng tên màu hay tôi phải sử dụng mã RGB của họ?

Câu trả lời:


27

Các chuỗi thoát ANSI bao gồm một chuỗi các ký tự bắt đầu bằng ký tự Escape, ký tự 27. Ký tự tiếp theo thường là (mặc dù không phải luôn luôn) một dấu ngoặc vuông mở: [

Lệnh echo có thể gửi các ký tự thoát nếu bạn chỉ định -evà sử dụng \eđể thoát.

Tiêu chuẩn ANSI xác định 8 màu, cộng với chế độ sáng, cung cấp tổng cộng 16 màu. Trình tự là:

\e[<number>m

Trong trường hợp <number>là một trong số:

Vấn đề xung quanh:

  • 30 Đen
  • 31 đỏ
  • 32 xanh
  • 33 Vàng
  • 34 màu xanh
  • 35 đỏ tươi
  • 36 Cyan
  • 37 trắng

Lý lịch:

  • 40 Đen
  • 41 đỏ
  • 42 xanh
  • 43 vàng
  • 44 màu xanh
  • 45 màu đỏ tươi
  • 46 Cyan
  • 47 Trắng

  • 0 Đặt lại tất cả

  • 1 đậm

Vì vậy, để làm cho tiền cảnh của bạn màu đỏ và nền của bạn màu vàng:

$ echo -e "\e[31m\e[43m"

Và để bật đậm:

$ echo -e "\e[1m"

Tất nhiên, bạn có thể kết hợp tất cả chúng lại với nhau:

$ echo -e "\e[31m\e[43m\e[1m"

Có rất nhiều mã thoát khác để làm những việc khác.

Ví dụ: xóa màn hình và di chuyển con trỏ sang trên cùng bên trái:

$ echo -e "\e[2J\e[1;1H"

Điều này rất hữu ích khi thay đổi màu sắc:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Cái nào sẽ thay đổi màu sắc, xóa màn hình và đặt con trỏ ở góc trên bên trái. Vâng, gần như trên cùng bên trái. Echo đặt một chiếc xe ngựa trở lại, vì vậy nó di chuyển xuống một dòng. Bạn có thể thêm -nvào tiếng vang để ngăn chặn điều này nếu bạn cầu kỳ.

Nếu bạn làm rối tung tất cả và không thể thấy những gì bạn đang gõ, bạn có thể đặt lại màu của thiết bị đầu cuối thành bình thường bằng cách nhấn:

Ctrl+v [ 0 m Return

Tại những gì bạn hy vọng là dấu nhắc lệnh. Nó sẽ rên rỉ về một lệnh không xác định, nhưng bạn sẽ có thể thấy những gì bạn đang làm lại.


Tôi có thể sử dụng tên màu thay vì mã màu không?
Nathan Fellman

1
Không, nhưng bạn có thể gán mã màu cho các biến. NỀN TẢNG = 31; echo -e "\ e [$ {FGRED} m"
Majenko

3
Tuy nhiên, cần lưu ý rằng nhiều số mã màu có thể được phân tách bằng dấu ";". Vì vậy, để làm cho tiền cảnh của bạn màu đỏ và nền màu vàng của bạn, bạn cũng có thể sử dụng ngắn hơn: echo -ne '\e[31;43m'(thay vì ở trên echo -e "\e[31m\e[43m").
Andreas Spindler

Làm cách nào để thay đổi màu của con trỏ thành 34 Blue?
trusktr

28

Lưu ý rằng Xterms hiện đại hỗ trợ màu 32 bit!

Ví dụ đơn giản. Để đặt nền màu tím sẫm đẹp (hey, mỗi màu của riêng mình) có giá trị # 53186f, bạn làm:

echo -ne "\033]11;#53186f\007"

Lưu ý rằng điều này ngay lập tức thay đổi màu sắc của toàn bộ cửa sổ, không chỉ của văn bản tiếp theo. Điều này đặc biệt tốt khi tạo một cửa sổ rõ ràng khác biệt sau khi ssh'ing đến một máy chủ (ví dụ). Đặt 'echo' ở trên vào .bashrc và thiết bị đầu cuối của bạn sẽ tự động thay đổi màu sắc khi bạn đăng nhập vào máy chủ đó (nhưng sẽ không thay đổi trở lại khi bạn tắt Ctrl-D)

Bạn có thể dành GIỜ trên mạng để tìm kiếm điều này - hầu hết các tài liệu chỉ nói về 16 màu ANSI ban đầu.

Nguồn: http://www.steike.com/code/xterm-colors/http://rtfm.etla.org/xterm/ctlseq.html (xem trong "Điều khiển hệ điều hành")

Xin lưu ý: trình tự thoát ở trên là hợp lệ đối với XTerms và có thể không hoạt động đối với các triển khai khác của trình giả lập thiết bị đầu cuối cửa sổ "giống như Xterm" có thể "trông" giống như Xterm. Ví dụ: "gnome-terminal" hoặc "konsole" có các chuỗi thoát khác nhau hoặc hoàn toàn không thể thay đổi màu sắc.


1
Điều này không làm việc cho tôi, nó lặp lại một dòng trống không có thay đổi có thể quan sát được trong thiết bị đầu cuối.
Richard

1
Điều này làm việc cho tôi, trong khi những người khác thì không - rất hữu ích, thx
vol7ron

1
+1 thay đổi nền cửa sổ và cho phép các tên màu - như "xanh" thay vì "# 00ff00".
Cướp tôi

1
Màu sắc # 53186f 32 bit như thế nào. Tôi đếm 24 bit ...
jiggunjer

Có ai biết làm thế nào để thực hiện điều tương tự với gnome-terminal không?
wjandrea

3

Vâng. Thiết bị đầu cuối ANSI hỗ trợ Mã thoát ANSI . Mỗi mã Control Sequence Introducer( CSI) theo định dạng sau:

ESC[<<<CODE>>>

Ký tự Ascii 27( ESCký tự) hoặc 1bở dạng thập lục phân, theo sau là dấu ngoặc vuông bên trái và sau đó là một chữ cái biểu thị hành động sẽ được sử dụng.

Lưu ý rằng một danh sách các ;tham số riêng biệt có thể được cung cấp trực tiếp trước <<<CODE>>>tham số.

Bây giờ, màu sắc sử dụng một tập hợp con của CSImã, Select Graphic Renditionmã. Đây là dưới dạng:

ESC[<<<SGR>>>m

Các SGRcode được thông qua như là một tham số CSI. Liên quan đến câu hỏi của bạn là các SGRmã 30-49. Mã 30-39 đặt màu nền trước. Mã 40-49 đặt màu nền.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

Mã 38 và 48 là mã đặc biệt. Đây là những cái cho phép bạn sử dụng các giá trị RGB. Định dạng cho những điều này là:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Lưu ý: sử dụng thay thế bao gồm \x1b[<3 or 4>8;5;<web safe color index>m. Với cách sử dụng này, có một bảng mã màu hoàn toàn khác. Xem liên kết ở đầu câu trả lời này để biết thêm thông tin.

Mã 39 và 49 đặt màu nền trước và màu nền cho mặc định của chúng, được xác định trên cơ sở từng thiết bị đầu cuối.

Trong thực tế, màu sắc 30-37 40-47 hơi khác so với những gì nhãn hiệu của chúng nói.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Để có được màu sáng, bạn sử dụng SGI cho đậm , 1. In đậm là một cái tên sai lệch. Nó không làm cho phông chữ đậm. Nó thực sự làm tăng độ sáng của văn bản. Với đậm áp dụng màu sắc trở thành:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Lưu ý: hai khối màu cuối cùng có liên quan đến cả hai mặt trước và nền ( <index> + (30 or 40)).

Để xóa tất cả các kiểu (trở về chế độ mặc định / bình thường), sử dụng SGR0.

CSImã không phải là tất cả đồ họa. Ví dụ, ESC[2Jsẽ xóa thiết bị đầu cuối của bạn. ESC[<y>;<x>Hđặt vị trí con trỏ (1 chỉ mục). Xem bài viết trên wikipedia để biết thêm thông tin.

Lưu ý: để kiểm tra những cái này, sử dụng echo -ehoặc printf.


2

LƯU Ý: "^ [" là ký tự thoát và được chèn bằng CTRL-V, CTRL- [và ^ G là ký tự chuông, được chèn bằng CTRL-V, CTRL-G

Khối sau nằm trong .bash_profile của tôi và đảm bảo rằng các xterms của tôi trên hệ thống này LUÔN LUÔN trắng, ngay cả sau khi đăng nhập vào hệ thống khác có thể đã thay đổi màu sắc của tôi.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

cũng kiểm tra một dự án ScriptEchoColor,
nó hoàn toàn được tạo trong các tập lệnh bash,
nó có các gói cho ubfox ở đây
nhưng các tập lệnh này có thể được cài đặt trên bất kỳ bản phân phối nào nếu bạn biết cách (mới nhất cũng có thể được tải xuống từ git của nó).

bạn có thể sử dụng tên màu rút ngắn hoặc mở rộng như:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

một ví dụ: nhập mô tả hình ảnh ở đây

Ngoài ra, hãy chắc chắn xem qua xtermcontrol , để kiểm soát rộng hơn đối với xterm trên chính nó (không chỉ các ký tự).


0

Trong số nhiều mã ANSI CSI có một được gọi là SGR hoặc Chọn Hiển thị đồ họa. Đây là ESC ,, [các tham số, mtrong đó các tham số là một hoặc nhiều số nguyên ở định dạng ASCII, được phân tách bằng dấu chấm phẩy. Nhiều tham số SGR khác nhau được liệt kê trên trang Wikipedia ở trên (mặc dù nó không đi vào chi tiết đầy đủ cho tất cả chúng).

Một số tham số, chẳng hạn như 1(đậm hoặc tăng cường độ) và 31(văn bản màu đỏ) là độc lập và có thể được sử dụng riêng lẻ hoặc kết hợp, như trong ESC[31mhoặc ESC[1;31mđể đưa ra văn bản tiền cảnh màu đỏ và đỏ đậm tương ứng.

Những người khác tự nhận các tham số, được cung cấp đơn giản sau mã dưới dạng nhiều số được phân tách bằng dấu chấm phẩy. Vì vậy, ví dụ, ESC[38;5;219msẽ hiển thị văn bản nền trước ở số màu mở rộng 219 và ESC[38;2;150;100;50msẽ hiển thị màu đó với giá trị RGB 150, 100, 50. Trong trường hợp này, 38là lệnh "màu nền trước được mở rộng", luôn được theo sau bởi một tiểu ban. Tiểu ban 2có ba tham số, các giá trị của các thành phần màu đỏ, xanh lá cây và xanh dương. Khác nhau, tiểu ban 5chỉ cần thêm một giá trị, một số từ 0 đến 255 chỉ định màu từ bảng mà thiết bị đầu cuối được cấu hình.

Hàm shell sau đây có thể thuận tiện cho việc sử dụng các mã sau:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Bạn có thể sử dụng nó như thế này:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Lưu ý rằng nếu bạn không cung cấp tham số nào cho sgr()nó mặc định cho mã SGR 0, có nghĩa là tắt tất cả các thuộc tính, đặt lại văn bản thành bất cứ thứ gì mặc định cho thiết bị đầu cuối đó.


1
Về mặt kỹ thuật, những người ESC[38... mESC[38... mcó thể / nên (phụ thuộc vào nguồn thông tin của bạn - người cuối cùng, tôi tin, itu.int/rec/T-REC-T.416-199303-I ) nên sử dụng, mặt khác, ký tự :(để tách các thành phần tham số ) sao cho ;chỉ được sử dụng giữa các chuỗi tham số hoàn chỉnh - nghĩa là ESC[38;2;150;100;50mnên được viết ESC[38:2::150:100:50m...
SlySven

... thật không may là các triển khai thường quên id không gian màu giữa 2150- như không ai biết, tôi đã từng xác định giá trị nào nên sử dụng trong đó mặc định trống sẽ được sử dụng - nhưng nó thường bị bỏ qua và chỉ sử dụng ;như một dấu phân tách làm cho không thể xử lý thông tin một cách đáng tin cậy theo quy định.
SlySven
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.