Mudando a cor do texto e o plano de fundo do terminal?

73

Posso alterar a cor através da preferência, mas como posso alterar a cor do plano de fundo e do texto do terminal através da linha de comando?

TechJhola
fonte
permanente ou incidentalmente?
Jacob Vlijm
Você também pode usar dconf. Eu escrevi uma resposta para uma pergunta semelhante antes: askubuntu.com/a/628129/295286
Sergiy Kolodyazhnyy
\033[00;34mFOO\033[00m
Rafael Barros

Respostas:

50

Em determinados terminais compatíveis com XTerm / ANSI (como xterme gnome-terminal), é possível definir cores usando uma paleta maior que a paleta padrão de 8/16 cores (por exemplo, usando uma paleta de 88 cores, 256 cores ou 16777216 cores (RGB) ; ambos xterme gnome-terminalsuportam a paleta de 256 cores e a de 16777216 cores (RGB)); lembre-se de que o shell pode substituir isso (este é o caso, por exemplo, para zsh).

Aqui está um script para listar as cores na paleta de 256 cores, juntamente com o código de cores ANSI nos terminais compatíveis com XTerm / ANSI com suporte para paleta de 256 cores:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

screenshot1

captura de tela

Dependendo se você deseja aplicar a cor ao primeiro plano ou ao plano de fundo, use um <fg_bg>valor de 38ou 48(respectivamente) no seguinte comando:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

Por exemplo, para definir a cor do primeiro plano ( <fg_bg>= 38) como vermelho ( <ANSI_color_code>= 196) e a cor do plano de fundo ( <fg_bg>= 48) como preto ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

screenshot3

É necessário redesenhar o prompt usando printf '\e[K'para que a cor do plano de fundo seja aplicada a toda a linha e para que a cor do primeiro plano seja aplicada ao cursor:

screenshot4

O mesmo pode ser feito usando valores RGB em vez de códigos de cores ANSI em um terminal compatível; dependendo se você deseja aplicar a cor ao primeiro plano ou ao plano de fundo, use um <fg_bg>valor de 38ou 48(respectivamente) no seguinte comando:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

Por exemplo, para definir a cor do primeiro plano ( <fg_bg>= 38) como vermelho ( <R>= 255, <G>= 0, <B>= 0) e a cor do plano de fundo ( <fg_bg>= 48) como preto ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

captura de tela5

Novamente, é necessário redesenhar o prompt usando printf '\e[K'para que a cor do plano de fundo seja aplicada a toda a linha e para que a cor do primeiro plano seja aplicada ao cursor:

screenshot6

Usando um dos métodos, você pode usar printf '\e[0m'para redefinir todos os atributos:

screenshot7

kos
fonte
11
Ambos xterme gnome-terminalreconhecer a \ e [38/48; 2; R; G; sequências de escape verdadeira cor Bm; no entanto, xtermarredonda a cor real para a mais próxima em sua paleta de 256 cores. gnome-terminalexibe a cor exata exata fornecida na sequência de escape.
egmont
2
\ e [K é perigoso; em alguns emuladores (por exemplo xterm), se o cursor estiver na extremidade direita (visualmente exibido na coluna mais à direita, mas logicamente já além disso, já que um caractere já foi impresso na coluna à direita), a última letra será removida. Veja, por exemplo, bugzilla.gnome.org/show_bug.cgi?id=740789 ou savannah.gnu.org/bugs/?36831 .
egmont
Me corrigindo: se você emitir \ e [K no início da linha (no início do prompt, e não no final), é claro que é seguro. (Não funciona com prompt de várias linhas ou comando embora.)
Egmont
@egmont Obrigado pelas informações úteis, vejo que no GNOME Bugzilla marcado como corrigido, é esse o caso? Não posso testar isso neste momento, por isso farei isso mais tarde para verificar se esse ainda é o caso (a menos que você responda primeiro) e incluir essas informações na resposta.
kos
As novas versões do gnome-terminal não eliminam esse caracter. Se este é o comportamento correto é questionável. Afinal, emuladores de terminais gráficos estão imitando alguns dispositivos antigos. Devemos emular suas decisões ruins de design (como o xterm faz aqui), ou devemos substituir (como fazemos no gnome-terminal)? É uma pergunta difícil, sem uma única resposta correta.
egmont
33

Informações encontradas nesta página , excluindo a coluna de visualização:

As sequências são compostas pelo caractere Escape (geralmente representado por ” ^[” ou ” <Esc>”) seguido por outros caracteres: ” ^[FCm” (onde FCé um dos números na lista com marcadores abaixo).

Em bash, o Esccódigo pode ser um dos seguintes:

  1. \e
  2. \033 (octal)
  3. \x1B (hexadecimal)

Nota 1: A \e[0msequência " " remove todos os atributos (formatação e cores). Pode ser uma boa ideia adicioná-lo ao final de cada texto colorido.

Nota 2: As cores de primeiro e segundo plano podem variar, dependendo da configuração do terminal e nem todas as cores são suportadas .

Definir / Redefinir

  • 0: Redefina / remova todos os atributos de modificador, primeiro plano e plano de fundo: echo -e "\e[0mNormal Text"
  • 1: Negrito / Brilhante: echo -e "Normal \e[1mBold"
  • 2: Dim: echo -e "Normal \e[2mDim"
  • 4: Sublinhado: echo -e "Normal \e[4mUnderlined"
  • 5: Pisca (não funciona na maioria dos terminais, exceto no XTerm): echo -e "Normal \e[5mBlink"
  • 7: Inverter / Inverter: echo -e "Normal \e[7minverted"
  • 8: Oculto (útil para informações confidenciais): echo -e "Normal \e[8mHidden Input"
  • 21: Redefinir / remover negrito / claro: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Redefinir / remover dim: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Redefinir / remover sublinhado: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Redefinir / remover piscada: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Redefinir / remover reverso / invertido: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Redefinir / remover oculto: echo -e "Normal \e[8mHidden \e[28mNormal"

Primeiro plano

  • 39: Padrão (geralmente verde, branco ou cinza claro): echo -e "Default \e[39mDefault"
  • 30: Black: echo -e "Default \e[30mBlack"(melhor combinada com uma cor de fundo: echo -e "Default \e[30;107mBlack on white")
  • 31: Vermelho (não use com fundo verde)
  • 32: Verde
  • 33: Amarelo
  • 34: Azul
  • 35: Magenta / Roxo
  • 36: Ciano
  • 37: Cinza claro
  • 90: Cinza escuro
  • 91: Luz vermelha
  • 92: Luz verde
  • 93: Luz amarela
  • 94: Azul claro
  • 95: Magenta claro / Rosa
  • 96: Ciano claro
  • 97: Branco

fundo

  • 49: Cor de fundo padrão (geralmente preto ou azul)
  • 40: Preto
  • 41: Vermelho
  • 42: Verde
  • 43: Amarelo
  • 44: Azul
  • 45: Magenta / Roxo
  • 46: Ciano
  • 47: Cinza claro (não use em primeiro plano branco)
  • 100: Cinza escuro (não use com primeiro plano preto)
  • 101: Luz vermelha
  • 102: Verde claro (não use com o primeiro plano branco)
  • 103: Amarelo claro (não use com o primeiro plano branco)
  • 104: Azul claro (não use com o primeiro plano amarelo claro)
  • 105: Magenta claro / rosa (não use com o primeiro plano claro)
  • 106: Ciano claro (não use com o primeiro plano branco)
  • 107: Branco (não use com o primeiro plano claro)

Para definir as cores de primeiro e segundo plano de uma só vez, use o formulário echo -e "\e[S;FG;BGm". Por exemplo: echo -e "\e[1;97;41m"(primeiro plano em negrito em fundo vermelho)

Para 256 opções de cores, consulte a página de origem.

Agi Hammerthief
fonte
30

Mude as cores de forma incidental

Se se pretende alterar as cores de forma incidental :

Você pode usar o comando setterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

das cores, você pode escolher (frente e fundo):

black|blue|green|cyan|red|magenta|yellow|white|default

para mais opções:

setterm -help

Alterar as configurações do seu perfil (cor)

No 14.04, não encontrei uma opção dconfpara definir as cores ou o terminal. No entanto, você pode usargconftool

  • Você primeiro precisa obter o nome do seu perfil:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Em seguida, para definir as cores do texto do seu perfil:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    por exemplo, para definir a cor do texto como branco

    O mesmo com a cor de fundo:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    por exemplo, para definir a cor do plano de fundo como preto

Alternativamente, para definir o nome da (s) cor (es), você pode simplesmente usar whiteou green, na mesma paleta que o comando setterm, por exemplo:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black
Jacob Vlijm
fonte
11
Esses devem ser traços duplos no comando setterm inicial.
user1770201
Trabalhou em 14.04, mas não em 16.04 (beta; não tenho certeza se esse é o motivo) ... Ainda assim, dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"o truque.
Janaka Bandara
Não funciona no Ubuntu 1704, parece ruim
Wax gaiola
11
gconftool-2(para o Ubuntu 14.04 e talvez algumas versões seguintes), ou dconfou gsettingsem versões mais recentes de configurações de mudança Ubuntu gnome-terminal, e ter efeito imediato sobre todas as abas e janelas do mesmo perfil. Eu não acho que o OP estava procurando por esse comportamento.
egmont
5

Os vários códigos de cores usados ​​para obter impressões coloridas também podem ser usados ​​para obter fundos coloridos :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

Portanto, o seguinte comando torna meu fundo vermelho:

$ echo -e '\e[0;41m'

Dependendo do shell, do emulador de terminal etc., talvez você não precise do -e.

muru
fonte
3

Consulte a resposta da kos para mudar o primeiro plano ou o plano de fundo para uma cor específica da paleta, ou mesmo uma cor RGB direta em alguns terminais. O efeito dessa sequência dura até que uma cor diferente seja selecionada (ou revertida para o padrão).

Outra abordagem, suportada por alguns emuladores de terminal, é redefinir os valores exatos de RGB das cores de primeiro plano e de fundo padrão do terminal usando as seqüências de escape OSC 10/11:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

É provável que dure muito mais tempo (até ser substituído por outro OSC 10/11 ou redefinido via OSC 110/111), mas, diferentemente da abordagem do dconf, isso ainda afeta apenas o terminal atual.

Egmont
fonte