bash configuração do PS1

7

Estou tentando configurar o PS1 da seguinte maneira.

Green="\[\e[32;1m\]"
Red="\e[0;31m"
Purple="\e[0;35m"
STARTCOLOR="\[\e[40m\]"
ENDCOLOR="\[\e[0m\]"
export PS1="$STARTCOLOR$Green\u@$Purple\h $Red\w$Green>$ENDCOLOR "

E eu tenho algumas perguntas.

  • Qual é a diferença entre "[\ e [32; 1m]" e \ e [32; 1m "? Eles são iguais?
  • Depois de executar o comando 'export PS1', ele funciona bem, mas quando eu dou a entrada em torno de 20 caracteres, os caracteres são sobrescritos conforme anexo. O que há de errado com isso?
  • Qual é o significado de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

link

ADICIONADO

Após alguns testes, obtive a seguinte alteração poderia resolver o problema. Ou seja, o formato "\ e" deve ser substituído por "\ [\" format.

Red="\e[1;31m" -- not working
Red="\[\e[1;31m\]" -- working
    
por prosseek 07.09.2010 / 20:28

3 respostas

10

Eu tenho uma função auxiliar para definir o prompt, e como não quero gastar mais tempo procurando referências de código de escape, codifiquei todos os valores de cores de texto.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Você pode então fazer:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

Aqui está o link que explica os códigos de terminal VT100: link

\[ - inicia a sequência de caracteres não imprimíveis em \] - sequência final de caracteres não imprimíveis

  • What's the difference between "[\e[32;1m]" and \e[32;1m"? Are they the same?

Não é o mesmo, e deveria ser \[\e[32;1m\]'. Without [] 'que tentaria imprimir a sequência no console.

  • What's the meaning of STARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)?

STARTCOLOR, significa definir plano de fundo para preto, ENDCOLOR significa redefinir todos os atributos de texto, o que significa 'me dê a cor padrão do console'

    
por 07.09.2010 / 21:27
6

Do manual do bash:

\[    begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\]    end a sequence of non-printing characters

\[ e \] não são passados para o terminal. Eles dizem que os personagens entre eles não serão impressos. Sem eles, o bash não poderia saber que a sequência que segue o caractere de escape (por exemplo, [32;1m ) não ocupa nenhum espaço na tela, o que explica por que ele não calculou o tamanho do prompt corretamente quando você os deixou fora.

Note que você não tem sido muito consistente na sua pergunta (ou talvez seja apenas um erro com o Markdown); você precisa ter uma sequência de barra invertida literal em $PS1 , não apenas um colchete (que seria exibido literalmente).

As seqüências de escape iniciadas com \e são interpretadas pelo emulador de terminal. Eles estão documentados no documento seqüências de controle Xterm (ctlseqs) (outros emuladores de terminal tendem a ser mais compatível). Por exemplo, \e[32;1m alterna para o primeiro plano em negrito e verde; \e[40m muda a cor de fundo para preto; \e[0m restaura os atributos padrão.

    
por 07.09.2010 / 23:51
2

A maioria dos emuladores de terminal modernos é capaz de usar códigos de escape ANSI para controlar vários aspectos da exibição.

A maioria dos códigos ANSI começa com o código de 2 caracteres ESC- [que é o caractere de escape (decimal ASCII 27) seguido pelo caractere de colchete quadrado aberto. Essa seqüência também é conhecida como o CSI ou o Iniciador da sequência de controle.

Como o caractere de escape não é um que você pode digitar diretamente (a tecla Esc tem outros usos, geralmente específicos da aplicação), o bash usa '\ e' para se referir a ele.

Alterar a cor do texto usa o comando ANSI Set Graphics Mode:

\e[<value>m

em que <value> pode ser uma lista de valores separados por ponto e vírgula ( ; ). Normalmente, apenas um valor é usado, embora o atributo negrito seja útil em conjunto com os atributos de cor.

Olhando para os valores listados na resposta de Alexander Pogrebnyak, 0 ou 1 antes do ponto-e-vírgula seleciona negrito ou não:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Há uma lista útil dos códigos aqui link

    
por 07.09.2010 / 21:42

Tags