bash PS1 setup

9

Estoy tratando de configurar PS1 de la siguiente manera.

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

Y tengo algunas preguntas.

  • ¿Cuál es la diferencia entre "[\ e [32; 1m]" y \ e [32; 1m "? ¿Son lo mismo?
  • Después de ejecutar el comando 'exportar PS1', funciona bien, pero cuando doy la entrada de unos 20 caracteres, los caracteres se sobrescriben a medida que los adjunto. ¿Qué tiene de malo esto?
  • ¿Cuál es el significado de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

ADICIONAL

Después de algunas pruebas, obtuve el siguiente cambio que podría resolver el problema. Es decir, el formato "\ e" debe reemplazarse por el formato "\ [\ e".

Rojo = "\\ e [1; 31m" - no funciona
Rojo = "\ [\ e [1; 31m \]" - trabajando
prosseek
fuente

Respuestas:

12

Tengo una función auxiliar para establecer el indicador, y debido a que no quiero pasar más tiempo buscando referencias de código de escape, he codificado todos los valores de color del 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}"
}

Entonces puedes hacer:

PS1=$( set_prompt )

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

unset -f set_prompt

Aquí está el enlace que explica los códigos de terminal VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- comienza la secuencia de caracteres que no se imprimen
\]- termina la secuencia de caracteres que no se imprimen

  • ¿Cuál es la diferencia entre "[\ e [32; 1m]" y \ e [32; 1m "? ¿Son lo mismo?

No es lo mismo, y debería ser \[\e[32;1m\]'. Without[] `intentaría imprimir la secuencia en la consola.

  • ¿Cuál es el significado de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, significa establecer el fondo en negro, ENDCOLOR significa restablecer todos los atributos de texto, lo que significa 'darme el color predeterminado de la consola'

Alexander Pogrebnyak
fuente
+1 Muy lindo !!! No importa, copio esto a mi bashrc :)
Eldelshell
@Ubersoldat. De ningún modo.
Alexander Pogrebnyak
1
Use \$para cambiar automáticamente entre indicación raíz y no raíz.
Pausado hasta nuevo aviso.
9

Del manual de bash:

\[    comenzar una secuencia de caracteres que no se imprimen, que podría usarse para incrustar una secuencia de control de terminal en el aviso
\]    final, una secuencia de caracteres que no se imprimen

\[y \]no se pasan a la terminal. Le dicen a bash que los caracteres entre ellos no se imprimirán. Sin ellos, bash no podría saber que la secuencia que sigue al carácter de escape (e, g. [32;1m) No ocupa ningún espacio en la pantalla, lo que explica por qué no calculó correctamente la longitud de la solicitud cuando los omitió.

Tenga en cuenta que no ha sido muy consistente en su pregunta (o tal vez es solo un error con Markdown); debe tener una secuencia literal de barra diagonal inversa $PS1, no solo una llave (que se mostrará literalmente).

Las secuencias de escape que comienzan con \eson interpretadas por el emulador de terminal. Están documentados en el documento de secuencias de control Xterm (ctlseqs) (otros emuladores de terminal tienden a ser en su mayoría compatibles). Por ejemplo, \e[32;1mcambia a primer plano en negrita y verde; \e[40mcambia el color de fondo a negro; \e[0mrestaura los atributos predeterminados.

Gilles 'SO- deja de ser malvado'
fuente
3

La mayoría de los emuladores de terminal modernos pueden usar códigos de escape ANSI para controlar varios aspectos de la pantalla.

La mayoría de los códigos ANSI comienzan con el código de 2 caracteres ESC- [Ese es el carácter de escape (ASCII decimal 27) seguido del carácter de corchete abierto. Esta secuencia también se conoce como CSI o iniciador de secuencia de control.

Debido a que el carácter de escape no es uno, puede escribir directamente (la tecla Esc tiene otros usos, a menudo específicos de la aplicación) bash usa '\ e' para referirse a él.

Cambiar el color del texto utiliza el comando ANSI Set Graphics Mode:

\e[<value>m

donde <value>puede haber una lista de valores separados por punto y coma ( ;). Normalmente solo se usa un valor, aunque el atributo en negrita es útil junto con los atributos de color.

Mirando los valores enumerados en la respuesta de Alexander Pogrebnyak, el 0 o 1 antes del punto y coma selecciona negrita o no:

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

Hay una lista útil de los códigos aquí http://ascii-table.com/ansi-escape-sequences.php

dr-jan
fuente