¿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.
Respuestas:
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).
CSI
esESC [
, escrito$'\e['
en bash. La secuencia de escape para cambiar los atributos esCSI Ps m
.Zsh tiene una función conveniente para eso.
fuente
Puede incluir estas definiciones de color en un script o archivo fuente. Podría verse así.
Tenga en cuenta que debe restablecer los códigos de color ANSI después de cada instancia que invoque un cambio. El
tput sgr0
restablece 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.
fuente
Parece que el diseño no puede manejar el carácter
[0x1b]
delante del[
.La primera línea pone en negrita:
Para el tipo general, solo sé
y de los comentarios, gracias manatwork y GypsyCosmonaut:
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 bold
o^[[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
en bash, o un editor hexadecimal.
fuente
\e[4m
subrayado,\e[5m
parpadeante,\e[7m
invertido.echo -e "\x1b[3m italic"
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:
Nota: Usted necesita el
-e
eno necesita usar comillas simples. Escriba
man echo
para 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
CSI
reemplazarlo 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.fuente
\e
es menos asistida que\x1b
he encontrado. Lo óptimo para hacer sería ya seaesc=$'\e'
oesc=$'\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.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.