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

1221

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

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

Теги:
echo
command-line

23 ответа

1649

Вы можете использовать эти коды выхода 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, если вы не хотите добавлять дополнительную пустую строку)

  • 9
    У меня не работает - вывод: \e[0;31mHello Stackoverflow\e[0m
  • 147
    Вы пробовали это с "-e"? Это говорит echo чтобы включить экранирование обратной косой черты.
Показать ещё 7 комментариев
786

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


Использование

Конкретные подкоманды 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:

Изображение 3850


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

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

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

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

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 default
tput bel     # Play a bell

С помощью compiz wobbly windows команда 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.)
  • 8
    Отличный ответ. Это тот, который помог мне больше всего. Для всех, кому было интересно то, что мне было интересно, $() - это замена команды . Все, что делает tput af 1 , - это генерирует строку цветового кода, но коды не являются печатными символами, поэтому ввод только tput af 1 приведет к пустой строке вывода.
  • 5
    Примечание: если вы используете CygWin и не используете tput, установите ncurses
Показать ещё 2 комментария
507

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

# 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

[IMG_OUR_ID=3851.svg?sanitize=true]

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-символы, чтобы мог их правильно интерпретировать. Без этого добавления лишних символов персонажей он работает, но вы столкнетесь с проблемами, когда используете 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 бит

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

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

Он изменяет стиль цвета NOT text. Например, сделайте цвет ярким или темным.

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

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

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

Этот режим предназначен для изменения стиля текста NOT color.

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

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

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

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

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

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

[IMG_OUR_ID=3851.svg?sanitize=true]

В приведенной ниже таблице приведена сводка 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[32m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[32m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[32m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[32m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[32m |         |       | 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                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

[IMG_OUR_ID=3851.svg?sanitize=true]

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

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| 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

[IMG_OUR_ID=3851.svg?sanitize=true]

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

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| 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 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

[IMG_OUR_ID=3851.svg?sanitize=true]

некоторые скриншоты

8-битное резюме переднего плана в формате .gif

Изображение 3852

фоновая 8-битная сводка в .gif

Изображение 3853

цветовое резюме с их значениями

Изображение 3854 Изображение 3855 Изображение 3856 Изображение 3857

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

Изображение 3858

[IMG_OUR_ID=3859.svg?sanitize=true] простой C код, который показывает вам больше

Изображение 3860

[IMG_OUR_ID=3861.svg?sanitize=true] более продвинутый инструмент, который я разработал, чтобы справиться с этими цветами:
Изображение 3862


цветной режим выстрела

Изображение 3863

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

Изображение 3864

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

Изображение 3865

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


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

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

Да, ты можешь. Я наблюдал в , , , ,

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

Я думаю нет.

Можем ли мы использовать их в 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), а затем поместите файл a в действительный PATH затем используйте его в любом месте.

ls | pcc
df | pcc

внутри mysql сначала зарегистрируйте его для pager а затем попробуйте:

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

Изображение 3866

Он НЕ обрабатывает Юникод.

Убирают ли эти коды только раскраску?

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

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)

Доступны ли они в Unicode?

Да. \u001b

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

Легко использовать 3/4-bit, но очень точно и красиво использовать 24-bit.
Если у вас нет опыта работы с , значит, это быстрый учебник:
24 бита означают: 00000000 и 00000000 и 00000000. Каждый 8-бит предназначен для определенного цвета.
24..17 для [IMG_OUR_ID=3867.svg?sanitize=true] и 16..9 для [IMG_OUR_ID=3868.svg?sanitize=true] и 8..1 для [IMG_OUR_ID=3869.svg?sanitize=true]
Таким образом, в #FF0000 означает [IMG_OUR_ID=3867.svg?sanitize=true], и вот он: 255;0;0
в #00FF00 означает [IMG_OUR_ID=3868.svg?sanitize=true], который здесь: 0;255;0
Имеет ли это смысл? какой цвет вы хотите объединить с этими тремя 8-битными значениями.


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

значки:
[IMG_OUR_ID=3870.svg?sanitize=true]

  • 5
    вау, это .. в значительной степени покрывает это
  • 1
    Вау, спасибо за предоставленный список символов ANSI. Это очень помогло! Спасибо!
172

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

echo "$(tput setaf 1)Hello, world$(tput sgr0)"
  • 7
    Это должно быть лучшим вариантом. tput выполняет считывание информации о терминале и выводит для вас правильно экранированный код ANSI. код вроде \033[31m сломает библиотеку readline в некоторых терминалах.
  • 39
    Исследуйте цвета с помощью простого цикла (увеличьте верхнюю границу i для большего количества оттенков): for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
Показать ещё 1 комментарий
109
echo -e "\033[31m Hello World"

[31m управляет цветом текста:

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

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

Хорошая практика для reset цвета текста вернуться к \033[0m в конце строки.

  • 2
    echo -e "\ 033 [31m Hello World", [31m - это цвет
30

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

Цветовые коды выглядят как 1;32 (светло-зеленый), 0;34 (синий), 1;34 (голубой) и т.д.

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

  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" таким образом, вся строка, за исключением параметра цвета, будет окрашена.
  • 0
    @tomazahlin просто добавьте -e к echo, как уже упоминалось выше
25

Чистым способом изменения цвета только для одного 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

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

coloredEcho "This text is green" 2
  • 0
    Если вы добавите -n в echo, вы можете использовать его в качестве встроенной раскраски. echo "Red `coloredEcho "fox" red` jumps over the lazy dog"
18

Используйте 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"
15

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

Вначале использование 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]] 

получить:

Изображение 3871

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

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

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

Итак, он (довольно) вездесущий.

  • 0
    Это довольно круто! Не знал этого Можете ли вы сказать что-нибудь о доступности tput ? Доступно ли оно на большинстве серверов, на которых нет прав администратора для его установки? У вас есть ссылка на то, где эта техника была впервые «изобретена»?
  • 3
    tput - это совместимый со стандартами способ сделать это, когда он полностью независим от того, что вы знаете возможности терминала. Если терминал не поддерживает данную возможность, он будет грациозно понижен до того, что он может делать, не выталкивая винтовые коды выхода.
Показать ещё 4 комментария
11

Благодаря @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

Результат

Изображение 3872

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

10

Эти коды работают в моем поле Ubuntu:

Изображение 3873

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"

Это печатает буквы a b c d все в разных цветах:

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

Изображение 3874

  • 2
    Кстати: это не сильно зависит от установки конкретной версии Ubuntu, но с использованием PuTTY!
9

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

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

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

Мой любимый ответ пока цветенEcho.

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

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

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

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

Изображение 3875

Обратите внимание, что он принимает любое регулярное выражение, которое будет принимать 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}"
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"
  • 2
    Не пытайтесь жестко закодировать терминал. Используйте tput ; вот для чего это!
5

Никто не заметил полезности обратного видео ANSI 7.

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

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

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

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

Изображение 3876

Это сценарий цикла, используемый для 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

3

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

c_echo(){
    RED="\033[0;31m"
    GREEN='\033[0;32m'
    YELLOW='\033[1;33m'
    NC='\033[0m' # No Color

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

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

c_echo "RED" "Helloworld"
  • 1
    Я предпочитаю это решение больше всего.
  • 1
    Очень практично, мне просто нужно было заменить одинарные кавычки на двойные, чтобы ЗЕЛЕНЫЙ, ЖЕЛТЫЙ, NC, чтобы это работало в моем сценарии.
3

Вы должны обязательно использовать 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."

Дала бы следующий результат: Изображение 3877

3

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

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

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!

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
0

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

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

-2

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

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

Вот простейшее и читаемое решение. С 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 цветов доступны, если у вас есть поддержка цвета в приложении терминала.

-3
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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню