¿Cómo se genera un texto en negrita en Bash?

241

Estoy escribiendo un script Bash que imprime algo de texto en la pantalla:

echo "Some Text"

¿Puedo formatear el texto? Me gustaría ponerlo en negrita.

JamesRat
fuente

Respuestas:

427

La forma más compatible de hacerlo es utilizar tputpara descubrir las secuencias correctas para enviar al terminal:

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

entonces puedes usar las variables $boldy $normalformatear cosas:

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

da

esto es audaz pero esto no es

psmears
fuente
2
Eso es bastante ingenioso. Si entiendo correctamente, esto es lo mismo que insertar los escapes, pero funcionaría en otros terminales (no VT100).
JamesRat
Eso es correcto: busca los códigos apropiados de acuerdo con el valor de TERM.
Psmears
2
Si necesita subrayar texto, puede agregar una variable. Tenga en cuenta que los backticks se eliminan del formato de comentarios. Use el mismo formato en la respuesta. tput smul
SUBRAYADO
3
tputes un gran comando con muchos comandos para muchas tareas diferentes.
Drew Noakes
Estoy intentando algo similar a lo que está haciendo el OP, pero con un motdarchivo. ¿Cómo / dónde definiría las variables $boldy $normalen esa instancia?
Matt
74

Para aplicar un estilo en su cadena, puede usar un comando como:

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

Explicación:

  • echo -e : la -eopción significa que se interpretarán las cadenas escapadas (reducidas)
  • \ 033 - la secuencia escapada representa el comienzo / final del estilo
  • m minúscula : indica el final de la secuencia
  • 1 - Atributo en negrita (ver más abajo para más)
  • [0m : restablece todos los atributos, colores, formato, etc.

Los posibles enteros son:

  • 0 - Estilo normal
  • 1 - Negrita
  • 2 - tenue
  • 3 - Cursiva
  • 4 - Subrayado
  • 5 - Parpadeo
  • 7 - Reverso
  • 8 - Invisible
avivamg
fuente
1
Buena explicación. Estaba buscando qué funcionalidades [0mofrece y esto lo explica bien
Jeremy
Aunque debería ser\033[0m
Jeremy
1
3- cursiva , al menos en konsole
David Tabernero M.
Uno desearía que Strikethrough fuera compatible con Ubuntu y algunas de las otras plataformas populares.
Dark Star1
45

Supongo que bash se está ejecutando en un terminal compatible con vt100 en el que el usuario no desactivó explícitamente la compatibilidad con el formateo.

Primero, active el soporte para caracteres especiales en echo, usando la -eopción. Más tarde, use la secuencia de escape ansi ESC[1m, como:

echo -e "\033[1mSome Text"

Más información sobre las secuencias de escape ansi, por ejemplo aquí: ascii-table.com/ansi-escape-sequences-vt-100.php

Michał Trybus
fuente
Gracias. Encontré algunas otras listas de secuencias de escape, ¡pero la que vinculaste es muy extensa!
JamesRat
18
No olvide detener el formato en negrita al final de la cadena: de lo echo -e "\033[1mSome Text\033[0m"contrario, las siguientes líneas de su terminal también estarán en negrita
mems
Esta solución funciona incluso con PHP-CLI, eso es una ventaja frente a otra solución.
David
si tiene problemas para recordar \033puede usar \ecomoecho -e "\e[1msome text\e[0m"
Felipe Alvarez
1
La secuencia de escape octal está permitida en JS (JavaScript)
Pat-Laugh el
14

En teoría así:

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

Pero en la práctica puede interpretarse como color de "alta intensidad".

(fuente: http://unstableme.blogspot.com/2008/01/ansi-escape-sequences-for-writing-text.html )

roufamatic
fuente