Configurando nuestro prompt en bash

En este breve post vamos a ver como personalizar nuestra terminal para poder tener entre otras cosas, colores.
Lo primero que deberiamos mirar es el siguiente link para poder entender acerca de las diferentes posibilidades que tenemos:
ANSI ESCAPE CODE

Lo primero que deberiamos repasar es la variable mas significativa para el uso del prompt ( PS1 ).
Utilizando los siguientes valores de la tabla de ANSI podremos cambiar el color del a letra y el fondo:


Esc[Value;...;Valuem Set Graphics Mode

Foreground colors
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White

Background colors
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White

Utilizando algunos ejemplos:

[crond1@restauracion /etc]$ PS1="[\u-\V]\n[\w]$"
[crond1-4.2.24]
[/etc]$

En el ejemplo descripto arriba hemos seteado nuestro prompt para que nos de el nombre de usuario seguido de la version de bash, luego debajo tenemos el directorio donde estamos trabajando y el signo $ para terminar nuestro prompt.

Ahora podriamos ponerle algun color segun la norma ANSI:


[/etc]$LRED="\[\e[01;31m\]"
[crond1-4.2.24]
[/etc]$PS1="[${LRED}\u-\V]\n[\w]$"
[crond1-4.2.24]
[/etc]$

En este caso definimos una variable local que nos da el color rojo y aplica a todo lo que viene despues, por eso nos queda todo el prompt rojo salvo el primero corchete que dado que esta detras de la variable RED, los valores que estan dentro de la variable red tienen que ver con la forma que se escriben segun la tabla de ANSI.
Tener en cuenta que ahora todo lo que escribamos sera rojo, por eso conviene al final agregarle un valor por defecto como DEFAULT=”\[\e[0m\]” , quedando asi mi variable PS1=”[${LRED}\u-\V]\n[\w]$ ${DEFAULT} ”

[/etc]$DEFAULT="\[\e[0m\]"
[crond1-4.2.24]
[/etc]$PS1="[${LRED}\u-\V]\n[\w]$ ${DEFAULT} "
[crond1-4.2.24]
[/etc]$ pwd

Ahi lo tenemos configurado para que escriba todo lo demas con el color blanco.
Podriamos generar algun archivo con funciones para poder utilizar y cargar nuestros valores, pero primero vamos a probar algunos ejemplos:


[/etc]$ echo -e "${LRED}prueba"
\[\]prueba
[crond1-4.2.24]
[/etc]$ LRED="\[\e[01;31m\]"
[crond1-4.2.24]
[/etc]$ echo -e "${LRED}prueba"
\[\]prueba
[crond1-4.2.24]
[/etc]$
[/etc]$ LRED="\[\e[04;31m\]"
[crond1-4.2.24]
[/etc]$ echo -e "${LRED}prueba"
\[\]prueba
[crond1-4.2.24]
[/etc]$
[crond1-4.2.24]
[/etc]$ LRED="\[\e[07;31m\]"
[crond1-4.2.24]
[/etc]$ echo -e "${LRED}prueba"
\[\]prueba
[crond1-4.2.24]
[/etc]$

En los ejemplos anteriores lo que hicimos fue mostrar el texto con diferentes atributos:

Text attributes
0 All attributes off
1 Bold on
4 Underscore (on monochrome display adapter only)
5 Blink on
7 Reverse video on
8 Concealed on

Tambien nuestro bash interpreta ciertos codigos para mostrarnos algunos valores especificos utilizando los siguientes ejemplos:

Bash permite que esas cadenas de prompts sean personalizadas al insertar un
número de carácteres especiales de barra invertida de escape que son
decodificados como sigue:

\a un caracter de campana ASCII (07)
\d la fecha en formato "Día Mes Fecha" (p.ej., "Tue May 26" - Mar May 26)
\D{format} el formato es pasado a strftime(3) y el resultado
es insertado en la cadena del prompt. un formato vacío
resulta en un tiempo de representación específico del locale.
Se requieren los tirantes
\e un carácter de escape ASCII (033)
\h el nombre de anfitrión hasta el primer `.'
\H el nombre de anfitrión
\j la cantidad de trabajos actualmente manejados por el shell
\l el nombre base del nombre de dispositivo de la terminal del shell
\n línea nueva
\r retorno de carro
\s el nombre del shell, el nombre base de $0 (la porción siguiendo
la barra final)
\t el tiempo actual en un formato de 24-horas HH:MM:SS
\T el tiempo actual en un formato de 12-horas HH:MM:SS
\@ el tiempo actual en un formato de 12-horas am/pm
\A el tiempo actual en un formato de 24-horas HH:MM
\u el nombre de usuario del usuario actual
\v la versión de bash (p.ej., 2.00)
\V la liberación de bash, versión + nivel de parche (p.ej., 2.00.0)
\w el directorio de trabajo actual, con $HOME abreviado con una tilde
\W el nombre base del directorio de trabajo actual, con $HOME
abreviado con una tilde
\! el número de historial de este comando
\# el número de comando de éste comando
\$ si el UID efectivo es 0, un #, de lo contrario un $
\nnn el carácter correspondiendo al número octal nnn
\\ una barra inversa
\[ comienza una secuencia de carácteres no imprimibles, los cuales podrían ser usados
para embeber una secuencia de control de terminal en el prompt
\] terminar una secuencia de carácteres no imprimibles


Con estos codigos podemos hacer que nuestro prompt nos devuelva informacion importante segun el uso que le quiseramos dar.

Teniendo en cuenta todo lo anterior podriamos armarnos nuestras reglas en nuestro profile para utilizar el prompt como deseemos.

Creamos el siguiente archivo en nuestro $HOME.

ARCHIVO --> .prompt
#!/bin/bash

prompt_path_set()
{
CWD=${PWD}

local COUNT_SPACE_OVER=$((${#CWD}-${PATH_WIDTH}+3))
if [ ${COUNT_SPACE_OVER:-0} -ge 0 ] ; then
TMP=''
while [ ${COUNT_SPACE_OVER:-0} -ne 0 ]
do
COUNT_SPACE_OVER=$((${COUNT_SPACE_OVER}-1))
TMP="?${TMP}"
done

CWD="...${CWD#${TMP}}"
fi
}

PROMPT_COMMAND=precmd
precmd()
{
#############
#COLOR CODES#
#############
local PATH_WIDTH=$((${COLUMNS:-80} / 4))
local DEFAULT="\[\e[0m\]"
local BOLD="\[\e[1m\]"
local HIDDEN="\[\e[8m\]"
local BLACK="\[\e[00;30m\]"
local GRAY="\[\e[01;30m\]"
local RED="\[\e[00;31m\]"
local LRED="\[\e[01;31m\]"
local GREEN="\[\e[00;32m\]"
local LGREEN="\[\e[01;32m\]"
local BROWN="\[\e[00;33m\]"
local YELLOW="\[\e[01;33m\]"
local BLUE="\[\e[00;34m\]"
local LBLUE="\[\e[01;34m\]"
local PURPLE="\[\e[00;35m\]"
local LPURPLE="\[\e[01;35m\]"
local CYAN="\[\e[00;36m\]"
local LCYAN="\[\e[01;36m\]"
local LGRAY="\[\e[00;37m\]"
local WHITE="\[\e[01;37m\]"
local BARRAPESOS="\\$"
local CWD
local TMP

prompt_path_set

PS1="${CYAN}[${LGRAY}\t${CYAN}]\n${CYAN}[${WHITE}${BOLD}\h${YELLOW}@${LBLUE}${CWD} ${LCYAN}${BARRAPESOS}${CYAN}]${DEFAULT} "

# ESC DESCRIPTION
# \a an ASCII bell character (07)
# \d the date in "Weekday Month Date" format (e.g., "Tue May 26")
# \e an ASCII escape character (033)
# \h the hostname up to the first `.'
# \H the hostname
# \j the number of jobs currently managed by the shell
# \l the basename of the shell's terminal device name
# \n newline
# \r carriage return
# \s the name of the shell, the basename of $0 (the portion following the final slash)
# \t the current time in 24-hour HH:MM:SS format
# \T the current time in 12-hour HH:MM:SS format
# \@ the current time in 12-hour am/pm format
# \u the username of the current user
# \v the version of bash (e.g., 2.00)
# \V the release of bash, version + patchlevel (e.g., 2.00.0)
# \w the current working directory
# \W the basename of the current working directory
# \! the history number of this command
# \# the command number of this command
# \$ if the effective UID is 0, a #, otherwise a $
# \nnn the character corresponding to the octal number nnn
# \\ a backslash
# \[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
# \] end a sequence of non-printing characters
}

Luego en nuestro .bashrc agregamos la siguiente linea:


echo ". ${HOME}/.prompt" >> $HOME/.bashrc

Mirando mas profundamente la documentacion vemos que son muchas las variantes que podemos hacer pero lo ideal es ir probando lo mas basico para ir asimilando como funciona asi luego avanzar con los parametros mas avanzados.

Fuentes:
ANSI ESCAPE CODE
Bash Tutorial
TLDP
Bash-How-To
PS1 Examples
Color_Bash_Prompt/es
bash-power-prompt

Share
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply