bash PS1 setup

9

Estou tentando fazer o PS1 configurado da seguinte maneira.

Verde = "\ [\ e [32; 1m \]"
Vermelho = "\ e [0; 31m"
Roxo = "\ e [0; 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
exportar PS1 = "$ STARTCOLOR $ Verde \ u @ $ Roxo \ h $ Vermelho \ w $ Verde> $ 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 dou 20 caracteres à entrada, os caracteres são substituídos conforme anexo. O que há de errado nisso?
  • Qual é o significado de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

http://a.imageshack.us/img8/606/resultqm.jpg

ADICIONADO

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

Vermelho = "\\ e [1; 31m" - não está funcionando
Vermelho = "\ [\ e [1; 31m \]" - funcionando
prosseek
fonte

Respostas:

12

Eu tenho uma função auxiliar para definir 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 nele.

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 dos terminais do VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- seqüência inicial de caracteres não imprimíveis
\]- seqüência final de caracteres não imprimíveis

  • Qual é a diferença entre "[\ e [32; 1m]" e \ e [32; 1m "? Eles são iguais?

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

  • Qual é o significado de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

Alexander Pogrebnyak
fonte
+1 Muito bom !!! Não importa que eu copiar este para o meu bashrc :)
Eldelshell
@Ubersoldat. De modo nenhum.
Alexander Pogrebnyak
11
Use \$para alternar automaticamente entre as indicações raiz e não raiz.
Pausado até novo aviso.
9

No manual do bash:

\[    inicia uma sequência de caracteres não imprimíveis, que pode ser usada para incorporar uma sequência de controle de terminal no prompt e
\]    finaliza uma sequência de caracteres não imprimíveis

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

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

As seqüências de escape iniciadas com \esão interpretadas pelo emulador de terminal. Eles estão documentados no documento Xterm control sequences (ctlseqs) (outros emuladores de terminal tendem a ser principalmente compatíveis). Por exemplo, \e[32;1malterna para o primeiro plano em negrito e verde; \e[40mmuda a cor de fundo para preto; \e[0mrestaura os atributos padrão.

Gilles 'SO- parar de ser mau'
fonte
3

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

A maioria dos códigos ANSI começa com o código de 2 caracteres ESC- [Esse é o caractere de escape (ASCII decimal 27) seguido pelo caractere de colchete aberto. Essa sequência também é conhecida como CSI ou Control Sequence Initiator.

Como o caractere de escape não é aquele que você pode digitar diretamente (a tecla Esc tem outros usos, geralmente específicos do aplicativo), o bash usa '\ e' para fazer referência a ele.

A alteração da cor do texto usa o comando ANSI Set Graphics Mode:

\e[<value>m

onde <value>pode haver 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 cores.

Observando os valores listados na resposta de Alexander Pogrebnyak, o 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 http://ascii-table.com/ansi-escape-sequences.php

dr-jan
fonte