Color Prompt Bash

Enviado por Froggy el 7 Agosto, 2010 - 20:41.

A los que nos gusta la línea de comandos aveces se nos hace dificil ver el pront en las tty's, cuando estamos trabajando en las mismas, pero para eso podemos diseñar un promt de Bash a la medida de nuestras necesidades.
A veces podemos pasar inadvertidos cuando estamos trabajando por varias horas lo que es un usuario sin poder de super vaca y otro como root; podríamos fácilmente cambiar los colores y muchas más cosas, y de esa manera evitar posibles desastres.

La variable de entorno $PS1[1] define la apariencia del prompt de Bash, la cual aparece después de introducir un comando.
Nosotros podriamos modificar temporalmente $PS1 en la shell actual para las comprobaciones.

Cuando ya conseguimos que nuestro prompt tenga una apariencia que nos guste o necesitamos podemos hacer que esos cambios sean permanentes modificando los script .bashrc, tanto de nuestro usuario como el de root.

$ /home/usuario/.bashrc
# /root/.bashrc

En caso contrario solo se podrá observar en la terminal actual que estemos trabajando.

1º- Secuencias para el Prompt

  • \d Formato Corto de fecha (ejemplo, Dom Ago 08)
  • \e Carácter escape (^[)
  • \h Nombre de host corto (hasta el primer punto, ejemplo: dbn)
  • \H Nombre de host largo ( ejemplo: dbn.ratonera.com)
  • \j Número de trabajos corriendo en esta shell
  • \l Nombre base del terminal (ejemplo: 5 si tu terminal es pts/5)
  • \n Nueva línea
  • \r Retorno de carro
  • \s Nombre del shell (ejemplo: bash)
  • \t Hora en formato 24-horas (HH:MM:SS; ejemplo: 23:01:25)
  • \A Hora en formato de 24-horas sin segundos (HH:MM; ejemplo: 23:01)
  • \T Hora en formato de 12-horas (HH:MM:SS; ejemplo: 11:01:55)
  • \@ Hora en formato de 12-horas sin segundos (HH:MM; ejemplo: 10:11)
  • \u Nombre de usuario (ejemplo: rodrigo)
  • \v Versión Bash que estamos usando (ejemplo: 4.1)
  • \V Edición de Bash con número de versión y nivel de patch (ejemplo: 4.1.5)
  • \w Directorio de trabajo actual con nombre completo de ruta (ejemplo: /var/log/apt/)
  • \W Directorio de trabajo actual, restringido a la carpeta actual (ejemplo: apt$ si el usuario está actualmente en /var/log/apt/)
  • \! Orden del comando en la historia Bash (ejemplo: 254, el comando número254)
  • \# Número de comandos en la sesión shell actual
  • \$ Muestra un símbolo dólar para usuarios ($) y en el otro caso un símbolo almohadilla (#) para root
  • \\ El backslash (\) en sí mismo
  • \[ Empieza una secuencia de caracteres no imprimibles, que pueden emplearse para empotrar una secuencia de control del terminal en el indicador. Este indicador debe aparecer con anterioridad a una secuencia de caracteres que no mueven el cursor (como las secuencias de escape de color). Ésto permite a bash calcular correctamente la división de palabras.
  • \] Cierra la entrada del carácter de control

Ejemplos de secuencias para el prompt

1.1.- Queremos eliminar el nombre de usuario y el nombre de host del prompt y usar un prompt corto, y que nos muestre solo símbolo pesos ($), haremos lo siguiente:

rodrigo@dbn$ PS1="\$"
$

1.2.- El mismo ejemplo, pero dejamos espacios entre las comillas

rodrigo@dbn$ PS1="\$  "
$  ls
Desktop  Downloads  Imagenes

Lo que tenemos aqui es un espacio entre el simbolo $ y el siguiente comando

1.3.- Que nos muestre el nombre de usuario \u y el nombre del host \h

$ PS1="\u@\h$"
rodrigo@dbn$

1.4.- Que nos muestre la hora en formato 12 hs, luego el nombre de usuario \u, el nombre del host \h y el directorio de trabajo actual con nombre completo de ruta.

rodrigo@dbn$ PS1="[\T]\u@\h\w$"
[03:37:19]rodrigo@dbn/etc/apt$

2º-Colores

"Para añadir colores; primero necesitamos diseñar un símbolo de espera de órdenes sin colores. Luego lo que necesitamos hacer es añadir indicadores de escape especiales que serán reconocidos por la terminal (en lugar de bash) que darán a lugar a que se muestren ciertas partes del texto en color. Las terminales Linux y las terminales X permiten añadir un color de primer plano (texto) y un color de segundo plano (fondo), así como añadir caracteres en negrita si se desea. Disponemos de ocho colores para elegir.

Los colores se especifican añadiendo secuencias especiales a PS1. Encerrando valores numéricos entre un \e[ (corchete de escape de apertura) y una m. Si especificamos más de un código numérico, separamos cada código con punto y coma.

Cuando especificamos un código numérico con valor cero, le indicamos a la terminal que restaure los valores de color de texto, fondo y negrita a sus valores por defecto. Es necesario añadir este código al final de nuestro símbolo de espera de órdenes, para no colorear el texto que introduzcamos." (texto estraido de Gento Documentacion )

Códigos de color.

Negro          0;30   
Gris Obscuro   1;30
Azul           0;34    
Azul Claro     1;34
Verde          0;32   
Verde Claro    1;32
Cyan           0;36    
Cyan Claro     1;36
Rojo           0;31   
Rojo Claro     1;31
Purpura        0;35   
Fiuscha        1;35
Café           0;33   
Amarillo       1;33
Gris Claro     0;37    
Blanco         1;37

Ejemplos de secuencias para el prompt, agregando diferentes colores

2.1.- Que nos muestre el nombre de usuario \u de color verde y fondo negro \e[32;40m\u y que solo me muestre luego el promt $ en sus valores por defecto \e[0m$

PS1="\e[32;40m\u\e[0m$ "

2.2.- Que nos muestre el nombre de usuario \u de color verde y fondo negro \e[32;40m\u , luego que nos indique el directorio de trabajo actual con nombre completo de ruta en color rojo \e[31;40m\w y al final que muestre luego el pront $ en sus valores por defecto \e[0m$

PS1="\e[32;40m\u \e[31;40m\w \e[0m$ "

2.3.- Mismo ejemplo anterior con diferentes colores pero que esta vez encierre entre corchetes a mi usuario con el color cian \e[\033[36m\][\u] y los directorio de colo cafe \e[\033[33m\][\w], al final que el promt tenga color cafe \$\[\033[0m\]

PS1="\e[\033[36m\][\u]\e[\033[33m\][\w] \$\[\033[0m\] ";

2.4.- Este ejemplo puede ser un clasico para el usuario con poderes de super vaca

  • \[\e[40;31m\]\u Que nos muestre nuestro usuario de color rojo.
  • \[\e[0m\]@\ El simbolo de @ con los valores por defecto.
  • \[\e[40;33m\]\h El nombre de nuestro host en color amarillo ( parece mas color naranaja)
  • \[\e[0m\[\e[40;37m\]\w El directorio de trabajo actual con nombre completo de ruta, con colores por defecto.
  • \[\e[40;36m\]\$\[\e[0m\] que nuetro promt sea de color cyan.
PS1='\[\e[40;31m\]\u\[\e[0m\]@\[\e[40;33m\]\h\[\e[0m\[\e[40;37m\]\w\[\e[40;36m\]\$\[\e[0m\]'

3º.- Secuencias de Control

Ademas de las secuencias de contro de los colores, existen secuencias del posicionamiento del cursor. Por ejemplo \e[nA mueve el cursor hacia arriba n números de veces y \e[nB realiza lo mismo pero n número de veces hacia abajo.
Podemos combinar junto a las anteriores secuencias y crear promt personalizados de acuerdo a nuetras necesidades.

Secuencias de control ANSI para el cursor

  • \e[nA n líneas arriba (por defecto es n=1 si no se especifica)
  • \e[nB n líneas abajo (por defecto es n=1 si no se especifica)
  • \e[nC n espacios a la derecha (por defecto es n=1 si no se especifica)
  • \e[nD n espacios a la izquierda (por defecto es n=1 si no se especifica)
  • \e[nE Mueve el cursor al comienzo de la siguiente línea (por defecto es n=1 si no se especifica)
  • \e[nF Mueve el cursor al comienzo de la línea previa (por defecto es n=1 si no se especifica)
  • \e[mG Mueve el cursor a la columna m
  • \e[n;mH Mueve el cursor a la línea n , columna m (por defecto es 1 si no se especifica n o m)
  • \e[nJ Limpia la pantalla; si n=0 o no se espcifica, la instrucción limpia la pantalla desde la posición del cursor actual al extremo inferior de la pantalla. Si n=1, el comando limpia la pantalla desde la posición del cursor actual a la parte superior de la pantalla, y si n=2, el comando limpia la pantalla completa.
  • \e[nK Borra parte de una línea; si n=0 o no se especifica, la instrucción borra desde el cursor hasta el final de la línea. Si n=1, la instrucción borra desde la posición actual del cursor hasta el comienzo de la línea, y si n=2, borra la línea completa.
  • \e[S Arrastra n líneas hacia arriba; aparecen nuevas líneas por debajo (pordefecto a 1 si no se especifica n)
  • \e[nT Arrastra n líneas hacia abajo; aparecen nuevas líneas por encima (por defecto a 1 si no se especifica n)
  • \e[s Guarda la posición del cursor.
  • \e[u Restaura una posición del cursor almacenada.

Nota: n es un número

3.1.- Por ejemplo si nos encontramos en la parte inferior de una ruta extensa de directorios, podemos diseñar un promt para que adopte el aspecto de una línea de estado en la parte superior con la ruta y hora, en la parte superior de la terminal y un promt diferente para nuestro usuario actual.

  • \e[1A Movemos el cursor una línea hacia arriba, para evitar que la línea de estado la empuje hacia afuera después
  • \e[s Guardamos la posición
  • \e[H Movemos el cursor a la esquina superior izquierda
  • \e[33;41;1m Coloreamos la salida
  • \e[K Borramos desde la posición del cursor hasta el final de la línea
  • \w Obtemos la ruta completa
  • \e[200C Movemos el cursor 200 posiciones a la derecha
  • \e[8D Movemos el cursor hacia atras 8 posiciones a la izquierda
  • \e[37;41;1m [\A] Coloreamos la salida y obtenemos la hora en formato 24 horas sin segundos.
  • \e[3m Restauramos los colores predeterminados
  • \e[u\n Restauramos la posición del cursor e insertamos una nueva linea
  • Combinamos con lo visto en el ejemplo 2.3 per esta vez no necesitamos que nos ponga la ruta del directorio completo por que sabemos que va a salir arriba de la terminal \e[\033[36m\][\u] \e[\033[33m\] \$\[\033[0m\]

El comando completo seria el siguiente:

PS1='\e[1A\e[s\e[H\e[33;41;1m\e[K\w\e[200C\e[8D\e[37;41;1m [\A]\e[3m\e[u\n\[\033[36m\][\u]\[\033[33m\] \$\[\033[0m\] '

Enlaces de Interés:
http://siddharta.kubuntu-es.org/5852/resaltar-color-prompt-terminal-usua...
http://mipagina.euskaltel.es/iosus/linux/Bash-Prompt-HOWTO-5.html
http://wiki.archlinux.org/index.php/Color_Bash_Prompt#List_of_colors_for...
http://www.gentoo.org/doc/es/articles/prompt-magic.xml

Espero que les guste
Saludos
Rodrigo

Imagen de tlacuacheoscuro
Enviado por tlacuacheoscuro el 7 Agosto, 2010 - 21:17.

Cuando tenga algo de tiempo lo probare , muy buena entrada! first

Imagen de Froggy
Enviado por Froggy el 7 Agosto, 2010 - 21:20.
tlacuacheoscuro escribió:

Cuando tenga algo de tiempo lo probare , muy buena entrada! first

Simplemente podes ejecutar en una terminal los comandos que dejé en las etiquetas code, y listo. Luego si quieres personalizar uno a tu medida, va a ser bueno que tambien leas un poco la documentacion de los enlaces que deje al final.

Saludos wink

Imagen de sebas
Enviado por sebas el 7 Agosto, 2010 - 23:02.

Muy buen aporte rodri... clap
El tìtulo de la antrada...cambia la "n" por la "m" en "Pront"
Abrazo!
Sebas

Imagen de Froggy
Enviado por Froggy el 8 Agosto, 2010 - 00:15.
sebas escribió:

El tìtulo de la antrada...cambia la "n" por la "m" en "Pront"

Echo ... Gracias !!

Saludos Seba wink

Imagen de xatiya
Enviado por xatiya el 8 Agosto, 2010 - 04:39.

No muchachos! Ni "Pront" ni "Promt", es "Prompt".

Buen post, mi prompt luce así:

Prompt

Un saludo! wink

Imagen de Froggy
Enviado por Froggy el 8 Agosto, 2010 - 05:29.
xatiya escribió:

No muchachos! Ni "Pront" ni "Promt", es "Prompt".

Hace un rato habia correjido todas las palabras que habia escrito como pront (es así como yo lo pronuncio tongue ), pero me habia olvidado del título, pero ya lo correjí ... wink

xatiya escribió:

Buen post, mi prompt luce así:
Prompt

Esta muy bueno tu prompt, podrías pasarlo

Saludos

Imagen de sebas
Enviado por sebas el 8 Agosto, 2010 - 17:41.
Froggy escribió:
xatiya escribió:

No muchachos! Ni "Pront" ni "Promt", es "Prompt".

Hace un rato habia correjido todas las palabras que habia escrito como pront (es así como yo lo pronuncio tongue ), pero me habia olvidado del título, pero ya lo correjí ... wink

xatiya escribió:

Buen post, mi prompt luce así:
Prompt

Esta muy bueno tu prompt, podrías pasarlo

Saludos

Menos mal que nos avisó xatiya jejeje ya me parecía que le faltaba una letra a la palabra xDD
Che se podría armar un hilo sobre ejemplos de prompts o configuraciones con screenshots...lo que me queda la duda..es que no recuerdo como capturabas en una imagen el prompt como hizo xatiya que
Abrazo!
Sebas

Imagen de Froggy
Enviado por Froggy el 8 Agosto, 2010 - 17:52.
sebas escribió:

Menos mal que nos avisó xatiya jejeje ya me parecía que le faltaba una letra a la palabra xDD
Che se podría armar un hilo sobre ejemplos de prompts o configuraciones con screenshots...lo que me queda la duda..es que no recuerdo como capturabas en una imagen el prompt como hizo xatiya que
Abrazo!
Sebas

Es como una captura cualquiera de escritorio, pero lo que hace es cortar toda la imagen y dejer solo esa parte.

Si por esos casos usas scrot, puedes abrir dos lenguetas en donde una la usas para capturar indicando un tiempo y la otra con el prompt. Para esas capturas donde se necesitan un tiempo yo uso scrot de la siguiente manera.

$ scrot -cd 5

Donde 5 (cinco) son los cinco segundos de espera.
Luego para cortar imagenes, para mi lo mejor es gwenview, que tiene una aplicacion dentro del mismo que te permite cortar las imagenes en forma sencilla.

PD: La verdad que si estaría bueno las imagenes de los prompt, pero que además pasen el código tongue

Saludo

Imagen de caliban
Enviado por caliban el 9 Agosto, 2010 - 01:17.

!!Buen aporte !! Hace rato que adopte modificar el prompt,por que me hacia un merengue conectado por ssh a otra pc ,y encima cambiar de usuario a root,Así que les di un aspecto a cada uno y con un golpe de vista se donde meto la mano wink
Podrías incluirlo en un artículo !

Imagen de nartan
Enviado por nartan el 9 Agosto, 2010 - 01:41.

¡Bravo! Excelente.
Lo probaré de inmediato.