22/1/09

Colorear el Prompt en Bash

Bueno veamos, la configuración del prompt de bash se guarda en dos variables del entorno:
  1. $PS1 --> acá se guarda el primer prompt (en gral. usuario@host:$)
  2. $PS2 --> acá se guarda la configuracion del segundo prompt (en gral > y se "activa" poniendo \) 
Para ver su contenido podemos escribir en la consola:
echo "Bash PS1 variable:" $PS1
obteniendo algo similar a:
Bash PS1 variable: ${debian_chroot:+($debian_chroot)}\u@\h:\w\$
Para ver el segundo prompt igualmente hacemos:
echo "Bash PS2 variable:" $PS2
obteniendo algo similar a:
Bash PS2 variable: >
Ahora los significados que obtuvimos en la primer salida (PS1) son estos:

Bash special characterBash special character explanationBash special characterBash special character explanation
\aan ASCII bell character (07) \dthe date in "Weekday Month Date" format (e.g., "Tue May 26")
\]end a sequence of non-printing characters \ean ASCII escape character (033)
\hthe hostname up to the first `.' \Hthe hostname
\jthe number of jobs currently managed by the shell \lthe basename of the shell's terminal device name
\nnewline \rcarriage return
\sthe name of the shell, the basename of $0 (the portion following the final slash) \tthe current time in 24-hour HH:MM:SS format
\Tthe current time in 12-hour HH:MM:SS format \@the current time in 12-hour am/pm format
\Athe current time in 24-hour HH:MM format \uthe username of the current user
\vthe version of bash (e.g., 2.00) \Vthe release of bash, version + patchelvel (e.g., 2.00.0)
\wthe current working directory \Wthe 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 $ \nnnthe 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
\D{format}the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation. The braces are required

Luego de que el usuario ingresa en el sistema sus variables de entorno son inicializadas desde varios archivo:
global system files /etc/profile or /etc/bashrc
user files ~/.bash_profile , ~/.bash_login , ~/.profile , ~/.bashrc or ~/.bash_logout.
Es importante saber que todas las variables de entorno del usuario tiene un tiempo de vida igual al de la sesion. Cuando la sesion es cerrada, las variables definidas durante la sesión, son eliminadas y deben ser redefinidas al iniciar sesion nuevamente.

Luego de esta breve introducción, veamos como colorear: la sintaxis para cambiar los colores en bash es la siguiente:
\033[ -> Indica el comienzo del color en el texto
x;yzm - Indica el código del color
\033[00m - Indica el final del color en el texto
Los códigos de los colores pueden encontrarlos en el articulo: Colorear texto al hacer printf o cout

Para comenzar probando podemos tipear:
export PS1="\033[01;31mBASH IN RED\033[00m: "
y ver el resultado, aqui otro ejemplo:
export PS1="\u@\h [\$(ls | wc -l)]:\$ "
Una vez que experimentamos lo suficiente, y decidimos nuestro esquema, por ejemplo:
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;36m\]\u@\h\[\033[00m\]:\[\033[00;35m\]\w\[\033[00m\]\$ '
debemos hacer que los cambios sean permanentes: lo que hacemos es agregar la linea anterior al final del .bashrc

Pueden ver mas info aqui.

No hay comentarios.: