jueves, 12 de junio de 2008

Bash: Prompt en colores

Cuando estaba trabajando en la consola (uso bash), a veces perdía de vista el inicio de la salida del comando que acababa de introducir. Probando alguna que otra distribución de Linux observé que usaban un color distinto para el prompt y otro para los comandos. Para el que no sepa lo que es el prompt, es lo que sale antes del "$" (o del "#" si te has identificado como root). Después de investigar un poco, aprendí que para configurar la información que aparece había que modificar la variable de entorno PS1. Esto se hace en el archivo .bashrc para cada usuario.
Para poner el prompt en verde, mientras mantienes el resto de los colores en la consola, hay que poner unas secuencias de escape determinadas. Este es mi .bashrc:

alias ls='ls --color=auto'
PS1='\[\e[32;1m\][\u@\h \W]\$\[\e[0m\] '
complete -cf sudo
complete -cf man

La primera línea define un alias para que al hacer ls salga coloreado por tipo de archivo (los colores se definen en /etc/DIR_COLORS). La tercera y cuarta línea sirven para que al pulsar TAB se complete el comando incluso si se han introducido antes un man o un sudo.
La segunda línea es donde se define la información que se mostrará en el prompt. El significado es el siguiente:
\e[32;1m indica que a partir de aquí se usará el color verde claro.
\u indica que se muestre el login actual.
\h indica que se muestre el nombre del servidor (sin nombre de dominio).
\W indica que se muestre el directorio actual.
\e[0m indica que a partir de aquí se usará el color por defecto.
\$ sirve para que aparezca $ si es un usuario normal o # si es root.
\[ y \] sirven para marcar bloques de caracteres que no deben incluirse al contar la longitud de línea. Si no se incluyen entre estos caracteres las secuencias de escape para cambiar el color, se obtiene un efecto curioso: al teclear una línea larga y sobrepasar el ancho de la pantalla, en lugar de comenzar una nueva línea se sobreescribe el prompt de la línea actual.

El resto son caracteres para que quede "bonito".
Y ya metidos ¿por qué no hacer que cuando estés trabajando como root sea más "visible" que sólo el cambio de $ por #?. Mi .bashrc como root tiene esta definición de PS1:
PS1='\[\e[31;1m\][\u@\h \W]\$\[\e[0m\] '
Es igual, pero he cambiado el 32 (verde) por 31(rojo). El resultado es el siguiente:


Para saber más:
man bash En el apartado PROMPTING aparecen todos los caracteres de control.
http://www.ibm.com/developerworks/linux/library/l-tip-prompt/ En inglés. Aquí aparece una pantalla con códigos de color y ejemplos.

No hay comentarios: