Как изменить цвет вывода эха в Linux

1742

Я пытаюсь напечатать текст в терминале с помощью команды echo.

Я хочу напечатать текст красным цветом. Как я могу это сделать?

satheesh.droid
источник
30
Эта ссылка очень полезна: misc.flogisoft.com/bash/tip_colors_and_formatting
Pithikos
взгляните на это, на что я ответил на ваш вопрос: stackoverflow.com/a/48216286/3782119
Шаян Амани

Ответы:

2297

Вы можете использовать эти коды выхода ANSI :

Black        0;30     Dark Gray     1;30
Red          0;31     Light Red     1;31
Green        0;32     Light Green   1;32
Brown/Orange 0;33     Yellow        1;33
Blue         0;34     Light Blue    1;34
Purple       0;35     Light Purple  1;35
Cyan         0;36     Light Cyan    1;36
Light Gray   0;37     White         1;37

А затем используйте их в своем сценарии следующим образом:

#    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n"

который печатает loveкрасным.

Из комментария @ james-lim, если вы используете echoкоманду, обязательно используйте флаг -e, чтобы разрешить обратную косую черту .

# Continued from above example
echo -e "I ${RED}love${NC} Stack Overflow"

(не добавляйте "\n"при использовании echo, если вы не хотите добавлять дополнительную пустую строку)

Тобиас
источник
11
У меня не работает - вывод:\e[0;31mHello Stackoverflow\e[0m
Бен Гарольд
172
Вы пробовали это с "-e"? Это говорит, echoчтобы включить экранирование от обратной косой черты.
Джеймс Лим
142
В MacOSX \x1Bвместо \e. \033было бы хорошо для всех платформ.
Сяо
4
В файле свойств ant используйте unicode для esacpe, например, red = \ u001b [0; 31m
пользователь shonky linux,
20
Как и msanford, сделанный для tput, вот "ANSI-Rainbow"for (( i = 30; i < 38; i++ )); do echo -e "\033[0;"$i"m Normal: (0;$i); \033[1;"$i"m Light: (1;$i)"; done
каждый человек
971

Вы можете использовать команду awesome tput(предложенную в ответе Игнасио ) для создания управляющих кодов терминала для всех видов вещей.


Применение

Конкретные tputподкоманды обсуждаются позже.

непосредственный

Вызовите tputкак часть последовательности команд:

tput setaf 1; echo "this is red text"

Используйте ;вместо &&так, если tputошибки текст все еще показывает.

Переменные оболочки

Другой вариант - использовать переменные оболочки:

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

tputсоздает последовательности символов, которые интерпретируются терминалом как имеющие особое значение. Они не будут показаны сами. Обратите внимание, что они все еще могут быть сохранены в файлы или обработаны как входные данные программами, отличными от терминала.

Подстановка команд

Может быть удобнее вставить tputвывод непосредственно в ваши echoстроки, используя подстановку команд :

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

пример

Приведенная выше команда производит это в Ubuntu:

Снимок экрана цветного терминального текста


Команды цвета переднего плана и фона

tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape

Цвета следующие:

Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1

Существуют также не-ANSI версии функций настройки цвета ( setbвместо setabи setfвместо setaf), которые используют разные числа, не приведенные здесь.

Команды текстового режима

tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode

Команды перемещения курсора

tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal

Очистить и вставить команды

tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines

Другие команды

tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell

С Compiz шаткого окном , то belкоманда делает терминал раскачиваться на секунду , чтобы привлечь внимание пользователя.


Сценарии

tputпринимает скрипты, содержащие одну команду в строке, которые выполняются по порядку до tputвыхода.

Избегайте временных файлов, выводя многострочную строку и передавая ее по конвейеру:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

Смотрите также

  • Видеть man 1 tput
  • Смотрите man 5 terminfoполный список команд и более подробную информацию об этих опциях. (Соответствующая tputкоманда указана в Cap-nameстолбце огромной таблицы, которая начинается в строке 81.)
Дрю Ноакс
источник
13
Отличный ответ. Это тот, который помог мне больше всего. Для всех, кому было интересно то, что мне было интересно, $()это замена команды . Все, что tput af 1нужно, - это генерировать строку цветового кода, но коды не являются печатными символами, поэтому tput af 1один только ввод приведет к пустой строке вывода.
Крис Миддлтон
5
Примечание: если вы используете CygWin и не устанавливаете tputncurses
Enrico
3
tput также работает внутри sed для анализа разборчивых разноцветных текстов: gist.github.com/nickboldt/fab71da10bd5169ffdfa
nickboldt,
1
Для полного списка tputцветов проверьте этот ответ на Unix StackExchange
Эндрю
Я думаю, reset=`tput sgr0`должно быть reset=`tput sgr 0`, с пробелом.
Обезьяны
837

некоторые переменные, которые вы можете использовать:

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White

escape-символ в bash , hex и восьмеричном соответственно:

|       | bash  | hex    | octal   | NOTE                         |
|-------+-------+--------+---------+------------------------------|
| start | \e    | \x1b   | \033    |                              |
| start | \E    | \x1B   | -       | x cannot be capital          |
| end   | \e[0m | \x1m0m | \033[0m |                              |
| end   | \e[m  | \x1b[m | \033[m  | 0 is appended if you omit it |
|       |       |        |         |                              |

краткий пример:

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |

исключение bash:

Если вы собираетесь использовать эти коды в ваших специальных переменных bash

  • PS0
  • PS1
  • PS2 (= это для подсказки)
  • PS4

Вы должны добавить дополнительные escape-символы, чтобы могу правильно их интерпретировать. Без добавления дополнительных escape-символов это работает, но вы столкнетесь с проблемами при Ctrl + rпоиске в своей истории.

правило исключения для bash

Вы должны добавить \[перед любым начальным кодом ANSI и добавить \]после любых конечных.
Пример:
при регулярном использовании: \033[32mThis is in green\033[0m
для PS0 / 1/2/4: \[\033[32m\]This is in green\[\033[m\]

\[для начала последовательности непечатных символов
\]для конца последовательности непечатных символов

Совет: для запоминания вы можете сначала добавить, \[\]а затем поместить между ними код ANSI:
- \[start-ANSI-code\]
-\[end-ANSI-code\]

тип цветовой последовательности:

  1. 3/4 бит
  2. 8 бит
  3. 24 бит

Прежде чем погрузиться в эти цвета, вы должны знать о 4 режимах с этими кодами:

1. цветовой режим

Это изменяет стиль цвета, а не текста. Например, сделать цвет ярче или темнее.

  • 0 сброс
  • 1; легче, чем обычно
  • 2; темнее, чем обычно

Этот режим не поддерживается широко. Он полностью поддерживает Gnome-Terminal.

2. текстовый режим

Этот режим предназначен для изменения стиля текста, а не цвета.

  • 3; курсивный
  • 4; подчеркивание
  • 5; мигает (медленно)
  • 6; мигает (быстро)
  • 7; обеспечить регресс
  • 8; скрывать
  • 9; кросс-аут

и почти поддерживаются.
Например, KDE-Konsole поддерживает, 5;а Gnome-Terminal - нет, а Gnome поддерживает, 8;но KDE - нет.

3. режим переднего плана

Этот режим предназначен для раскрашивания переднего плана.

4. фоновый режим

Этот режим предназначен для раскрашивания фона.

В таблице ниже приведена сводная информация о 3/4-битной версии цвета ANSI

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       |
|          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    |
|          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|  text-mode | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      |
|          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      |
|          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      |
|          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   |
|          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground |
|          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground |
|          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| foreground | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      |
|         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      |
|         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      |
|         33 | \033[33m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[34m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[35m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[36m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[37m |         |       | white            | echo -e "\033[37m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| background | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      |
|         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      |
|         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      |
|         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      |
|         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      |
|         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  |
|         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      |
|         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

В таблице ниже приведена сводная информация о 8-битной версии цвета ANSI

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern |
|    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         |
|    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

8-битный быстрый тест:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

В таблице ниже приведена сводная информация о 24-битной версии цвета ANSI

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| foreground | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| background | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

несколько скриншотов

передний план 8-битной сводки в .gif

foreground.gif

фоновое 8-битное резюме в .gif

background.gif

сводка цветов с их значениями

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

blinking на KDE-терминале

KDE-мигает

простой Cкод, который показывает вам больше

cecho_screenshot

более продвинутый инструмент, который я разработал для работы с этими цветами:

Bline


цветная съемка

замирание нормальный яркий

текстовый режим выстрел

только текстовый режим

объединение в порядке

скомбинировать

больше выстрелов


Советы и рекомендации для опытных пользователей и программистов:

Можем ли мы использовать эти коды на языке программирования?

Да, ты можешь. Я испытал в, , , ,

Они замедляют скорость программы?

Я думаю нет.

Можем ли мы использовать их в Windows?

3/4-битный Да, если вы компилируете код с gcc
некоторыми снимками экрана на Win-7

Как рассчитать длину кода?

\033[ = 2, другие части 1

Где мы можем использовать эти коды?

Везде, где есть ttyпереводчик
xterm, gnome-terminal, kde-terminal, mysql-client-CLIи так далее.
Например, если вы хотите раскрасить вывод с помощью mysql, вы можете использоватьPerl

#!/usr/bin/perl -n
print "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g;

сохраните этот код в имени файла: pcc(= Perl Colorize Character) и затем поместите файл в действительный, а PATHзатем используйте его где угодно.

ls | pcc
df | pcc

в mysqlпервом регистре его pagerи затем попробовать:

[user2:db2] pager pcc
PAGER set to 'pcc'
[user2:db2] select * from table-name;

PCC

Это НЕ обрабатывать Unicode.

Эти коды только раскрашивают?

Нет, они могут сделать много интересного. Пытаться:

echo -e '\033[2K'  # clear the screen and do not move the position

или:

echo -e '\033[2J\033[u' # clear the screen and reset the position

Есть много начинающих, которые хотят очистить экран, system( "clear" )чтобы вы могли использовать это вместо system(3)вызова

Они доступны в Юникоде?

Да. \u001b

Какой вариант этих цветов предпочтительнее?

Это простой в использовании 3/4-bit, но он очень точный и красивый в использовании 24-bit.
Если у вас нет опыта работы сИтак, вот краткое руководство:
24 бита означает: 00000000и 00000000и 00000000. Каждый 8-бит предназначен для определенного цвета.
1..8для и 9..16для и 17..24для
так в #FF0000значит и вот оно: 255;0;0
в #00FF00означает, что здесь: 0;255;0
это имеет смысл? какой цвет вы хотите объединить с этими тремя 8-битными значениями.


ссылка:
Wikipedia
ANSI escape-последовательности
tldp.org
tldp.org
misc.flogisoft.com
некоторые блоги / веб-страницы, которые я не помню

Шакиба Мошири
источник
70
Никто больше не поражен этим ответом?
Бендж
14
Это определенно ответ зала славы, спасибо.
ForeverZer0
2
@NeilGuyLindberg без восьмеричных литералов эта ошибка является частью Node.js, а не сама по себе. Вы можете использовать x1B[для устранения этого.
Шакиба Мошири
5
Я прокрутил довольно далеко, чтобы подтвердить этот ответ!
РНК
1
Похоже, @ShakibaMoshiri написал диссертацию на эту тему xD Шутки отдельно, болеет за такой подробный ответ!
SH '
189

Используйте tputс setafвозможностью и параметром 1.

echo "$(tput setaf 1)Hello, world$(tput sgr0)"
Игнасио Васкес-Абрамс
источник
8
Это должно быть лучшим вариантом. то , что tput делает это прочтет терминал информации и сделать правильно сбежавший код ANSI для вас. код вроде \033[31mсломает библиотеку readline в некоторых терминалах.
Тянь Чен
44
Исследуйте цвета с помощью простой петли (увеличьте iверхнюю границу для большего количества оттенков):for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
msanford
2
Вот HOWTO по кодам tput: tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html
maxywb
tput: command not found(на альпийском)
галантный
127
echo -e "\033[31m Hello World"

[31mКонтролирует цвет текста:

  • 30- 37устанавливает цвет переднего плана
  • 40- 47устанавливает цвет фона

Более полный список цветовых кодов можно найти здесь .

Хорошей практикой является сброс цвета текста обратно \033[0mв конец строки.

neocanable
источник
2
echo -e "\ 033 [31m Hello World", [31m - цвет
неоканальный
36

Я только что объединил хорошие уловки во всех решениях и получил:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"
    YELLOW="\033[1;33m"
    # ... ADD MORE COLORS
    NC="\033[0m" # No Color

    printf "${!1}${2} ${NC}\n"
}

И вы можете просто назвать это как:

cecho "RED" "Helloworld"
Эндрю Нагиб
источник
1
Очень практично, мне просто нужно было заменить одинарные кавычки на двойные, чтобы ЗЕЛЕНЫЙ, ЖЕЛТЫЙ, NC, чтобы это работало в моем сценарии.
ionescu77
1
Отличное решение !!
Дэвид Кариуки
32

Это переключатель цвета \033[ . Смотрите историю .

Цветовые коды : 1;32(светло-зеленый), 0;34(синий), 1;34(светло-синий) и т. Д.

Мы выключили последовательность цветов с переключателем цвета \033[и 0m, в не -color код. Так же, как открытие и закрытие вкладок на языке разметки.

  SWITCH="\033["
  NORMAL="${SWITCH}0m"
  YELLOW="${SWITCH}1;33m"
  echo "${YELLOW}hello, yellow${NORMAL}"

Простое цветовое echoрешение:

cecho() {
  local code="\033["
  case "$1" in
    black  | bk) color="${code}0;30m";;
    red    |  r) color="${code}1;31m";;
    green  |  g) color="${code}1;32m";;
    yellow |  y) color="${code}1;33m";;
    blue   |  b) color="${code}1;34m";;
    purple |  p) color="${code}1;35m";;
    cyan   |  c) color="${code}1;36m";;
    gray   | gr) color="${code}0;37m";;
    *) local text="$1"
  esac
  [ -z "$text" ] && local text="$color$2${code}0m"
  echo "$text"
}

cecho "Normal"
cecho y "Yellow!"
Хорхе Букаран
источник
1
Я бы изменил последнюю textпеременную text="$color${@: 2}${code}0m"таким образом, что вся строка, кроме параметра цвета, будет окрашена.
Шаирон Толедо
@tomazahlin просто добавьте -e к эхо, как уже несколько раз упоминалось выше
Артем Медведев
Как предположил Уилфред Хьюз, его лучше использовать, tputпоскольку он более переносим - работает в Bash и на macOS. Поэтому я действительно предлагаю использовать функцию Алирезы Мириана из этого ответа: stackoverflow.com/a/23006365/2693875
Грег Дубицки
29

Отличный способ изменить цвет только для одного echo- определить такую ​​функцию:

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

Применение:

coloredEcho "This text is green" green

Или вы можете напрямую использовать цветовые коды, упомянутые в ответе Дрю :

coloredEcho "This text is green" 2
Алиреза Мириан
источник
Если вы добавите -nк эхо, то вы можете использовать его как встроенную раскраскуecho "Red `coloredEcho "fox" red` jumps over the lazy dog"
sobi3ch
24

Используйте tputдля расчета цветовых кодов. Избегайте использования escape-кода ANSI (например, \E[31;1mдля красного), потому что он менее переносим. Bash на OS X, например, не поддерживает его.

BLACK=`tput setaf 0`
RED=`tput setaf 1`
GREEN=`tput setaf 2`
YELLOW=`tput setaf 3`
BLUE=`tput setaf 4`
MAGENTA=`tput setaf 5`
CYAN=`tput setaf 6`
WHITE=`tput setaf 7`

BOLD=`tput bold`
RESET=`tput sgr0`

echo -e "hello ${RED}some red text${RESET} world"
Уилфред Хьюз
источник
18

На этот вопрос отвечали снова и снова :-), но почему бы и нет.

Первое использование tputболее переносимо в современных условиях, чем ручное введение кодов ASCII черезecho -E

Вот быстрая функция bash:

 say() {
     echo "$@" | sed \
             -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \
             -e "s/@red/$(tput setaf 1)/g" \
             -e "s/@green/$(tput setaf 2)/g" \
             -e "s/@yellow/$(tput setaf 3)/g" \
             -e "s/@blue/$(tput setaf 4)/g" \
             -e "s/@magenta/$(tput setaf 5)/g" \
             -e "s/@cyan/$(tput setaf 6)/g" \
             -e "s/@white/$(tput setaf 7)/g" \
             -e "s/@reset/$(tput sgr0)/g" \
             -e "s/@b/$(tput bold)/g" \
             -e "s/@u/$(tput sgr 0 1)/g"
  }

Теперь вы можете использовать:

 say @b@green[[Success]] 

получить:

Смелый-Зеленый Успех

Примечания о переносимости tput

Первый раз tput(1)исходный код был загружен в сентябре 1986 года

tput(1) была доступна в семантике X / Open curses в 1990-х (стандарт 1997 имеет семантику, упомянутую ниже).

Так что это ( довольно ) вездесущий.

Ахмед Масуд
источник
Это довольно круто! Не знал этого Можешь сказать что-нибудь о наличии tput? Доступно ли оно на большинстве серверов, на которых нет прав администратора для его установки? У вас есть ссылка на то, где эта техника была впервые «изобретена»?
Redsandro
3
tput - это совместимый со стандартами способ сделать это, когда он полностью независим от того, что вы знаете возможности терминала. Если терминал не поддерживает заданную возможность, он будет грациозно понижен до того, что он может делать, не выталкивая винтовые коды выхода.
Ахмед Масуд
1
Я прекратил использовать этот метод, поскольку он портит позицию курсора в строках bash. Он будет произвольно переноситься до конца строки и не будет возвращаться назад к началу строки при использовании home или клавиш со стрелками. Возвращаясь к неуклюжим ручным кодам выхода, эта проблема решается.
Redsandro
2
@Resandro - это потому, что вы используете его $PS1без \[...\]промежутков? Продолжайте использовать маркеры Bash PS1 со строками tput.
Тоби Спейт
Обратите внимание, что эта функция не полностью работает в MacOsX из-за различий в утилите sed: unix.stackexchange.com/questions/13711/…
Джефф
14

Спасибо @ k-Five за этот ответ

declare -A colors
#curl www.bunlongheng.com/code/colors.png

# Reset
colors[Color_Off]='\033[0m'       # Text Reset

# Regular Colors
colors[Black]='\033[0;30m'        # Black
colors[Red]='\033[0;31m'          # Red
colors[Green]='\033[0;32m'        # Green
colors[Yellow]='\033[0;33m'       # Yellow
colors[Blue]='\033[0;34m'         # Blue
colors[Purple]='\033[0;35m'       # Purple
colors[Cyan]='\033[0;36m'         # Cyan
colors[White]='\033[0;37m'        # White

# Bold
colors[BBlack]='\033[1;30m'       # Black
colors[BRed]='\033[1;31m'         # Red
colors[BGreen]='\033[1;32m'       # Green
colors[BYellow]='\033[1;33m'      # Yellow
colors[BBlue]='\033[1;34m'        # Blue
colors[BPurple]='\033[1;35m'      # Purple
colors[BCyan]='\033[1;36m'        # Cyan
colors[BWhite]='\033[1;37m'       # White

# Underline
colors[UBlack]='\033[4;30m'       # Black
colors[URed]='\033[4;31m'         # Red
colors[UGreen]='\033[4;32m'       # Green
colors[UYellow]='\033[4;33m'      # Yellow
colors[UBlue]='\033[4;34m'        # Blue
colors[UPurple]='\033[4;35m'      # Purple
colors[UCyan]='\033[4;36m'        # Cyan
colors[UWhite]='\033[4;37m'       # White

# Background
colors[On_Black]='\033[40m'       # Black
colors[On_Red]='\033[41m'         # Red
colors[On_Green]='\033[42m'       # Green
colors[On_Yellow]='\033[43m'      # Yellow
colors[On_Blue]='\033[44m'        # Blue
colors[On_Purple]='\033[45m'      # Purple
colors[On_Cyan]='\033[46m'        # Cyan
colors[On_White]='\033[47m'       # White

# High Intensity
colors[IBlack]='\033[0;90m'       # Black
colors[IRed]='\033[0;91m'         # Red
colors[IGreen]='\033[0;92m'       # Green
colors[IYellow]='\033[0;93m'      # Yellow
colors[IBlue]='\033[0;94m'        # Blue
colors[IPurple]='\033[0;95m'      # Purple
colors[ICyan]='\033[0;96m'        # Cyan
colors[IWhite]='\033[0;97m'       # White

# Bold High Intensity
colors[BIBlack]='\033[1;90m'      # Black
colors[BIRed]='\033[1;91m'        # Red
colors[BIGreen]='\033[1;92m'      # Green
colors[BIYellow]='\033[1;93m'     # Yellow
colors[BIBlue]='\033[1;94m'       # Blue
colors[BIPurple]='\033[1;95m'     # Purple
colors[BICyan]='\033[1;96m'       # Cyan
colors[BIWhite]='\033[1;97m'      # White

# High Intensity backgrounds
colors[On_IBlack]='\033[0;100m'   # Black
colors[On_IRed]='\033[0;101m'     # Red
colors[On_IGreen]='\033[0;102m'   # Green
colors[On_IYellow]='\033[0;103m'  # Yellow
colors[On_IBlue]='\033[0;104m'    # Blue
colors[On_IPurple]='\033[0;105m'  # Purple
colors[On_ICyan]='\033[0;106m'    # Cyan
colors[On_IWhite]='\033[0;107m'   # White


color=${colors[$input_color]}
white=${colors[White]}
# echo $white



for i in "${!colors[@]}"
do
  echo -e "$i = ${colors[$i]}I love you$white"
done

Результат

введите описание изображения здесь

Надеюсь, что это изображение поможет вам выбрать цвет для вашей башни: D

cyber8200
источник
Следует отметить, что для этого требуется bash v4.
Синокс
14

Если вы используете zshилиbash

black() {
    echo -e "\e[30m${1}\e[0m"
}

red() {
    echo -e "\e[31m${1}\e[0m"
}

green() {
    echo -e "\e[32m${1}\e[0m"
}

yellow() {
    echo -e "\e[33m${1}\e[0m"
}

blue() {
    echo -e "\e[34m${1}\e[0m"
}

magenta() {
    echo -e "\e[35m${1}\e[0m"
}

cyan() {
    echo -e "\e[36m${1}\e[0m"
}

gray() {
    echo -e "\e[90m${1}\e[0m"
}

black 'BLACK'
red 'RED'
green 'GREEN'
yellow 'YELLOW'
blue 'BLUE'
magenta 'MAGENTA'
cyan 'CYAN'
gray 'GRAY'

Попробуй онлайн

Вишал
источник
14

Мы можем использовать 24-битные RGB-цвета для текста и фона!

 ESC[38;2;⟨r⟩;⟨g⟩;⟨bm  /*Foreground color*/
 ESC[48;2;⟨r⟩;⟨g⟩;⟨bm  /*Background color*/

Пример красного текста и закрывающего тега:

 echo -e "\e[38;2;255;0;0mHello world\e[0m"

Генератор:

24-бит: Поскольку графические карты «истинного цвета» с 16–24 битными цветами стали обычным явлением, Xterm, Konsole KDE, а также все терминалы на основе libvte (включая терминал GNOME) поддерживают 24-битные настройки переднего плана и цвета фона https: / /en.wikipedia.org/wiki/ANSI_escape_code#24-bit

Безопасно ли использовать в моих сценариях?

Да! Терминалы 8 и 16 бит будут просто отображать как запасной цвет в диапазоне доступной палитры, сохраняя лучший контраст, без поломок!


Кроме того, никто не заметил полезности перевернутого видео с кодом ANSI 7 .

Он остается читаемым на любых цветовых схемах терминалов, черном или белом фоне или на других модных палитрах, меняя цвета переднего плана и фона.

Пример для красного фона, который работает везде:

echo -e "\033[31;7mHello world\e[0m";

Вот как это выглядит при изменении встроенных схем терминала:

введите описание изображения здесь

Это скрипт цикла, используемый для GIF.

for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world!";done

См. Https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

NVRM
источник
11

Эти коды работают на моей коробке Ubuntu:

введите описание изображения здесь

echo -e "\x1B[31m foobar \x1B[0m"
echo -e "\x1B[32m foobar \x1B[0m"
echo -e "\x1B[96m foobar \x1B[0m"
echo -e "\x1B[01;96m foobar \x1B[0m"
echo -e "\x1B[01;95m foobar \x1B[0m"
echo -e "\x1B[01;94m foobar \x1B[0m"
echo -e "\x1B[01;93m foobar \x1B[0m"
echo -e "\x1B[01;91m foobar \x1B[0m"
echo -e "\x1B[01;90m foobar \x1B[0m"
echo -e "\x1B[01;89m foobar \x1B[0m"
echo -e "\x1B[01;36m foobar \x1B[0m"

Это печатает буквы abcd всех разных цветов:

echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"

Для цикла:

for (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

введите описание изображения здесь

Эрик Лещинский
источник
2
Кстати: это не сильно зависит от установки конкретной версии Ubuntu, но с использованием PuTTY!
urzeit
11

Я нашел потрясающий ответ Шакибы Мошири, когда искал информацию по этой теме ... потом у меня появилась идея ... и она оказалась очень приятной функцией, чрезвычайно простой в использовании 😁
Так что я хочу поделиться ею 😉

https://github.com/ppo/bash-colors

Использование: $(c <flags>) внутри echo -eилиprintf

 ┌───────┬─────────────────┬──────────┐   ┌───────┬─────────────────┬──────────┐
  Code   Style            Octal        Code   Style            Octal    
 ├───────┼─────────────────┼──────────┤   ├───────┼─────────────────┼──────────┤
    -    Foreground       \033[3..       B    Bold             \033[1m  
    _    Background       \033[4..       U    Underline        \033[4m  
 ├───────┼─────────────────┼──────────┤      F    Flash/blink      \033[5m  
    k    Black            ......0m       N    Negative         \033[7m  
    r    Red              ......1m    ├───────┼─────────────────┼──────────┤
    g    Green            ......2m       L    Normal (unbold)  \033[22m 
    y    Yellow           ......3m       0    Reset            \033[0m  
    b    Blue             ......4m    └───────┴─────────────────┴──────────┘
    m    Magenta          ......5m 
    c    Cyan             ......6m 
    w    White            ......7m 
 └───────┴─────────────────┴──────────┘

Примеры:

echo -e "$(c 0wB)Bold white$(c) and normal"
echo -e "Normal text… $(c r_yB)BOLD red text on yellow background… $(c _w)now on
  white background… $(c 0U) reset and underline… $(c) and back to normal."
Паскаль Поллеунус
источник
10

Для удобства чтения

Если вы хотите улучшить читабельность кода, вы можете echoсначала добавить строку, а затем добавить цвет, используя sed:

echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 
Ooker
источник
1
Мне очень нравится этот ответ! Можете ли вы объяснить $ в команде sed?
Патрик
2
$ '<Что-то>' для bash, а не для sed. Он сообщает bash, что нужно обрабатывать \ e как escape-последовательность и вставлять в нее символ «escape». Обычно вы видите более простые формы, такие как $ '\ t' или $ '\ n', чтобы получить символ табуляции или новой строки, передаваемый в команда.
DSZ
8

Мой любимый ответ до сих пор цветной Echo.

Просто чтобы опубликовать другой вариант, вы можете проверить этот маленький инструмент xcol

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

вы используете его так же, как grep, и он будет окрашивать свой стандартный цвет, например, для каждого аргумента

sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT

пример xcol

Обратите внимание, что он принимает любое регулярное выражение, которое будет принимать sed.

Этот инструмент использует следующие определения

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

Я использую эти переменные в моих сценариях, как так

echo "${red}hello ${yellow}this is ${green}coloured${normal}"
nachoparker
источник
6

Чтобы расширить этот ответ , для ленивых из нас:

function echocolor() { # $1 = string
    COLOR='\033[1;33m'
    NC='\033[0m'
    printf "${COLOR}$1${NC}\n"
}

echo "This won't be colored"
echocolor "This will be colorful"
Mahn
источник
2
Не пытайтесь жестко закодировать терминал. Использование tput; вот для чего это!
Тоби Спейт
@TobySpeight Хотя это может быть правдой для мультиплатформенной поддержки (в теории), если постер находит, что она работает в их собственном мире, почему не соглашаются и отговаривают других в подобном мире от использования этой техники? Например, я пытаюсь подобное в Ubuntu 16.04 Bash, и это работает. Как единственный пользователь на этой платформе я нахожу этот ответ приемлемым. Я также буду использовать tputдля scи rcхотя (сохранить курсор, восстановить курсор). Хотя этот ответ называет меня «ленивым», его можно перефразировать как «практичный» или «прямо в точку».
WinEunuuchs2Unix
Мое собственное решение было похоже на это, ограничиваясь исключительно встроенными оболочками, потому что разветвление двух внешних процессов, подоболочек и т. Д. Для каждого сообщения в скрипте имело только ... неприятный запах.
Амит Найду
6

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

echo -e "\033[31;1mYour Message\033[0m"

-Черный 0; 30 темно-серый 1; 30

-Красный 0; 31 Светло-красный 1; 31

-Зеленый 0; 32 светло-зеленый 1; 32

-Коричневый / Оранжевый 0; 33 Желтый 1; 33

-Синий 0; 34 Голубой 1; 34

- фиолетовый 0; 35 светло-фиолетовый 1; 35

-Cyan 0; 36 Легкий Cyan 1; 36

-Светло-серый 0; 37 Белый 1; 37

Amirouche Zeggagh
источник
5

Вам определенно следует использовать tput поверх последовательностей управления ANSI.

Поскольку существует большое количество различных языков управления терминалом, обычно система имеет промежуточный уровень связи. Реальные коды ищутся в базе данных для текущего обнаруженного типа терминала, и вы передаете стандартизированные запросы API или (из оболочки) команде.

Одна из этих команд tput. tputпринимает набор аббревиатур, называемых именами возможностей и любыми параметрами, если необходимо, затем ищет правильные escape-последовательности для обнаруженного терминала в базе данных terminfo и печатает правильные коды (надеюсь, что терминал понимает).

с http://wiki.bash-hackers.org/scripting/terminalcodes

Тем не менее, я написал небольшую вспомогательную библиотеку под названием bash-tint , которая добавляет еще один слой поверх tput, что делает его еще более простым в использовании (imho):

Пример: tint "white(Cyan(T)Magenta(I)Yellow(N)Black(T)) is bold(really) easy to use."

Даст следующий результат: введите описание изображения здесь

ArtBIT
источник
5

Я вместо жесткого кодирования escape-кодов, специфичных для вашего текущего терминала, вы должны использовать tput .

Это мой любимый демонстрационный скрипт:

#!/bin/bash

tput init

end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
    eval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"
    [[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
    [[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echo
done

tput init

256 цветов выводятся по tput

Бруно Броноски
источник
4

Я использую это для цветной печати

#!/bin/bash
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF     |
#-------------------------+--------------------------------+---------+
#       Text color        |       Background color         |         |
#-----------+-------------+--------------+-----------------+         |
# Base color|Lighter shade| Base color   | Lighter shade   |         |
#-----------+-------------+--------------+-----------------+         |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black   |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red     |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green   |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow  |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue    |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan    |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White   |
#-------------------------{ Effects }----------------------+---------+
DEF='\e[0m'   #Default color and effects                             |
BLD='\e[1m'   #Bold\brighter                                         |
DIM='\e[2m'   #Dim\darker                                            |
CUR='\e[3m'   #Italic font                                           |
UND='\e[4m'   #Underline                                             |
INV='\e[7m'   #Inverted                                              |
COF='\e[?25l' #Cursor Off                                            |
CON='\e[?25h' #Cursor On                                             |
#------------------------{ Functions }-------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!'                   |
XY () { printf "\e[$2;${1}H$3"; }                                   #|
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v _L %$2s; printf -- "${_L// /$1}"; }             #|
# Create sequence like {0..(X-1)}                                    |
que () { printf -v _N %$1s; _N=(${_N// / 1}); printf "${!_N[*]}"; } #|
#--------------------------------------------------------------------+

Все основные цвета задаются как переменные, а также есть несколько полезных функций: XY, line и que. Поставьте этот скрипт в один из ваших и используйте все цветовые вариации и функции.

Иван
источник
3

И это то, что я использовал, чтобы увидеть все комбинации и решить, что читать круто:

for (( i = 0; i < 8; i++ )); do
    for (( j = 0; j < 8; j++ )); do
        printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"
    done
done
isntn
источник
2

Я написал свэг чтобы добиться именно этого.

Вы можете просто сделать

pip install swag

Теперь вы можете установить все escape-команды в виде txt-файлов в указанное место назначения с помощью:

swag install -d <colorsdir>

Или даже проще через:

swag install

Который установит цвета ~/.colors .

Либо вы используете их так:

echo $(cat ~/.colors/blue.txt) This will be blue

Или этот путь, который я считаю на самом деле более интересным:

swag print -c red -t underline "I will turn red and be underlined"

Проверьте это на asciinema !

throws_exceptions_at_you
источник
0

Вот простой небольшой скрипт, который я недавно написал, который раскрасит любой ввод по каналу вместо использования «Туалет».

File: color.bsh

#!/usr/bin/env bash 

## A.M.Danischewski 2015+(c) Free - for (all (uses and 
## modifications)) - except you must keep this notice intact. 

declare INPUT_TXT=""
declare    ADD_LF="\n" 
declare -i DONE=0
declare -r COLOR_NUMBER="${1:-247}"
declare -r ASCII_FG="\\033[38;05;"
declare -r COLOR_OUT="${ASCII_FG}${COLOR_NUMBER}m"

function show_colors() { 
   ## perhaps will add bg 48 to first loop eventually 
 for fgbg in 38; do for color in {0..256} ; do 
 echo -en "\\033[${fgbg};5;${color}m ${color}\t\\033[0m"; 
 (($((${color}+1))%10==0)) && echo; done; echo; done
} 

if [[ ! $# -eq 1 || ${1} =~ ^-. ]]; then 
  show_colors 
  echo " Usage: ${0##*/} <color fg>" 
  echo "  E.g. echo \"Hello world!\" | figlet | ${0##*/} 54" 
else  
 while IFS= read -r PIPED_INPUT || { DONE=1; ADD_LF=""; }; do 
  PIPED_INPUT=$(sed 's#\\#\\\\#g' <<< "${PIPED_INPUT}")
  INPUT_TXT="${INPUT_TXT}${PIPED_INPUT}${ADD_LF}"
  ((${DONE})) && break; 
 done
 echo -en "${COLOR_OUT}${INPUT_TXT}\\033[00m"
fi 

Затем назовите его красным цветом (196):
$> echo "text you want colored red" | color.bsh 196


источник
Логика цветовой петли была найдена в этом приличном учебнике по Ascii: misc.flogisoft.com/bash/tip_colors_and_formatting
-1

Ссылаться на:

echo_red(){
    echo -e "\e[1;31m$1\e[0m"
}
echo_green(){
    echo -e "\e[1;32m$1\e[0m"
}
echo_yellow(){
    echo -e "\e[1;33m$1\e[0m"
}
echo_blue(){
    echo -e "\e[1;34m$1\e[0m"
}
Майк
источник
Обратите внимание, что функция echo_green должна иметь код 32, а не 33. Невозможно редактировать b / c stackoverflow требует редактирования как минимум 6 символов.
Даниил
-2

Вот самое простое и удобочитаемое решение. Используя bashj ( https://sourceforge.net/projects/bashj/ ), вы просто выбираете одну из следующих строк:

#!/usr/bin/bash

W="Hello world!"
echo $W

R=130
G=60
B=190

echo u.colored($R,$G,$B,$W)

echo u.colored(255,127,0,$W)
echo u.red($W)
echo u.bold($W)
echo u.italic($W)

Y=u.yellow($W)
echo $Y
echo u.bold($Y)

256x256x256 цвета доступны, если у вас есть поддержка цветов в вашем терминальном приложении.

Fil
источник
-4

Подобно тому, как что-то немного там, пропуск через grep выделит его красным (но только красным). Вы также можете использовать именованные каналы, чтобы ваша строка была ближе к концу строки:

 grep '.*' --color=always <(echo "foobar")
FinalDuty
источник
вам не хватает возможности выбрать цвет по вашему выбору. также grep как утилита для раскрашивания действительно сомнительна: P
Ахмед Масуд
Не совсем, ОП особо упомянул, что они хотели красного цвета. Я согласен, что есть и лучшие варианты, чем использование grep, но он достигает того, о чем они просили, и избавляет от необходимости изучать что-то более сложное.
FinalDuty
-4

после смешивания других решений из потока вот как мне удалось получить цвета на npm scriptsвыходе (gitbash CLI):

{
    "deploy": "echo \u001b[1;32m && ng build && echo \u001b[1;0mdeploy {\u001b[1;33mcopy\u001b[1;0m: \u001b[1;32m0% && cp -r -f dist/packaged/* \\\\SERVER-01\\dist\\ && echo \u001b[1;0mdeploy {\u001b[1;33mcopy\u001b[1;0m} \u001b[1;34m\u001b[1;1m100% DEPLOYED"
}

введите описание изображения здесь

godblessstrawberry
источник
-5
red='\e[0;31m'
NC='\e[0m' # No Color
echo -e "${red}Hello Stackoverflow${NC}"

Этот ответ правильный, за исключением того, что призыв к цветам не должен быть внутри кавычек.

echo -e ${red}"Hello Stackoverflow"${NC}

Должен сделать свое дело.

Дейл Корнс
источник
3
Хорошо работает внутри кавычек. ключ -e также оценивает содержимое кавычек. Запуск обоих (внутри и снаружи кавычек) с помощью bash -x выводит одну и ту же выполненную команду echo -e '\e[0;31mHello Stackoverflow\e[0m'. То же самое относится и к Bash.
Нааб