Alterar fonte no comando echo

14

É possível alterar os atributos de fonte da saída do eco em zsh ou bash?

O que eu gostaria é algo parecido com:

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 seja impressa: "Esta é a fonte: normal, itálico , em negrito , pequena " dentro de uma linha de texto.

    
por Sardathrion 25.04.2012 / 10:15

4 respostas

14

Na maioria, se não em todos os emuladores de terminal, você não pode definir tamanhos de fonte diferentes ou fontes diferentes, apenas cores e alguns atributos (negrito, sublinhado, destaque).

No bash (ou em zsh ou qualquer outro shell), você pode usar as sequências de escape do terminal diretamente (com exceção de alguns exóticos, todos os terminais seguem a liderança do xterm atualmente). CSI é ESC [ , escrito $'\e[' no bash. A seqüência de escape para alterar os atributos é CSI Ps m .

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

O Zsh tem uma função conveniente para isso.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
    
por 27.04.2012 / 02:33
15

Você pode incluir essas definições de cor em um script ou arquivo de origem. Poderia ser algo assim.

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

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

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

tput sgr0

Observe que você deve redefinir os códigos de cores ANSI após cada instância que invocar uma alteração. O tput sgr0 redefine todas as alterações feitas no terminal.

Acredito que alterar o tamanho da fonte ou o itálico seria específico para o terminal que você está usando.

Embora este guia seja específico para personalizar seu prompt bash, é uma boa referência para códigos de cores e gera algumas ideias do que você pode fazer.

    
por 25.04.2012 / 14:17
5

Parece que o layout não pode manipular o [0x1b] -character na frente do [ .

A primeira linha fica em negrito:

 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 o tipo geral, só sei

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

e dos comentários, obrigado manatwork e GypsyCosmonaut:

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

e não sabe a diferença entre io-std e normal.

Eu não vi itálico ou pequeno no shell.

Você pode inseri-los (graças ao manatwork também) por Ctrl + v ESC no Bash, onde ele será exibido como% código%. Isso significa que toda a sequência ANSI se parecerá com ^[ ou ^[[1m bold (para evitar o espaço em branco antes de 'negrito').

Muitos editores têm problemas com (char) 0x1b. Alternativas: copiar / colar em algum lugar ou usar

echo -e "\x1b[1m bold"

no bash, ou um editor hexadecimal.

    
por 25.04.2012 / 13:37
0

Aqui:

link

(nota: muitos deles geralmente não funcionam, mas a maioria deles está marcada assim.)

Estou fazendo um jogo no terminal e confio muito no link acima. Ele ainda diz a você como esconder / mostrar o cursor, fazer cores (30's), "negrito" (mais claro), mais escuro, sublinhado, itálico, cor de fundo (40 em vez de 30), etc. Você também pode mudar a localização do cursor ( o que é muito útil - por exemplo, "\x1B[1A" move o cursor uma linha acima, "\x1B[0;0H" move o cursor para a linha 0, col 0; "\x1B[2J" limpa a tela; "\x1B[2K" limpa a linha.

Para seus propósitos, como as pessoas disseram:

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"

Observação: você precisa do -e em

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

ou você precisa usar aspas simples. Digite man echo para ver por que (aspas duplas geralmente são um problema ao imprimir; quando eu preciso de coisas para não expandir ou preciso de seqüências de escape ANSI, eu uso aspas simples porque é fácil - embora eu tenha me acostumado a fazer isso tantas vezes - para esquecer o -e , caso em que você recebe " box with numbers and letters [35; 1m").

Sempre que você vir CSI , substitua-o por "\x1b[" (ou "\e[" ou "\u1b[" ). "\x1b[" Eu acho que é mais padrão, mas eu realmente não sei qual é a diferença entre eles.

    
por 26.10.2014 / 21:21