Как вывести жирный текст в Bash?

241

Я пишу сценарий Bash, который выводит некоторый текст на экран:

echo "Some Text"

Могу ли я отформатировать текст? Я хотел бы сделать это жирным шрифтом.

JamesRat
источник

Ответы:

427

Наиболее совместимый способ сделать это - использовать tputправильные последовательности для отправки на терминал:

bold=$(tput bold)
normal=$(tput sgr0)

тогда вы можете использовать переменные $boldи $normalформатировать вещи:

echo "this is ${bold}bold${normal} but this isn't"

дает

это смелый, но это не

psmears
источник
2
Это довольно изящно. Если я правильно понимаю, это то же самое, что вставка escape-символов, но это будет работать в других терминалах (не VT100).
JamesRat
Это правильно - он ищет соответствующие коды в соответствии со значением TERM.
psmears
2
Если вам нужно подчеркнуть текст, вы можете добавить переменную. Обратите внимание, что галочки удаляются из форматирования комментариев. Используйте тот же формат в ответе. UNDERLINE =tput smul
Jayem
3
tputотличная команда с большим количеством команд для множества различных задач.
Дрю Ноукс
Я пытаюсь что-то похожее на то, что делает ОП, но с motdфайлом. Как / где бы я определяю $boldи $normalпеременные в этом случае?
Мэтт
74

Чтобы применить стиль к вашей строке, вы можете использовать команду вроде:

echo -e '\033[1mYOUR_STRING\033[0m'

Объяснение:

  • echo -e - -eопция означает, что экранированные (с обратной косой чертой) строки будут интерпретироваться
  • \ 033 - экранированная последовательность представляет начало / конец стиля
  • строчная m - указывает на конец последовательности
  • 1 - Атрибут Bold (подробнее см. Ниже)
  • [0m - сбрасывает все атрибуты, цвета, форматирование и т. Д.

Возможные целые числа:

  • 0 - нормальный стиль
  • 1 - жирный
  • 2 - тусклый
  • 3 - Курсив
  • 4 - подчеркнуто
  • 5 - мигает
  • 7 - обратный
  • 8 - Невидимый
avivamg
источник
1
Хорошее объяснение. Искал то, что [0mпредлагает функциональность, и это хорошо объясняет
Джереми
Хотя это должно быть\033[0m
Джереми
1
3- курсивом , по крайней мере, в консоле
Дэвид Табернеро М.
Хочется, чтобы Strikethrough был поддержан на Ubuntu и некоторых других популярных платформах.
Dark Star1
45

Я предполагаю, что bash работает на vt100-совместимом терминале, в котором пользователь явно не отключил поддержку форматирования.

Во-первых, включите поддержку специальных символов echo, используя -eопцию. Позже, используйте escape-последовательность ANSI ESC[1m, например:

echo -e "\033[1mSome Text"

Подробнее об экранирующих последовательностях ANSI, например, здесь: ascii-table.com/ansi-escape-sequence-vt-100.php

Михал Трыбус
источник
Спасибо. Я нашел несколько других списков escape-последовательностей, но тот, на который вы ссылались, очень обширный!
JamesRat
18
Не забудьте прекратить форматирование жирным шрифтом в конце строки: в echo -e "\033[1mSome Text\033[0m"противном случае следующие строки вашего терминала будут также выделены жирным шрифтом
mems
Это решение работает даже с PHP-CLI, это преимущество перед другим решением.
Дэвид
если у вас есть проблемы с запоминанием, \033вы можете использовать \eкакecho -e "\e[1msome text\e[0m"
Фелипе Альварес
1
В JS (JavaScript) разрешена восьмеричная escape-последовательность
Pat-Laugh,
14

По идее так:

# BOLD
$ echo -e "\033[1mThis is a BOLD line\033[0m"
This is a BOLD line

# Using tput
tput bold 
echo "This" #BOLD
tput sgr0 #Reset text attributes to normal without clear.
echo "This" #NORMAL

# UNDERLINE
$ echo -e "\033[4mThis is a underlined line.\033[0m"
This is a underlined line. 

Но на практике его можно интерпретировать как цвет "высокой интенсивности".

(источник: http://unstableme.blogspot.com/2008/01/ansi-escape-sequence-for-writing-text.html )

roufamatic
источник