Personalizar bash shell: negrita / colorear el comando

13

Hay una serie de tutoriales / publicaciones en línea (por ejemplo, http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) sobre cómo personalizar su solicitud en bash mediante la configuración PS1. ¿Hay alguna manera de personalizar el color / negrita del comando que escribo?

En otras palabras, como ejemplo, digamos que quería un indicador verde, un comando azul en negrita, y luego mostrar los colores predeterminados. En el siguiente ejemplo, ya sé cómo hacer que " joe>" se muestre como verde, azul, negrita, lo que sea mediante la configuración PS1. Pero, ¿hay alguna forma en que pueda hacer que se git statusmuestre tan audaz, por ejemplo?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...
jlarson
fuente
Si desea un shell realmente bueno, debe usar zsh, lo que desea lograr allí sería muy simple conpreexec() { printf '\e[0m' }
bollovan
3
@bollovan: 'Realmente bueno' es un poco subjetivo, me parece realmente detestable debido a su hinchazón y el incumplimiento de POSIX. Pero, lo que sea que haga flotar tu bote.
Chris Down
La hinchazón de @ChrisDown flota tu bote, nunca la escuché, es bastante divertida.
n611x007

Respuestas:

13

Tendría que dejar un color detrás de la PS1 (comience después >en su ejemplo), y luego use la DEBUGtrampa bash para borrar el color antes de ejecutar su comando (pero después de presionar enter en su shell. Pruebe algo como esto :

shopt -s extdebug
trap "tput sgr0" DEBUG
Chris Down
fuente
para alguien extraño escapar de los códigos: ¿esto preservaría el color original del comando (por ejemplo, ls --color=alwayssería coloreado)?
n611x007
@naxa: Sí, ya que esto establece explícitamente códigos de color (excepto los colores que están coloreados en el color del terminal predeterminado, que solo tendrá efecto después del primer color).
Chris Down
Este truco parece interferir con la finalización de la pestaña (imprime cosas raras como ^[(B^[[m). Sin embargo, solo ocurre en algunos sistemas: probé esto en dos sistemas, ambos con Ubuntu 12.04 LTS, y solo uno de ellos tuvo la interferencia.
musiphil
7

Para completar, he aquí cómo configurar un color de solicitud y el color de entrada de la línea de comando en bash. Pon estas líneas en tu .bashrc.

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

La trampa DEBUG, como lo sugiere Chris Down , se usa para restablecer los atributos de texto. Está destinado a la depuración, pero también es útil ejecutar código antes de ejecutar el comando escrito por el usuario .

En la configuración del indicador:

  • \[…\] se usa alrededor de secuencias de escape para decirle a bash que no usan ningún espacio de la pantalla (sin ellos, la pantalla se volvería confusa cuando bash necesite volver a dibujar el indicador).
  • \e[…mdonde es un número, o más generalmente una secuencia de números separados por punto y coma, es una secuencia de escape enviada al terminal para afectar el color y otros atributos del siguiente texto. Por ejemplo, 1;34establece negrita azul; 0;32restablece todos los atributos y luego cambia el color a verde. Ajustar al gusto.
  • \w\$ imprimir el directorio actual y $ o #. Por supuesto, puede cambiar esto a lo que quiera e insertar cambios de atributos de texto en el medio si lo desea.
  • Hay un cambio final de atributo al final, que establece el color de la entrada de texto.
Gilles 'SO- deja de ser malvado'
fuente
Para su información, los códigos / secuencias de colores bash se pueden consultar aquí: misc.flogisoft.com/bash/tip_colors_and_formatting
kaiwan
0

Estoy aprendiendo acerca de los comandos BASH y he estado sentado aquí jugando con los comandos de color en mi versión. Descubrí esta solución:

Usando este comando:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Deconstruir: PS1 =: inicia el comando PS1

'': contiene el comando entre comillas simples (por lo que BASH no cree que sea un comando para él)

\: cada comando individual comienza con esto

[]: contiene cada comando

\ e (también podría ser \ 033 un carácter de escape ASCII): inicia un comando de color

El comando de color precede a lo que se aplica.

[\ e [0; 36m]: cian

\ h: nombre de host

'>': impreso después del nombre del host

[\ e [0; 31m]: rojo

Aparentemente, el comando rojo al final hace que la entrada sea roja. Simplemente cambie los colores a su gusto y eso es lo que está buscando.

Además, este sitio me ayudó un poco:

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

Mi versión: GNU bash, v. 4.2.46

Cuídate,

Comadreja

Comadreja
fuente