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.
#
...

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

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.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.