Là các chuỗi thoát màu thiết bị đầu cuối được xác định bất cứ nơi nào cho bash?


22

Tôi đã sử dụng tất cả các màu thường xuyên trong kịch bản Bash (chủ yếu là trên CentOS), nhưng để làm cho việc sử dụng chúng thuận tiện hơn, tôi kết thúc việc xác định lại các biến thành giá trị màu:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

hoặc cũng với tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Tôi đã tìm kiếm xung quanh /etc/rc.d/init.dthư mục nhưng không tìm thấy bất cứ điều gì liên quan đến định nghĩa màu sắc trong đó.

Có định nghĩa như vậy đã có? Nếu không tôi sẽ đặt chúng vào một tập tin /etc/rc.d/init.dđể nói và đưa nó vào tập lệnh của mình, giống như với/etc/rc.d/init.d/functions


Chúng không phải, vì \e[1;30m, chẳng hạn, về mặt kỹ thuật không đại diện cho màu xám, mà là các khe màu thường được hiển thị là màu xám bởi một thiết bị đầu cuối. Trình giả lập thiết bị đầu cuối có thể tự do thay đổi màu hiển thị thực tế và thường biến chúng thành một tùy chọn có thể định cấu hình người dùng.
chepner

Câu trả lời:


36

Có một số khía cạnh chơi trong những gì bạn yêu cầu.

Đầu tiên, bash không xác định màu sắc. Trong thực tế bash hoàn toàn không có ý tưởng rằng màu sắc thậm chí còn tồn tại. Tất cả những gì nó biết là bạn đã bảo nó xuất các ký tự \033[0;36m. Trình giả lập thiết bị đầu cuối của bạn (xterm, gnome-terminal, sao cũng được) nhận các ký tự này và hiểu "Tôi cần bắt đầu xuất ra màu lục lam".

Do đó, nó là trình giả lập thiết bị đầu cuối của bạn hiểu màu sắc. Trình giả lập thiết bị đầu cuối của bạn hiểu đó \033[0;36mlà màu lục lam, nhưng trình giả lập thiết bị đầu cuối khác có thể sử dụng một bộ ký tự hoàn toàn khác cho màu lục lam (mặc dù không có trình giả lập thiết bị đầu cuối lành mạnh nào sẽ phô trương tiêu chuẩn và làm điều này). Đây là lý do cho tput. Khi bạn chạy tput setaf 6, tputsẽ tìm mã thoát của thiết bị đầu cuối của bạn để tìm màu 6 (màu lục lam) và xuất mã thoát đó.
(xem câu hỏi này để biết thêm thông tin về tput setafmã)

Bây giờ trở lại bash. Như bạn có thể nhận thấy, khi tôi đề cập đến màu lục lam, tôi đã sử dụng \033[0;36m, không phải \[\033[0;36m\]. Các dấu ngoặc vuông đã bị thiếu. Mục đích của dấu ngoặc vuông là khi sử dụng mã thoát (màu sắc) trong lời nhắc, bash phải biết ký tự nào không được in (độ rộng bằng không, không thực sự hiển thị bất cứ thứ gì). Vì vậy, bạn kèm theo các ký tự không in \[ \]. Nếu bạn loại bỏ các ký tự này, ban đầu mọi thứ có thể hoạt động tốt, nhưng bạn sẽ bắt đầu gặp phải nhiều điều kỳ lạ khi lệnh của bạn vượt quá chiều rộng của thiết bị đầu cuối. Điều này là do khi gõ, bash phải biết khi nào lệnh nên gói sang dòng tiếp theo. Để làm điều này, nó sẽ tính toán độ rộng của dấu nhắc và sau đó là chiều rộng của số lượng bạn đã nhập.

Một lưu ý khác, về tput. CYAN="\[\033[0;36m\]"không được điều tương tự như CYAN="$(tput setaf 6)". Như chúng ta vừa thảo luận, dấu ngoặc vuông có liên quan đến bash và tputsẽ chỉ xuất ra mã thoát thiết bị đầu cuối.

Vì dấu ngoặc vuông thường chỉ có liên quan trong lời nhắc, nếu bạn đang sử dụng màu sắc trong đầu ra của tập lệnh hoặc thứ gì đó, bạn không nên sử dụng chúng. Có nghĩa là nếu bạn sẽ sử dụng màu sắc nhiều hơn lời nhắc, bạn cần xác định nhiều biến. Một với dấu ngoặc vuông để sử dụng trong dấu nhắc và một không có mọi thứ khác. Mặc dù bạn chỉ có thể thêm dấu ngoặc vuông theo cách thủ công mỗi khi bạn tham chiếu một màu trong lời nhắc.

Câu chuyện dài quá ngắn, có lẽ bạn muốn định nghĩa một cái gì đó như:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"

Làm thế nào để tôi thấy màu sắc khi đăng nhập vào một thiết bị đầu cuối thực sự với Ctrl+ Alt+ F1?
Serge Stroobandt
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.