Cambiar fuente en comando echo

16

¿Es posible cambiar los atributos de fuente de la salida de echo en zsh o bash?

Lo que me gustaría es algo parecido a:

echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".

para que imprima: "Esta es la fuente: normal, cursiva , negrita , pequeña " dentro de una línea de texto.

Sardathrion - Restablece a Monica
fuente
Esto tiene más que ver con el emulador de terminal en cuestión que con el shell utilizado. Este hilo de preguntas contiene algunos consejos valiosos, creo
sr_
Normalmente, no puede cambiar el tamaño de fuente. Lo único que generalmente puede hacer es cambiar el color y, a veces, el atributo negrita / subrayado. Para esto, puede usar secuencias de escape ANSI. Consulte, por ejemplo, bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html para ver algunos ejemplos.
jofel

Respuestas:

15

En la mayoría de los emuladores de terminal, si no en todos, no puede establecer diferentes tamaños de fuente o diferentes fuentes, solo colores y algunos atributos (negrita, subrayado, destacado).

En bash (o en zsh o cualquier otro shell), puede usar las secuencias de escape de terminal directamente (aparte de algunas exóticas, todas las terminales siguen el ejemplo de xterm en estos días). CSIes ESC [, escrito $'\e['en bash. La secuencia de escape para cambiar los atributos es CSI Ps m.

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

Zsh tiene una función conveniente para eso.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
Gilles 'SO- deja de ser malvado'
fuente
16

Puede incluir estas definiciones de color en un script o archivo fuente. Podría verse así.

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

Tenga en cuenta que debe restablecer los códigos de color ANSI después de cada instancia que invoque un cambio. El tput sgr0restablece todos los cambios que ha realizado en la terminal.

Creo que cambiar el tamaño de la fuente o la cursiva sería específico del terminal que está utilizando.

Si bien esta guía es específica para personalizar su indicador de bash, es una buena referencia para los códigos de color y genera algunas ideas de lo que puede hacer.

George M
fuente
5

Parece que el diseño no puede manejar el carácter [0x1b]delante del [.

La primera línea pone en negrita:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Para el tipo general, solo sé

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

y de los comentarios, gracias manatwork y GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

y no sé la diferencia entre io-std y normal.

No he visto cursiva o pequeña en la concha.

Puede ingresarlos (también gracias a manatwork) mediante Ctrl + v ESC en el Bash, donde se mostrará como ^[. Esto significa que toda la secuencia ANSI se verá ^[[1m boldo ^[[1mbold(para evitar el espacio en blanco antes de 'negrita').

Muchos editores tienen problemas con (char) 0x1b. Alternativas: copiar / pegar desde algún lugar, o usar

echo -e "\x1b[1m bold"

en bash, o un editor hexadecimal.

usuario desconocido
fuente
1
Los caracteres de escape se pueden escribir: Ctrl + V, Esc. (Se mostrará como “^ [” Esto significa que toda la secuencia ANSI se verá como “^ [[1mbold”..)
manatwork
1
Hay más atributos para mencionar: \e[4msubrayado, \e[5mparpadeante, \e[7minvertido.
manatwork
@manatwork: los agregó.
usuario desconocido
@userunknown Gracias por ayudar, jugando con su código, encontré que la cursiva esecho -e "\x1b[3m italic"
GypsyCosmonaut
0

Aquí:

http://en.wikipedia.org/wiki/ANSI_escape_code

(nota: muchos de ellos generalmente no funcionan, pero la mayoría de estos están marcados así).

Estoy haciendo un juego en la terminal y he dependido mucho del enlace de arriba. Incluso le indica cómo ocultar / mostrar el cursor, hacer color (30), "negrita" (más claro), más oscuro, subrayado, cursiva, color de fondo (40 en lugar de 30), etc. También puede cambiar la ubicación del cursor ( lo cual es muy útil, por ejemplo, "\x1B[1A"mueve el cursor una línea hacia arriba, "\x1B[0;0H"mueve el cursor a la fila 0, col 0, "\x1B[2J"borra la pantalla;"\x1B[2K" borra la línea.

Para sus propósitos como la gente ha dicho:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

Nota: Usted necesita el -een

echo **-e** "\x1b[35;1m Light purple \x1b[m"

o necesita usar comillas simples. Escriba man echopara ver por qué (las comillas dobles suelen ser una molestia al imprimir; cuando necesito cosas para no expandirme o necesito secuencias de escape ANSI, uso comillas simples porque es fácil, a pesar de que me acostumbré a hacerlo muchas veces - para olvidar el -e en cuyo caso obtienes " box with numbers and letters[35; 1m").

Cada vez que vea CSIreemplazarlo con "\x1b["(o "\e["o "\u1b["). "\x1b["Creo que es más estándar, pero realmente no sé cuál es la diferencia entre ellos.

Dylan
fuente
Si te gusta abarrotar tus cadenas con caracteres adicionales, no uses \ e :-)
clearlight
@clearlight No estoy seguro de lo que quiere decir. Creo que podría haber querido decir "use \ e". Sin embargo, \ees menos asistida que \x1bhe encontrado. Lo óptimo para hacer sería ya sea esc=$'\e'o esc=$'\x1b'(esto es en bash) y luego usar "${esc}[34;1m"(para, por ejemplo, azul brillante). Tengo un ejemplo semi-complejo aquí ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) para una cadena de petición verdadera fiesta;) Por favor, perdona el nombre de la cesión temporal - se puede agradecer a la gente en el canal de freenode # archlinux-offtopic para eso.
Dylan
La razón para hacerlo esc=$'\e'es que esto le permite a bash crear el personaje ansi-escape en el acto, y usted se beneficia de varias maneras. A veces, de hecho, (como se demuestra en el enlace github), que tiene que utilizar este método con el fin de obtener el color para mostrar correctamente. Para versiones anteriores de bash, así como el shell sh, debe (pero no necesita) usar este método para que aparezca el color ... siempre y cuando el terminal use las secuencias de escape que la mayoría de los terminales modernos hacen.
Dylan