"Дружні" термінальні назви кольорів у скриптах оболонки?


25

Мені відомі бібліотеки на таких мовах, як Ruby та Javascript, щоб полегшити колоризацію своїх термінальних сценаріїв, використовуючи назви кольорів, такі як "червоний".

Але чи є щось подібне для скриптів оболонки в Bash, або Ksh, або ще?


8
будь-ласка, позначте відповідь правильною ... ви відзначили лише 1 із загальних 46 заданих питань!
m13r

Відповіді:


39

Ви можете визначити кольори у ваших скриптах bash:

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'

А потім використовуйте їх для друку у потрібних кольорах:

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

11

Ви можете використовувати tput АБОprintf

Використовуючи tput,

просто створіть функції, як показано нижче, і використовуйте їх

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)
}

ви можете зателефонувати вище за допомогою функції shw_err "WARNING:: Error bla bla"

Використання printf

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

2
echo -eне є printf, а також потребує попередження, що воно відрізняється від tputваріанту тим, що воно не автоматично адаптується до відповідного $TERM.
Toby Speight


4

Для простих звичайних цілей використання (повний рядок тексту лише в одному кольорі, із зворотним новим рядком) я змінив код Jasonwryan наступним чином:

#!/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"

Або в Awk, трохи модифікований: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

Краще використовувати те, tputщо буде обробляти символи втечі залежно від можливостей виводу / терміналу. (Якщо термінал не може інтерпретувати \e[*кольорові коди, він буде "забруднений", що ускладнює зчитування виводу. (Або іноді, якщо ви отримаєте grepтакий вихід, ви побачите ці\e[* у результатах)

Дивіться цей підручник дляtput .

Ви можете написати:

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

Ось підручник для друку кольорового годинника в терміналі.

Також зауважте, що tputвсе-таки може надрукуватися символ втечі під час перенаправлення STDOUT у файл:

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

Щоб цього не сталося, встановіть tputзмінні, як запропоновано в цьому рішенні .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.