Як виводиться один жирний текст у Bash?


241

Я пишу сценарій Bash, який друкує текст на екран:

echo "Some Text"

Чи можна форматувати текст? Я хотів би зробити це сміливим.

Відповіді:


427

Найбільш сумісний спосіб це використовувати tputдля виявлення правильних послідовностей для надсилання до терміналу:

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

тоді ви можете використовувати змінні $boldта $normalвідформатувати речі:

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

дає

це сміливо, але це не так


2
Це досить вишукано. Якщо я правильно розумію, це те саме, що вставляти провідники, але це працювало б в інших терміналах (не VT100).
JamesRat

Це правильно - він шукає відповідні коди відповідно до значення TERM.
psmears

2
Якщо у вас є необхідність підкреслити текст, ви можете додати змінну. Зауважте, що основи видаляються з форматування коментарів. Використовуйте той самий формат у відповіді. UNDERLINE =tput smul
jayem

3
tputце чудова команда з великою кількістю команд для багатьох різних завдань.
Дрю Ноакс

Я намагаюся щось подібне до того, що робить ОП, але з motdфайлом. Як / де я б визначив $boldі $normalзмінні у цьому випадку?
Метт

74

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

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

Пояснення:

  • echo -e - The-e Опція означає, що уникнуті (зворотні) рядки будуть інтерпретовані
  • \ 033 - відхилена послідовність являє собою початок / кінець стилю
  • мале m - означає кінець послідовності
  • 1 - Жирний атрибут (детальніше див. Нижче)
  • [0м - скидає всі атрибути, кольори, форматування тощо.

Можливі цілі числа:

  • 0 - Нормальний стиль
  • 1 - Сміливий
  • 2 - Дим
  • 3 - Курсив
  • 4 - Підкреслена
  • 5 - моргає
  • 7 - Реверс
  • 8 - невидимий

1
Гарне пояснення. Оглядався, що [0mпропонує функціонал, і це добре пояснює
Джеремі

Хоча так і має бути\033[0m
Джеремі

1
3- курсивом , принаймні в консолі
Девід Табернеро М.

Одне бажання Strikethrough було підтримано на Ubuntu та деяких інших популярних платформах.
Темна зірка1

45

Я припускаю, що bash працює на сумісному vt100 терміналі, в якому користувач явно не вимикав підтримку форматування.

Спочатку ввімкніть підтримку спеціальних символів echo, скориставшись -eопцією. Пізніше використовуйте послідовність виходу ansi ESC[1m, як-от:

echo -e "\033[1mSome Text"

Більше про послідовності виходу ansi, наприклад, тут: ascii-table.com/ansi-escape-sequences-vt-100.php


Дякую. Я знайшов декілька списків послідовностей втечі, але той, з яким ви пов’язані, дуже великий!
JamesRat

18
Не забудьте зупинити жирне форматування в кінці рядка: echo -e "\033[1mSome Text\033[0m"інакше наступні рядки вашого терміналу будуть жирним шрифтом
пам’яті

Це рішення працює навіть з PHP-CLI, це перевага перед іншими рішеннями.
Девід

якщо у вас виникли труднощі з запам'ятовуванням, \033ви можете користуватися \eтаким чиномecho -e "\e[1msome text\e[0m"
Феліпе Альварес,

1
Послідовність втечі у
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-sequences-for-writing-text.html )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.