«Дружественные» имена цветов терминалов в скриптах оболочки?

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}."
jasonwryan
источник
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.
Тоби Спейт
7

В зш :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Жиль "ТАК - перестань быть злым"
источник
Также:print -P '%F{red}blah%f'
Стефан Шазелас
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"
Wildcard
источник
Или в 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который будет обрабатывать escape-символы в зависимости от возможностей вывода / терминала. (Если терминал не может интерпретировать \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переменные, как предложено в этом решении .

эль-teedee
источник