Next Previous Contents

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 interatividad, soportando edición en línea de comando, capacidad de completar 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 reinicializar ...) 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 refeljar 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 continucaciones de comandos se indican mediante la cadena PS2, que puede modificarse de las mismas formas que aquí se comentan - ya que el manejo es exáctamente 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 - véase 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 diréctamente desde el prompt, y ver los resultados inmediátamente (esto solo 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 solo caracter, como:

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

Esto demustra 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 del bash

Hay numerosas secunecias 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, <tt/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. <tt/bash/ permite que  estas  cadenas  de
  prompt   sean   modificadas   insertando   ciertos   caracteres
  especiales  escapados  mediante contrabarra  que se decodifican
  de la manera siguiente:
         \a     caracter de campana ASCII(07)
         \d     la fecha en formato "día mes día"
                (p.e., "Tue May 26")
         \e     caracter de escape ASCII(033)
         \h     el nombre del host hasta el primer `.'
         \H     el nombre del host
         \n     caracter de nueva línea
         \r     retorno de carro
         \s     el nombre del shell, el nombre base de $0
                (el fragmento que sigue a la última barra)
         \t     la hora actual en formato 24-horas HH:MM:SS
         \T     la hora actual en formato 12-horas HH:MM:SS
         \@     la hora actual en formato 12-horas am/pm
         \u     el nombre de usuario del usuario actual
         \v     la versión del <tt/bash/ (p.e., 2.0)
         \V     la versión del paquete del <tt/bash/, version + patchlevel
                (p.e., 2.00.0)
         \w     el directorio actual de trabajo
         \W     el nombre base del directorio actual de trabajo
         \!     el número del comando actual en el histórico
         \#     el número de comando del comando actual
         \$     si el UID efectivo es 0, una #, sino, un $
         \nnn   el caracter correspondiente al número octal nnn
         \\     una contrabarra
         \[     inicio de una secuencia de caracteres no imprimibles,
                que pueden usarse para incrustar una secuencia de control
                del terminal en el prompt.
         \]     fin de una secuencia de caracteres no imprimibles

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?

Diferentes personas y distribuciones colocan sus cadenas PS? en distintos lugares. Los lugares más comunes son /etc/profile, /etc/bashrc, ~/.bash_profile, y ~/.bashrc. Johan Kullstam escribe:

        la cadena PS1 debería ponerse en el .bashrc debido a que
        los  bash no interactivos no lo tienen en cuenta, para
        así quitar PS1. La página bash del manual 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 significa que startx pulveriza
        el prompt. Cuando se pone PS1 en el .profile (o en el
        .bash_profile, al entrar en consola y lanzar las X via
        startx, la variable PS1 se elimina en el proceso, dejándole
        con el prompt por defecto.

        Una solución es lanzar las xterms y las rxvts 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 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.


Next Previous Contents