Jak wypisać pogrubiony tekst w Bash?

241

Piszę skrypt Bash, który drukuje tekst na ekranie:

echo "Some Text"

Czy mogę sformatować tekst? Chciałbym, żeby to było odważne.

JamesRat
źródło

Odpowiedzi:

427

Najbardziej kompatybilnym sposobem jest użycie tputodpowiednich sekwencji do wysłania do terminala:

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

wtedy możesz użyć zmiennych $boldi $normalsformatować rzeczy:

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

daje

to jest odważne, ale nie jest

psmears
źródło
2
To całkiem fajne. Jeśli dobrze rozumiem, jest to to samo co wstawianie znaków ucieczki, ale działałoby to w innych terminalach (nie VT100).
JamesRat
Zgadza się - wyszukuje odpowiednie kody zgodnie z wartością TERM.
psmears
2
Jeśli potrzebujesz podkreślić tekst, możesz dodać zmienną. Zauważ, że backticks są usuwane z formatowania komentarzy. Użyj tego samego formatu w odpowiedzi. tput smul
UNDERLINE
3
tputto świetne polecenie z dużą ilością poleceń do wielu różnych zadań.
Drew Noakes,
Próbuję zrobić coś podobnego do tego, co robi OP, ale z motdplikiem. Jak / gdzie miałbym zdefiniować zmienne $boldi $normalw tym przypadku?
Mat.
74

Aby zastosować styl do łańcucha, możesz użyć polecenia takiego jak:

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

Wyjaśnienie:

  • echo -e - -eOpcja oznacza, że ​​znaki specjalne (odwrócone) zostaną zinterpretowane
  • \ 033 - sekwencja ze znakiem ucieczki reprezentuje początek / koniec stylu
  • małe litery m - wskazują koniec sekwencji
  • 1 - Pogrubiony atrybut (więcej informacji poniżej)
  • [0m - resetuje wszystkie atrybuty, kolory, formatowanie itp.

Możliwe liczby całkowite to:

  • 0 - styl normalny
  • 1 - pogrubienie
  • 2 - Dim
  • 3 - Kursywa
  • 4 - podkreślony
  • 5 - miga
  • 7 - wstecz
  • 8 - Niewidoczny
avivamg
źródło
1
Dobre wytłumaczenie. Rozglądałem się za tym, co [0moferuje funkcjonalność, co dobrze to tłumaczy
Jeremy
Choć powinno być\033[0m
Jeremy
1
3- kursywą , przynajmniej w konsoli
David Tabernero M.
Jedno szkoda, że ​​Strikethrough był obsługiwany na Ubuntu i niektórych innych popularnych platformach.
Dark Star1,
45

Zakładam, że bash działa na terminalu kompatybilnym z vt100, w którym użytkownik nie wyłączył obsługi formatowania.

Najpierw włącz obsługę znaków specjalnych echoza pomocą -eopcji. Później użyj sekwencji ucieczki ansi ESC[1m, na przykład:

echo -e "\033[1mSome Text"

Więcej informacji o sekwencjach ucieczki ansi, na przykład tutaj: ascii-table.com/ansi-escape-sequences-vt-100.php

Michał Trybus
źródło
Dzięki. Znalazłem inne listy sekwencji ucieczki, ale ta, z którą się łączysz, jest bardzo obszerna!
JamesRat
18
Nie zapomnij zatrzymać pogrubionego formatowania na końcu łańcucha: echo -e "\033[1mSome Text\033[0m"w przeciwnym razie następujące wiersze twojego terminalu również będą pogrubione
mem
To rozwiązanie działa nawet z PHP-CLI, co stanowi przewagę nad innymi rozwiązaniami.
David
jeśli masz problemy z zapamiętywaniem \033można użyć \ejakecho -e "\e[1msome text\e[0m"
Felipe Alvarez
1
Oktalna sekwencja ucieczki jest dozwolona w JS (JavaScript)
Pat-Laugh
14

Teoretycznie tak:

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

Ale w praktyce można to interpretować jako kolor „wysokiej intensywności”.

(źródło: http://unstableme.blogspot.com/2008/01/ansi-escape-sequences-for-writing-text.html )

Roufamatic
źródło