Tên thân thiện của thiết bị đầu cuối tên màu trong các kịch bản shell?


25

Tôi biết các thư viện bằng các ngôn ngữ như Ruby và Javascript để làm cho việc tô màu các tập lệnh đầu cuối của bạn dễ dàng hơn bằng cách sử dụng các tên màu như "đỏ".

Nhưng có cái gì đó như thế này cho các kịch bản shell trong Bash, hoặc Ksh, hoặc bất cứ điều gì không?


8
vui lòng đánh dấu một câu trả lời là chính xác ... bạn chỉ đánh dấu 1 trên tổng số 46 câu hỏi của bạn cho đến nay!
m13r

Câu trả lời:


39

Bạn có thể xác định màu sắc trong tập lệnh bash của mình như vậy:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

Và sau đó sử dụng chúng để in màu yêu cầu của bạn:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."

11

Bạn có thể sử dụng tput HOẶCprintf

Sử dụng tput,

chỉ cần tạo chức năng như dưới đây và sử dụng chúng

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

bạn có thể gọi chức năng trên bằng cách sử dụng shw_err "WARNING:: Error bla bla"

Sử dụng printf

print red; echo -e "\e[31mfoo\e[m"

2
echo -ekhông printf, và cũng cần một cảnh báo rằng nó khác với tputtùy chọn ở chỗ nó không tự động thích ứng cho phù hợp $TERM.
Toby Speight


4

Để sử dụng phổ biến đơn giản (toàn bộ dòng văn bản chỉ có một màu, với dòng mới) tôi đã sửa đổi mã của jasonwryan như sau:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"

Hoặc trong Awk, được sửa đổi một chút:awk -v red="$(printf '\e[1;31m%%s\e[0m\\n')" -v green="$(printf '\e[1;32m%%s\e[0m\\n')" 'BEGIN { printf red, "This text is in red"; printf green, "This text is in green" }'
Wildcard

3

Tốt hơn là sử dụng tputsẽ xử lý các ký tự thoát tùy thuộc vào khả năng đầu ra / đầu cuối. (Nếu một thiết bị đầu cuối không thể giải thích \e[*mã màu, thì nó sẽ bị "ô nhiễm", khiến đầu ra khó đọc hơn (Hoặc đôi khi, nếu bạn grepxuất ra như vậy, bạn sẽ thấy những mã đó \e[*trong kết quả)

Xem hướng dẫntput này cho .

Bạn có thể viết :

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

Dưới đây là hướng dẫn để in Đồng hồ màu trong thiết bị đầu cuối.

Ngoài ra, lưu ý rằng tputvẫn có thể in ký tự thoát khi chuyển hướng STDOUT sang tệp:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

Để ngăn chặn điều này xảy ra, hãy thiết lập các tputbiến của bạn như được đề xuất trong giải pháp này .

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.