Renuncia de responsabilidad:
La versión original de este artículo fue publicada por IBM
developerWorks y es propiedad de Westtech Information Services. Este
documento es una versión actualizada del artículo original y contiene
mejoras introducidas por el Equipo de Documentación de Gentoo.
Este documento carece de soporte activo.
|
Magia con el Símbolo de espera de órdenes (prompt)
1.
Mejorar el símbolo de espera de órdenes del sistema
Como gente Linux/UNIX, pasamos un montón de tiempo trabajando con el intérprete
de comandos y, en muchos casos, esto es lo que nos muestra:
Listado de Código 1.1: Símbolo de espera de órdenes normal de un usuario |
bash-2.04$
|
Si somos el superusuario (root), se nos concede el título de obtener la
"prestigiosa" versión de este bonito símbolo de espera de órdenes:
Listado de Código 1.2: Símbolo de espera de órdenes del superusuario |
bash-2.04#
|
Éstos símbolos de espera de órdenes no es que sean preciosos. No cabe duda de
que varias distribuciones de Linux han mejorado sus símbolos de espera de
órdenes para añadir color e información adicional al iniciar el sistema. De
todas formas, si se dispone de una distribución moderna que venga con un
símbolo de espera de órdenes bonito y colorido, puede no ser perfecto.
Posiblemente se le quieran añadir o cambiar algunos colores, o añadir
(o suprimir) información del mismo. No es tan difícil diseñar nuestro propio
símbolo de espera de órdenes con colores y trucos a nuestro gusto, desde el
principio.
Lo básico del símbolo de espera de órdenes
En bash, puede cambiarse el símbolo de espera de órdenes modificando la
variable de entorno PS1, como se muestra:
Listado de Código 1.3: Cambiar la variable de entorno |
$ export PS1="> "
>
|
Los cambios surten efecto de inmediato, y pueden hacerse permanentes emplazando
la definición export en el archivo ~/.bashrc. PS1
puede contener toda la cantidad de texto llano que queramos:
Listado de Código 1.4: Un símbolo de espera de órdenes personalizado |
$ export PS1="Este es mi súper símbolo de espera de órdenes > "
Este es mi súper símbolo de espera de órdenes >
|
Aunque quizá sea interesante, no es exactamente útil tener un símbolo de espera
de órdenes que contenga un montón de texto estático. La mayoría de los símbolos
contienen información tal como el nombre de usuario, el directorio de trabajo o
el nombre del anfitrión. Por ejemplo, el siguiente símbolo mostrará el nombre
del usuario y el nombre del anfitrión:
Listado de Código 1.5: Un símbolo de espera de órdenes más útil |
$ export PS1="\u@\H > "
drobbins@freebox >
|
Este símbolo es especialmente útil para gente que ingresa en varias máquinas
bajo cuentas con distintos nombres, dado que nos recuerda la máquina en la que
estamos y los privilegios de los que disponemos.
En el ejemplo anterior, le indicamos a bash que mostrase el nombre de usuario y
el del anfitrión usando una secuencia especial de caracteres que se indica con
el guión invertido y que bash reemplaza con sus valores específicos cuando
aparecen en la variable PS1. Hemos usado las secuencias \u (para
el nombre de usuario) y \H (para la primera parte del nombre del
anfitrión). He aquí una lista completa de todas las secuencias especiales que
bash reconoce (puede encontrarse esta lista en la página man de bash, en la
sección "INDICADORES"):
| Indicador |
Descripción |
| \a |
Un carácter de alerta ASCII (se puede teclear también \007) |
| \d |
La fecha en el formato "Día-Semana Mes Día" (ejemplo, "Tue May 26") en
inglés
|
| \e |
Un carácter de escape (ESC) ASCII (se puede teclear también \033)
|
| \h |
El nombre del computador anfitrión hasta el primer ‘.’ (como "mybox")
|
| \H |
El nombre del computador anfitrión completo (como "mybox.mydomain.com")
|
| \j |
El número de procesos suspendidos en este intérprete de comandos
presionando ^Z
|
| \l |
El nombre del dispositivo de la terminal (como "ttyp4") |
| \n |
Salto de línea |
| \r |
Retorno de carro |
| \s |
El nombre del shell, el nombre base de $0 (la porción que sigue a la última
barra inclinada)
|
| \t |
La hora actual en el formato de 24 horas HH:MM:SS (como "23:01:01")
|
| \T |
La hora actual en el formato de 12 horas HH:MM:SS (como "11:01:01")
|
| \@ |
La hora actual en el formato de 12 horas con indicador AM/PM |
| \u |
El nombre de usuario del usuario en curso |
| \v |
La versión de bash (como 2.04) |
| \V |
La distribución de bash, versión + nivel de parcheo |
| \w |
El directorio de trabajo en curso (como /home/drobbins) |
| \W |
El nombre base del directorio de trabajo (como "drobbins") |
| \! |
El número de historia de esta orden |
| \# |
El número de orden de esta orden (se incrementa en cada símbolo de espera
de órdenes, siempre que se teclee algo)
|
| \\$ |
Si el UID efectivo es 0 (el super-usuario), un #, si no un $.
Si se delimita la cadena con ' en lugar de ", se debe usar
una sola barra invertida.
|
| \xxx |
El carácter correspondiente al número octal xxx (reemplazando los dígitos
sin utilizar por ceros, como en \007)
|
| \\ |
Una barra inclinada invertida |
| \[ |
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.
|
| \] |
Termina una secuencia de caracteres no imprimibles.
|
Con ello, tenemos una lista de todos los indicadores especiales de bash con
barra invertida. Hay que jugar con ellos para ver cómo funcionan. Después de
hacer algunas pruebas, ha llegado el momento de añadir un poco de color.
Colorear
Añadir colores es bastante sencillo; el primer paso es diseñar un símbolo de
espera de órdenes sin colores. Entonces, todo 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 --
básicamente 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 [semicolon]. He aquí un ejemplo con un
código de color:
Listado de Código 1.6: Añadir color |
"\e[0m"
|
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.
Ahora consultemos los códigos de color. Veamos la siguiente captura de
pantalla:
Ilustración 1.1: Diagrama de color |
 |
Para usar este diagrama, encontramos el color que nos gustaría usar y
encontramos los correspondientes colores de texto (30-37) y de fondo (40-47).
Por ejemplo, si elegimos verde con un fondo negro normal, los números son 32 y
40. Entonces cogemos la definición de nuestro símbolo de espera de órdenes y le
añadimos los códigos de color apropiados. Este:
Listado de Código 1.7: Un símbolo de espera de órdenes básico personalizado |
$ export PS1="\w> "
|
pasa a ser:
Listado de Código 1.8: El símbolo de espera de órdenes coloreado |
$ export PS1="\e[32;40m\w> "
|
Más o menos, aunque no es perfecto aún. Después de que bash muestre el
directorio de trabajo, necesitamos volver a los colores por defecto con el
indicador \e[0m:
Listado de Código 1.9: Un símbolo de espera de órdenes mejor coloreado |
$ export PS1="\e[32;40m\w> \e[0m"
|
Esta definición nos proporcionará un bonito símbolo de espera de órdenes verde,
pero aún necesitamos añadir algunos retoques finales. No necesitamos añadir
como color de fondo el valor 40, dado que lo ajusta como negro, que es el valor
por defecto. Además, el color verde es algo débil; lo cual puede resolverse
añadiendo un código de color 1 que habilita un texto en negrita más
brillante. Además de este cambio, necesitamos subordinar todos los caracteres
no imprimibles con los indicadores especiales de escape en bash, \[ y
\]. Estos indicadores le dicen a bash que los caracteres contenidos no
ocupan ningún espacio en la línea, lo que permite que la división de palabras
siga funcionando adecuadamente. Sin ellos, acabaríamos con un bonito símbolo de
espera de órdenes que resultaría muy confuso en pantalla si nos aproximamos al
borde derecho de la pantalla al teclear un comando. He aquí nuestro símbolo de
espera de órdenes final:
Listado de Código 1.10: Un bonito símbolo de espera de órdenes coloreado |
$ export PS1="\[\e[32;1m\]\w> \[\e[0m\]"
|
Puede usarse más de un color en el mismo símbolo de espera de órdenes, como en:
Listado de Código 1.11: Mucho más colorido |
$ export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\H> \[\e[0m\]"
|
Diversión con Xterm
He mostrado cómo añadir información y color a nuestro símbolo de espera de
órdenes, pero podemos hacer aún más cosas. Es posible añadir códigos especiales
a nuestro símbolo para que se actualice dinámicamente la barra de título de
nuestra terminal X (como rxvt o aterm). Todo lo que se necesita hacer es añadir
el siguiente indicador a nuestro PS1:
Listado de Código 1.12: Actualizar la barra de título xterm |
"\e]2;titlebar\a"
|
Sencillamente hay que reemplazar la expresión titlebar con el texto que
deseemos añadir a la barra de título de nuestra xterm ¡y lo habremos
conseguido! No necesitamos usar texto estático; se pueden insertar también
indicadores de escape bash en la barra de título. Comprobemos este ejemplo, que
muestra el nombre de usuario, el nombre de anfitrión y el directorio de trabajo
actual en la barra de título, así como la definición de un breve símbolo de
espera de órdenes en un verde brillante:
Listado de Código 1.13: Una xterm muy útil |
$ export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
|
Este es el símbolo de espera de órdenes que estoy usando en la captura del
diagrama de color anterior. Me encanta este símbolo, dado que añade toda la
información en la barra de títulos en lugar de estar en la terminal, donde
limitaría todo aquello que puede caber en una línea. A propósito, hay que
asegurarse de incluir todos los indicadores relacionados con la barra de título
entre \[ y \], dado que en cuanto a lo que a la terminal
respecta, esta es una secuencia no imprimible. El único problema de añadir
mucha información en la barra de título sería que no podríamos ver ninguna de
esta información si no estamos usando una terminal gráfica, como la consola del
sistema. Para resolver esto, podemos añadir algo como lo que muestro a
continuación en nuestro ~/.bashrc:
Listado de Código 1.14: Añadir utilidad a las xterm y a las consolas del sistema |
if [ "$TERM" = "linux" ]
then
export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
fi
|
Este condicional en bash ajustará nuestro símbolo de espera de órdenes
basándose en la configuración de nuestra terminal. Para una mayor consistencia,
deberíamos asegurarnos de que nuestro ~/.bash_profile tiene en
consideración nuestro ~/.bashrc al iniciar. Ello se logra añadiendo
la siguiente línea a nuestro ~/.bash_profile:
Listado de Código 1.15: Editar el bash_profile |
source ~/.bashrc
|
De este modo obtendremos la misma configuración del símbolo de espera de
órdenes tanto si iniciamos un intérprete de comandos de ingreso como si es sin
ingreso.
Bien, aquí está. Ha llegado el momento de divertirse y ponerse manos a la obra
para crear algunos símbolos de espera de órdenes bonitos y coloridos.
Recursos
-
rxvt es una pequeña gran xterm que
dispone de gran cantidad de información acerca de las secuencias de escape
adjunta en el directorio doc del tarball de código fuente.
-
aterm es otro programa de
terminal, basado en rxvt. Soporta algunas características visuales muy
bonitas, como la transparencia y el tintado.
-
bashish
es un motor de temas para cualquier terminal. ¡Comprobar algunas excelentes
capturas de bashish en acción!
Acerca del autor
Daniel Robbins vive en Albuquerque, Nuevo Méjico. Fue el Presidente/CEO de
Gentoo Technologies Inc., el Arquitecto Jefe del Proyecto Gentoo y contribuye
como autor de varios libros publicados por MacMillan: Caldera OpenLinux
Unleashed, SuSE Linux Unleashed, y Samba Unleashed. Daniel se ha visto
involucrado en el mundo de las computadoras de algún modo desde segundo grado
cuando se expuso al lenguaje de programación Logo y a una potencialmente letal
dosis de Pac Man. Ésto probablemente explica porqué ha sido un artista de
gráficos en SONY Electronic Publishing/Psygnosis. Daniel disfruta pasando el
tiempo con su mujer Mary y con su hija, Hadassah. Se puede contactar con Daniel
en Daniel Robbins.
|