Alterar fonte no comando echo


16

É possível alterar os atributos de fonte da saída de eco no zsh ou no 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 imprima: "Esta é a fonte: normal, itálico , negrito , pequeno " em uma linha de texto.


Isso tem mais a ver com o emulador de terminal em questão do que com o shell usado. Acho que esta discussão contém alguns ponteiros valiosos,
sr_

Normalmente, você não pode alterar o tamanho da fonte. A única coisa que você geralmente pode fazer é mudar de cor e, às vezes, o atributo negrito / sublinhado. Para isso, você pode usar seqüências de escape ANSI. Veja, por exemplo, bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html para alguns exemplos.
Jofel

Respostas:


15

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

No bash (ou no zsh ou em qualquer outro shell), você pode usar as seqüências de escape do terminal diretamente (além de algumas exóticas, todos os terminais seguem o exemplo do xterm atualmente). CSIé ESC [escrito $'\e['em bash. A sequência de escape para alterar 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

16

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

#!/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

Observe que você deve redefinir os códigos de cores ANSI após cada instância que você chama uma alteração. As tput sgr0redefinições de todas as mudanças que você fez 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 do bash, é uma boa referência para códigos de cores e gera algumas idéias sobre o que você pode fazer.


5

Parece que o layout não pode lidar com o [0x1b]caractere 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, eu sei apenas

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

e pelos 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 à manatwork também) por Ctrl + v ESC no Bash, onde será exibido como ^[. Isso significa que toda a sequência ANSI terá a aparência ^[[1m boldou ^[[1mbold(para evitar o espaço em branco antes de 'negrito').

Muitos editores têm problemas com (char) 0x1b. Alternativas: copie / cole em algum lugar ou use

echo -e "\x1b[1m bold"

no bash ou em um editor hexadecimal.


11
Os caracteres de escape podem ser digitados: Ctrl + V, Esc. (Será exibido como “^ [” Isso significa a seqüência ANSI inteiro vai olhar como “^ [[1mbold”..)
manatwork

11
Há mais atributos a serem mencionados: \e[4msublinhado, \e[5mpiscando, \e[7minvertido.
manatwork

@ manatwork: adicionou-os.
usuário desconhecido

Graças @userunknown para ajudar, mexer com o seu código, achei itálico éecho -e "\x1b[3m italic"
GypsyCosmonaut

0

Aqui:

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

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

Estou fazendo um jogo no terminal e confiei bastante no link acima. Ele também mostra como ocultar / exibir o cursor, tornar a cor (anos 30), "negrito" (mais claro), mais escuro, sublinhado, itálico, cor de plano de fundo (anos 40 em vez de anos 30), etc. Você também pode alterar a localização do cursor ( o que é muito útil - por exemplo, "\x1B[1A"move o cursor para cima uma linha; "\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"

Nota: Você precisa o -eem

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

ou você precisa usar aspas simples. Digite man echopara saber por que (aspas duplas geralmente são difíceis de imprimir; quando preciso que as coisas não sejam expandidas ou sequências de escape ANSI), uso aspas simples porque é fácil - mesmo que eu me acostumei a fazê-lo tantas vezes - para esquecer o -e , nesse caso, você obtém " box with numbers and letters[35; 1m").

Toda vez que você vir CSIsubstituí-lo 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.


Se você gosta de bagunçar suas seqüências de caracteres com caracteres extras, não use \ e :-)
clearlight

@ Clearlight Não sei o que você quer dizer. Eu acho que você poderia dizer "use \ e". No entanto, \eé menos suportado do que \x1beu encontrei. A melhor coisa a fazer seria esc=$'\e'ou esc=$'\x1b'( ou seja, no bash) e depois usar "${esc}[34;1m"(por exemplo, azul brilhante). Eu tenho um exemplo semi-complexo aqui ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) para uma sequência real de prompt do bash;) Perdoe o nome do repositório - você pode agradecer às pessoas no canal do freenode # archlinux-offtopic para isso.
Dylan

A razão para fazer esc=$'\e'isso é que isso permite que o bash crie o personagem ansi-escape no local, e você se beneficia dele de várias maneiras. Às vezes, de fato (como é demonstrado no link do github), você precisa usar esse método para fazer com que a cor apareça corretamente. Para versões mais antigas do bash e do sh shell, você deve (mas não precisa) usar esse método para que a cor apareça ... desde que o terminal use as seqüências de escape que os terminais mais modernos fazem.
Dylan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.