Página siguiente Página anterior Índice general

2. bash y sus prompts

2.1 ¿Qué es bash?

Descendiente del Bourne Shell, bash es un producto GNU, el Bourne Again Shell. Es el interfaz estándar de línea de comandos en la mayoría de las máquinas LiNUX. Potencia la interactividad, soportando edición en línea de comando, capacidad de completar o recordar automáticamente un comando, etc. También soporta prompts configurables - la mayoría de la gente se da cuenta de esto, pero no saben hasta qué punto.

2.2 ¿Qué puede aportar la manipulación del prompt ?

La mayoría de los sistemas LiNUX tienen un prompt por defecto en un solo color (normalmente gris) que indica el nombre de usuario, el nombre de la máquina en la que se está trabajando y alguna indicación acerca del directorio de trabajo actual. Toda esta información es útil, pero se puede ir mucho más allá: se puede mostrar todo tipo de información (número de «tty», hora, fecha, carga, número de usuarios, tiempo sin reiniciar ...) y el prompt puede usar colores ANSI, ya sea por razones puramente estéticas, o para remarcar cierta información. También se puede manipular la barra de título de una xterm para reflejar parte de esta información.

2.3 ¿Por qué molestarse ?

Además de una apariencia bonita, en ocasiones es útil seguir la pista de cierta información del sistema. Una idea que sé que gusta a la gente es que es posible poner los prompts de diferentes máquinas en diferentes colores. Si se tienen varias terminales X abiertas en diferentes máquinas, o si se tiende a olvidar en qué máquina se está trabajando y se borran ficheros equivocados, encontrará en esta una buena forma de recordar en qué máquina se encuentra.

2.4 El primer paso

La apariencia del prompt viene dada por la variable del shell PS1. Las continuaciones de comandos se indican mediante la cadena PS2, que puede modificarse de la misma forma que aquí se comentan --ya que el manejo es exactamente el mismo, y que no es tan «interesante»--, casi siempre se van a tratar modificaciones de la cadena PS1 (También existen las cadenas PS3 y PS4. Estas nunca están a la vista del usuario medio (vea la página del manual sobre bash si está interesado en su propósito).

Para cambiar el aspecto del prompt, hay que cambiar la variable PS1. Para experimentar, se pueden introducir cadenas PS1 directamente desde el prompt, y ver los resultados inmediatamente (esto sólo afecta a la sesión actual, y los cambios desaparecen cuando termina). Si se desea hacer permanentes estos cambios, modifique su ~/.bashrc, y añada la nueva definición de PS1. Si tiene permisos de root, puede mirar en /etc/profile y modificar allí la línea PS1=. Tenga en cuenta que en algunas distribuciones (al menos en la RedHat 5.1) /etc/bashrc redefine los valores de PS1 y PS2.

Antes de comenzar, es importante recordar que la cadena PS1 se almacena en el entorno como cualquier otra variable de entorno. Si se modifica en la línea de comando, su prompt cambiará. Antes de hacer cualquier cambio, puede salvar su prompt actual en otra variable de entorno.

       [giles@nikola giles]$ SAVE=$PS1
       [giles@nikola giles]$

El prompt más sencillo sería el de un sólo carácter, como:

       [giles@nikola giles]$ PS1=$
       $ls
       bin   mail
       $

Esto demuestra la mejor manera de experimentar con prompts básicos: introduciéndolos en la línea de comando. Nótese que el texto introducido por el usuario aparece inmeditamente después del prompt. Yo prefiero usar

       $PS1="$ "
       $ ls
       bin   mail
       $

que fuerza un espacio después del prompt, haciéndolo más legible. Para restaurar el prompt original, basta con llamar a la variable almacenada:

       $ PS1=$SAVE
       [giles@nikola giles]$

2.5 Secuencias de escape del prompt bash

Hay numerosas secuencias de escape ofrecidas por el shell bash para insertar en el prompt. De la página del manual del bash 2.02:

Cuando se ejecuta interactivamente, bash muestra el prompt primario PS1 cuando está listo para leer un comando, y el prompt secundario PS2 cuando necesita más datos de entrada para completar un comando. bash permite que estas cadenas de prompt sean modificadas insertando ciertos caracteres especiales escapados mediante contrabarra que se decodifican de la manera siguiente:

Continuando donde lo habíamos dejado:

       [giles@nikola giles]$ PS1="\u@\h \W> "
       giles@nikola giles> ls
       bin   mail
       giles@nikola giles>

Este es similar al prompt por defecto de la mayoría de las distribuciones LiNUX. Pero yo quería una apariencia ligeramente diferente, así que lo cambié a:

       giles@nikola giles> PS1="[\t][\u@\h:\w]\$ "
       [21:52:01][giles@nikola:~]$ ls
       bin   mail
       [21:52:15][giles@nikola:~]$

2.6 Valor permanente de las cadenas «PS?»

Las cadenas PS? son establecidas, según la persona o distribución en distintos lugares. Los más comunes son /etc/profile, /etc/bashrc, ~/.bash_profile, y ~/.bashrc. Johan Kullstam, johan19@idt.net escribe:

La cadena PS1 debería ponerse en el .bashrc debido a que los bash no interactivos no tienen en cuenta este fichero, y por tanto, no estableceremos PS1 si se trata de una shell no interactiva. La página del manual de bash indica que la presencia o ausencia de PS1 es una buena manera de saber si uno está en una sesión interactiva o no interactiva de bash.

La forma en que me percaté de esto es que startx es un script bash, lo que implica que pulverizará el prompt. Cuando se pone PS1 en el .profile (o en el .bash_profile, al entrar en consola y lanzar las X vía startx, la variable PS1 se elimina en el proceso, dejándole con el prompt por defecto.

Una solución es lanzar las xterm y las rxvt con la opción -ls para forzarles a leer el .profile, pero en el momento en que se llame un shell mediante un shell-script no interactivo se perderá PS1. system(3) usa sh -c que, si sh es bash, eliminará PS1. Una forma mejor de hacer esto es situar la definición de PS1 en .bashrc. Este fichero se lee cada vez que se inicia bash y es donde deberían aparecer las cosas interactivas (p.ej. PS1)

Por lo tanto se llega a la conclusión de que PS1= ...(blah)... debería ir en .bashrc y no en .profile

He intentado simular el problema que él comenta, y he encontrado uno diferente: mi variable PROMPT_COMMAND (de la que se hablará después) era desintegrada. Mi conocimiento en este área es un poco limitado, así que seguiré lo que dice Johan.


Página siguiente Página anterior Índice general