Jedi Tux

Xdefaults VS Escape Sequences, Bash – Cores do Prompt

Posted in Bash, Dicas, Linux by Fernando Basso on 27 de dezembro de 2011

Leia todo o texto antes de tentar configurar algo. Algumas coisas que você ler mais no início do texto fará sentido quando se juntar com conceitos explicados mais adiante.

A intenção deste post não é mostrar TUDO sobre configuração do prompt do bash propriamente dito, mas sim mostrar a relação que tem as cores do terminal/prompt com as sequências de escape que usamos para configurar o prompt, pois sem essa noção, ficamos tentando configurar as cores “às cegas”. Esse tutorial funciona para o xterm, mas os conceitos são os mesmos para configurar outros emuladores de terminal.

Quando queremos configurar o prompt do Bash, usamos sequências de escape como:

    '\033[31m'
    

Faça um teste:

    echo -e "\033[31m Hello, World."

\033[ significa que estamos iniciando uma sequência de caracteres que não serão imprimidos, ou seja, inicia a sequência de escape. O próximo número (31, no exemplo) indica a cor que queremos imprimir, seguido de “m“, que termina a sequência de escape. O que vem em seguida é o texto que queremos realmente mostrar.

A parte numérica que determina a cor do texto pode indicar que queremos o texto em negrito, para isso, a sintaxe fica assim:

    echo -e '\033[31;1m Hello, World." # Note o ";1".

Ou seja, aquele 31;1, onde 31 é a cor, e 1 habilita o negrito. O número que especifica a cor e o número que habilita o negrito devem estar separados por ponto e vírgula (;). Mas agora vem a questão: 31 é qual cor? Aí é que entra o arquivo ~/.Xdefaults ou ~/.Xresourses.

No ~/.Xdefaults temos entradas como as do exemplo abaixo:


    ! Black, \033[30m
    XTerm*color0: #000000
    ! DarkGrey, \033[30;1m
    XTerm*color8: #BABDB6

    ! DarkRed, \033[31m
    XTerm*color1: #FF6565
    ! Red, \033[31;1m
    XTerm*color9: #FF8D8D

No ~/.Xdefaults usamos cores que vão de color0 até color15. As cores do color0 a color7 são cores normais, e de color8 até color15 são as cores em negrito, ou brilhosas.

Aqui temos um conceito importante. Note nos comentários (linhas iniciadas com !). Por exemplo, *color0 é a cor que será usada na sequência de escape \33[30m (cor normal), e a color8 será usada com a sequência \33[30;1m, ou seja, a cor em negrito. Continuando, color1 é usada pela sequência \33[31m (cor normal) e color9 é usada pela sequência \33[31;1m, a cor em negrito, e assim sucessivamente, até a color7 para cores normais, e color15 para os negritos.

Agora, configure as cores do xterm no ~/.Xdefaults da maneira que quiser, ou simplesmente copie as minhas (que pode modificar depois):

! ***** My Xterm Colors ***** ! {{{
! 1 to 7 are normal colors. 8 to 15 are the bright/bold ones.
XTerm*foreground: yellow
XTerm*background: #242424

! Black, \033[30m
XTerm*color0: #000000
! DarkGrey, \033[30;1m
XTerm*color8: #BABDB6

! DarkRed, \033[31m
XTerm*color1: #FF6565
! Red, \033[31;1m
XTerm*color9: #FF8D8D

! DarkGreen, \033[32m
XTerm*color2: green3
! Green, \033[32;1m
XTerm*color10: #C8E7A8

! DarkYellow, \033[33m
XTerm*color3: #EAB93D
! Yellow, \033[33;1m
XTerm*color11: #FFC123

! DarkBlue, \033[34m
XTerm*color4: #204A87
! Blue, \033[34;1m
XTerm*color12: #3465A4

! DarkMagenta, \033[35m
XTerm*color5: #CE5C00
! Magenta, \033[35;1m
XTerm*color13: #F57900

! DarkCyan, \033[36m
XTerm*color6: #89B6E2
! Cyan, \033[36;1m
XTerm*color14: #46A4FF

! LightGrey, \033[37m
XTerm*color7: #CCCCCC
! White, 0\33[37;1m
XTerm*color: #FFFFFF

! }}} Xterm ends here.

Para que as configurações entrem em vigor, execute o comando:

    xrdb ~/.Xdefaults

Feche e abra o terminal novamente. Lembre-se que isso funciona para o xterm. Não adianta usar o gnome-terminal (do gnome) ou o konsole (do kde). Agora sim estamos preparados para brincar com o prompt.

O prompt do bash é definido pela variável PS1 (tem a PS2 também, entre outras, que é usada quando continuamos um comando na próxima linha).

Vamos fazer uma configuração básica do prompt. Não precisa editar arquivo nenhum por enquanto, pois vamos fazer direto pelos comandos. Antes, porém, dê uma olhada nesta lista:

    \$ # Mostra o prompt de usuário '$', ou root '#'.
    \u # Mostra o username.
    \h # Mostra o hostname.
    \t # Mostra a hora (time).
    \d # Mostra a data (date).

Tem outros. man bash, na seção PROMPTING tem mais informações.

Digite o próximo comando, e veja como fica o prompt (não se preocupe, poi s essas alterações não são definitivas).

    PS1='\$ '

Agora tente este:

     PS1='\033[31m \$ '

Mais um:

    PS1='\033[31m\h@\u, \033[33m \s-v \033[0m\$'

Notou a diferença das cores? Vamos tentar com negrito (lembre-se, depende de como as cores foram configuradas no ~/.Xdefaults):

    PS1='\033[31;1m\h@\u, \033[33;1m \s-v, \033[0m\$ '

IMPORTANTE: Quando usamos uma cor, ela fica em vigor até sobrescrevermos ela usando outra. No final, temos que fazer a cor voltar ao modo padrão/default. Para isso usamos a sequência de escape:

    \033[0m

Aqui está uma configuração da minha variável PS1, juntamente com mais duas linhas, pois a minha PS1 depende dessas duas outras linhas:

    shopt -s checkwinsize # For hr='=='stuff to work.
    hr='============================================================================================================================================================='
    PS1='${hr::COLUMNS}\r\n\[\e[1;32m\]\s-\v, \[\e[0;32m\]\h@\u, \d \t \n\$PWD=\[\e[1;36m\]"\w" \[\e[1;37m\] \n\$ \[\e[1;37m\]'

Quem quiser tirar umas ideais, aqui estão minhas config filesno github.http://snipt.net/FernandoBasso/my-bashrc-dec-26-2011

Como eu disse no início, a intenção é mostrar a relação Xdefaults vs Escape Sequences. Tem vários tutoriais na web que tratam exclusivamente do prompt do bash. No entanto, nunca vi nenhum documento ou tutorial mencionar essa relação. Sem saber disso, ficamos configurando cores às cegas…

Descobri essa questão da relação Xdefaults/Escape Sequences perguntando no fórum do arch (em inglês), depois de levar as tradicionais broncas “vai ler no wiki”, ou “RTFM”. Ou seja, o pessoal adora assumir que os ‘aprendizes’ não gostam de ler e querem respostas prontas. PS: eu tinha lido metade da web tentando aprender mais sobre isso, e no wiki do arch também não menciona isso. :)

May the force be with you. Always.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: