LINUX.ORG.RU

Цветной вывод echo-сообщений в Bash в стиле mIRC

 ,


1

2

Делюсь кодом для раскраски сообщений выводимых через echo, который использую в своём проекте.

Использовать так:

. colours.sh
echo Bla bla bla | msg -2 --foreground "Light Red" --highlight

Где -1 это STDOUT, соответственно -2 для STDERR.

Можно указать --foreground, --background, --highlight и --bold.

Коды цветов связаны напрямую с mIRC, т.е. условно скажем, если в линуксовой консоли 0 (нулевой) это чёрный, 1 (первый) это красный, то в mIRC порядок немножечко другой, и красный там это 4 цвет. Если вы хоть раз в жизни пользовались IRC клиентом, то знаете, о чём речь. Порядок цветов именно такой, какой используется в IRC, просто мне так удобнее потому что в отличии от линуксовой консоли цвета mIRC я помню наизусть )) Но можете изменить порядок цветов как вам надо. Цвета можно использовать указывая их номер или их полное название, описание цветов в IRC тут: https://www.mirc.com/colors.html

echo "Bla Bla Bla" | msg -1 --foreground 9 --background 1

9 это зелный текст, 1 это чёрный фон.

Надеюсь это кому-нибудь окажется полезным.

#! /bin/sh -

msg() {
	STDOUT=""
	STDERR=""
	fore=""
	back=""
	ctrl=""
	sgr0=""
	while test "$1"; do
		case "$1" in
			"-1")		STDOUT="yes" ;;
			"-2")		STDERR="yes" ;;
			"--foreground")	fore="$2" ; shift ; ;;
			"--background")	back="$2" ; shift ; ;;
			"--highlight")	ctrl="$ctrl$SWITCH_HIGHLIGHT" ; ;;
			"--bold")	ctrl="$ctrl$SWITCH_BOLD" ; ;;
		esac
		shift
	done
	case "$fore" in
		"00"|"0"|"White")	fore="$FOREGROUND_00" ;;
		"01"|"1"|"Black")	fore="$FOREGROUND_01" ;;
		"02"|"2"|"Blue")	fore="$FOREGROUND_02" ;;
		"03"|"3"|"Green")	fore="$FOREGROUND_03" ;;
		"04"|"4"|"Light Red")	fore="$FOREGROUND_04" ;;
		"05"|"5"|"Brown")	fore="$FOREGROUND_05" ;;
		"06"|"6"|"Purple")	fore="$FOREGROUND_06" ;;
		"07"|"7"|"Orange")	fore="$FOREGROUND_07" ;;
		"08"|"8"|"Yellow")	fore="$FOREGROUND_08" ;;
		"09"|"9"|"Light Green")	fore="$FOREGROUND_09" ;;
		"10"|"Cyan")		fore="$FOREGROUND_10" ;;
		"11"|"Light Cyan")	fore="$FOREGROUND_11" ;;
		"12"|"Light Blue")	fore="$FOREGROUND_12" ;;
		"13"|"Pink")		fore="$FOREGROUND_13" ;;
		"14"|"Grey")		fore="$FOREGROUND_14" ;;
		"15"|"Light Grey")	fore="$FOREGROUND_15" ;;
		*)			fore="$FOREGROUND_DEFAULT" ;;
	esac
	case "$back" in
		"00"|"0"|"White")	back="$BACKGROUND_00" ;;
		"01"|"1"|"Black")	back="$BACKGROUND_01" ;;
		"02"|"2"|"Blue")	back="$BACKGROUND_02" ;;
		"03"|"3"|"Green")	back="$BACKGROUND_03" ;;
		"04"|"4"|"Light Red")	back="$BACKGROUND_04" ;;
		"05"|"5"|"Brown")	back="$BACKGROUND_05" ;;
		"06"|"6"|"Purple")	back="$BACKGROUND_06" ;;
		"07"|"7"|"Orange")	back="$BACKGROUND_07" ;;
		"08"|"8"|"Yellow")	back="$BACKGROUND_08" ;;
		"09"|"9"|"Light Green")	back="$BACKGROUND_09" ;;
		"10"|"Cyan")		back="$BACKGROUND_10" ;;
		"11"|"Light Cyan")	back="$BACKGROUND_11" ;;
		"12"|"Light Blue")	back="$BACKGROUND_12" ;;
		"13"|"Pink")		back="$BACKGROUND_13" ;;
		"14"|"Grey")		back="$BACKGROUND_14" ;;
		"15"|"Light Grey")	back="$BACKGROUND_15" ;;
		*)			back="$BACKGROUND_DEFAULT" ;;
	esac
	if test "$fore$back$ctrl"; then
		sgr0="$(tput sgr0)"
	fi
	if test "$STDOUT" = "yes"; then
		while read input; do
			echo "$fore$back$ctrl$input$sgr0" >&1
		done
	fi
	if test "$STDERR" = "yes"; then
		while read input; do
			echo "$fore$back$ctrl$input$sgr0" >&2
		done
	fi
}

mirc_colours_schema() {
	FOREGROUND_00="$(tput setaf 7)$(tput bold)"
	FOREGROUND_01="$(tput setaf 0)"
	FOREGROUND_02="$(tput setaf 4)"
	FOREGROUND_03="$(tput setaf 2)"
	FOREGROUND_04="$(tput setaf 1)$(tput bold)"
	FOREGROUND_05="$(tput setaf 1)"
	FOREGROUND_06="$(tput setaf 5)"
	FOREGROUND_07="$(tput setaf 3)"
	FOREGROUND_08="$(tput setaf 3)$(tput bold)"
	FOREGROUND_09="$(tput setaf 2)$(tput bold)"
	FOREGROUND_10="$(tput setaf 6)"
	FOREGROUND_11="$(tput setaf 6)$(tput bold)"
	FOREGROUND_12="$(tput setaf 4)$(tput bold)"
	FOREGROUND_13="$(tput setaf 5)$(tput bold)"
	FOREGROUND_14="$(tput setaf 0)$(tput bold)"
	FOREGROUND_15="$(tput setaf 7)"
	FOREGROUND_DEFAULT=""

	BACKGROUND_00="$(tput setab 7)$(tput bold)"
	BACKGROUND_01="$(tput setab 0)"
	BACKGROUND_02="$(tput setab 4)"
	BACKGROUND_03="$(tput setab 2)"
	BACKGROUND_04="$(tput setab 1)$(tput bold)"
	BACKGROUND_05="$(tput setab 1)"
	BACKGROUND_06="$(tput setab 5)"
	BACKGROUND_07="$(tput setab 3)"
	BACKGROUND_08="$(tput setab 3)$(tput bold)"
	BACKGROUND_09="$(tput setab 2)$(tput bold)"
	BACKGROUND_10="$(tput setab 6)"
	BACKGROUND_11="$(tput setab 6)$(tput bold)"
	BACKGROUND_12="$(tput setab 4)$(tput bold)"
	BACKGROUND_13="$(tput setab 5)$(tput bold)"
	BACKGROUND_14="$(tput setab 0)$(tput bold)"
	BACKGROUND_15="$(tput setab 7)"
	BACKGROUND_DEFAULT=""

	SWITCH_OFF="$(tput sgr0)"
	SWITCH_BOLD="$(tput bold)"
	SWITCH_UNDERLINE_ON="$(tput smul)"
	SWITCH_UNDERLINE_OFF="$(tput rmul)"
	SWITCH_HIGHLIGHT="$(tput blink)"
	SWITCH_REVERSE="$(tput rev)"
	SWITCH_DEFAULT=""
}

mirc_colours_schema
★★★★★

~$ curl dogs.sh

anonymous
()
Ответ на: комментарий от dsxl

всю строчку одним цветом красит

«Разделяй и властвуй.»

echo -n " Red Part " | msg -1 --foreground Red
echo -n " Blue Part " | msg -1 --foreground Blue
echo -n " Green Part " | msg -1 --foreground Green
echo ""

echo -n выводит текст без переноса, т.е. последующий echo останется на той же строке. Таким образом сообщение можно разделить на несколько и каждую его часть закрасить.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Я в курсе, но даже примитивный вывод управляющих последовательностей через переменные будет удобнее:

echo "${FG_RED}Red Part ${FG_BLUE}Blue Part ${FG_GREEN}Green Part${FG_DEFAULT}"
dsxl
()
Ответ на: комментарий от dsxl

ладно. в моём коде тоже сперва все контрольные коды записываются в переменные, а затем интерпретируются как 04, 4 или Light Red, т.е. тоже в конечном счёте можно воспользоваться простым ${FOREGROUND_04}.

дело вкуса, хочешь через echo -n сплит делай, хочешь переменные указывай.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от mord0d

1. Можно пример, например?

2. Это пост для тех кто занимается написанием ембеддедщины, /init например.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Можно пример, например?

Тебе уже выше ссылку кинули на одну из реализаций.

Это пост для тех кто занимается написанием ембеддедщины, /init например.

Тогда да, Perl будет оверхедом. Но в этом случае такие свистелки-перделки не нужны.

mord0d ★★★★★
()

mIRC порядок немножечко другой, и красный там это 4 цвет

Бред какой-то.

В ANSI хотя бы логика есть - RGB.

Что там запоминать?

\x1b[31m = красный, \x1b[32m; - зелёный, \x1b[33m; = 31 (красный) | 32 (зелёный) = жёлтый, \x1b[1;33m - 1 (яркий) + 31 (жёлтый) = ярко-жёлтый

А тут как? Зубрить только.

anonymous
()

Даешь true color! Благо ANSI позволяет.

anonymous
()
Ответ на: комментарий от anonymous

\x1b[1;33m

\x1b[1;5;7;33m самое оно.

Кстати, оказывается, что xterm включает мерцание только если окно в фокусе. Непорядок.

anonymous
()

Есть уже готовые утилиты с гораздо большей функциональностью.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.