Gentoo Logo

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

Fig. 1

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
    # Estamos en la consola del sistema o haciéndole telnet
    export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
    # No estamos en la consola, asumamos una xterm
    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.



Imprimir

Página actualizada 21 de octubre, 2005

Sumario: ¿Por qué permanecer con el aburrido símbolo de espera de órdenes del intérprete de comandos que viene por defecto, cuando lo podemos hacer colorido fácilmente y mucho más informativo? En este truco, Daniel Robbins muestra cómo obtener un símbolo de espera de órdenes tal y como nos guste, además de cómo actualizar dinámicamente la barra de títulos de nuestra terminal X.

Daniel Robbins
Autor

LinuxBlues
Traductor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.