Bash Prompt COMO
 Giles Orr, [email protected]
 Traducido por Iosu Santurt�n, [email protected]
 v0.60, 7 de Enero de 1999, Traducci�n 12 de Junio de 1999

 En este documento se comenta la creaci�n y el manejo de prompts de
 terminales en modo texto y X, incluyendo secuencias est�ndar de escape
 que proporcionan el nombre de usuario, el directorio actual de tra�
 bajo, la hora, etc. Se hacen sugerencias m�s complejas sobre c�mo mod�
 ificar las barras de t�tulo de las terminales X, c�mo usar funciones
 externas para proporcionar informaci�n en el prompt, y c�mo usar col�
 ores ANSI.
 ______________________________________________________________________

 �ndice general



















































 1. Introducci�n y �administrivia�

    1.1 Requerimientos
    1.2 C�mo usar este documento
    1.3 Traducciones
    1.4 Problemas
    1.5 Comentarios y sugerencias
    1.6 Cr�ditos
    1.7 Copyright y dem�s

 2. (TT

    2.1 �Qu� es
    2.2 �Qu� puede aportar la manipulaci�n del prompt ?
    2.3 �Por qu� molestarse ?
    2.4 El primer paso
    2.5 Secuencias de escape del prompt
    2.6 Valor permanente de las cadenas �

 3. Comandos Externos

    3.1 (TT
    3.2 Comandos externos en el prompt
    3.3 Qu� poner en el prompt
    3.4 Entorno

 4. Manipulaciones de la barra de t�tulo de Xterm

 5. Secuencias de escape ANSI: colores y movimientos del cursor

    5.1 Colores
    5.2 Movimiento del cursor
    5.3 Movimiento del cursor con

 6. Caracteres especiales: secuencias de escape octales

 7. El paquete Bash Prompt

    7.1 Disponibilidad
    7.2 Cambio de fuentes en una

 8. Carga de un prompt diferente

    8.1 Carga de un prompt diferente posterior
    8.2 Carga inmediata de un prompt diferente

 9. Prompt din�mico con color seg�n la carga del sistema

    9.1 Un ejemplo de �prueba de concepto�

 10. Prompt de ejemplo

    10.1 Un prompt �ligero�
    10.2 Tema elite de
    10.3 Prompt de usuario avanzado
    10.4 Un prompt con la anchura del terminal
    10.5 Prompt con Reloj elegante e in�til

 11. Anexo: El INSFLUG



 ______________________________________________________________________



 1.  Introducci�n y �administrivia�

 1.1.  Requerimientos


 Ser� necesario el bash. La versi�n por defecto de la pr�ctica
 totalidad de distribuciones LiNUX es la 1.14.7, que es una versi�n
 bien conocida y de confianza. Actualmente se encuentra disponible la
 versi�n 2.0 (incluso superiores): yo llevo usando la 2.0 alg�n tiempo,
 pero la mayor�a del c�digo aqu� presentado deber�a funcionar bajo la
 1.14.7. Si conozco alguna incompatibilidad, lo mencionar�. Se puede
 comprobar la versi�n del bash mediante el comando echo $BASH_VERSION.
 En mi m�quina responde 2.02.1(1)-release.

 La experiencia en programaci�n shell puede venir bien, pero no es
 esencial: cuanto m�s se sepa, m�s complejos ser�n los prompts que se
 puedan crear. Presupongo un conocimiento b�sico de la programaci�n
 shell y utilidades unix a lo largo de este tutorial. Sin embargo, mis
 propios niveles de programaci�n shell son limitados, as� que doy gran
 cantidad de ejemplos y explicaciones que pueden parecer innecesarias
 para el programador experimentado.


 1.2.  C�mo usar este documento



 Se incluyen muchos ejemplos y textos aclaratorios. Su utilidad variar�
 seg�n la persona de la que se trate. Esto ha crecido lo suficiente
 como para que una lectura completa pueda resultar dif�cil; se
 recomienda leer �nicamente las secciones que se necesite, volviendo
 hacia atr�s las veces que sea necesario.


 1.3.  Traducciones


 A fecha de 6 de Enero de 1999, existen traducciones al japon�s (Akira
 Endo, [email protected]) y alem�n (Thomas Keil, thomas@h-
 preissler.de).  �Gracias a ambos! Las URL ser�n incluidas cuando est�n
 disponibles. (--  N. del T.
 en castellano ;) --)


 1.4.  Problemas


 Esta es una lista de problemas que he encontrado programando prompts.
 No comience a leer por aqu�, y no deje que esta lista le desanime, la
 mayor�a son detalles de poca importancia. �chele un vistazo �nicamente
 si llega a alg�n punto conflictivo.


 �   Algunas caracter�sticas de bash (tales como funciones matem�ticas
    dentro de $(()), entre otras) son opciones en tiempo de
    compilaci�n. Si est� usando una distribuci�n binaria, como la que
    viene en las distribuciones est�ndar de LiNUX, tales
    caracter�sticas deber�an estar incluidas. Pero si est� trabajando
    en otro sistema, merece la pena recordar esto si no funciona algo
    que deber�a hacerlo. Algunas notas acerca de esto en Learning the
    Bash Shell, p�gs 260-262

 �  El manejador de terminal screen no siempre funciona con colores
    ANSI.  Desafortunadamente no soy un experto en screen. Mi versi�n
    de screen (una muy reciente) parece que funciona bien en estos
    casos, pero he visto ocasiones en que redujo todos los colores del
    prompt al color de primer plano est�ndar en terminales X. Esto no
    parece ser un problema en la consola.

 �  Los ficheros Xdefaults pueden redefinir colores. Mire en
    ~/.Xdefaults las l�neas referidas a XTerm*background y
    XTerm*foreground (o posiblemente XTerm*Background y
    XTerm*Foreground).

 �  Uno de los prompts que se comentan en este documento utiliza la
    salida de jobs - como se comenta en su momento, las salida de jobs
    a una tuber�a no funciona con bash 2.02.

 �  Las secuencias de escape ANSI de movimiento del cursor no est�n
    implementadas en todas las terminales X. Esto se comenta en su
    propia secci�n.

 �

    Se pueden crear �pseudo-gr�ficos� bastante agradables utilizando
    una fuente VGA en lugar de las est�ndar de LiNUX.
    Desafortunadamente, estos efectos son horrorosos si no se utiliza
    un tipo VGA, y no hay manera de detectar dentro de una terminal qu�
    clase de fuentes de letra se est�n utilizando.

 �  Ha aparecido bash 2.02+ que incorpora nuevas caracter�sticas, y
    cambia algunos comportamientos.  Lo que funcionase bajo la versi�n
    1.14.7 no tiene por qu� funcionar bajo la 2.0+, y viceversa.


 1.5.  Comentarios y sugerencias


 Esta es una experiencia de aprendizaje para mi. He llegado a saber
 bastante acerca de lo que se puede hacer para crear prompts
 interesantes y �tiles, pero necesito indicaciones para corregir y
 mejorar este documento.  He intentado comprobar las sugerencias que yo
 hago contra diferentes versiones de bash (sobre todo la 2.02 que uso,
 y la 1.14.7 que es la m�s popular), no obstante, comun�queme cualquier
 incompatibilidad que encuentre.

 La �ltima versi�n de �ste documento deber�a estar siempre disponible
 en
 http://www.interlog.com/~giles/bashprompt.html. Compru�belo y si�ntase
 libre de mandarme un mensaje a [email protected] con sus sugerencias.


 Utilizo los HOWTOs del Linux Documentation Project casi exclusivamente
 en formato HTML, as� que cuando los convierto desde SGML, el HTML es
 el �nico formato que compruebo concienzudamente. Si hay problemas con
 otros formatos puede que yo no sepa nada, por lo que agradecer�a
 cualquier comentario sobre ello.



 1.6.  Cr�ditos


 En la creaci�n de este documento he tomado prestado mucho del proyecto
 BashPrompt, disponible en http://bash.current.nu.


 Otras fuentes han sido:


 �  mini-COMO acerca del T�tulo de las xterm de Ric Lister, disponible
    en
 �  Prompts ANSI de Keebler, disponible en

 �  C�mo hacer un prompt para bash de Stephen Webb, disponible en
    http://bash.current.nu/bash/HOWTO.html.

 �  y X ANSI Fonts de Stumpy, disponible en
    http://home.earthlink.net/~us5zahns/enl/ansifont.html

 Tambi�n han sido de inmensa ayuda numerosas conversaciones y e-mails
 de Dan, un compa�ero del Georgia College & State University, cuyo
 conocimiento sobre unix sobrepasa el m�o con mucho. Me ha
 proporcionado excelentes sugerencias; ideas suyas han conducido hacia
 prompts interesantes.

 Tres libros que me han has sido de mucha utilidad programando prompts
 son:


 �  Linux in a Nutshell de Jessica Heckman Perry (O'Reilly, 1997)

 �  Learning the Bash Shell de Cameron Newham y Bill Rosenblatt
    (O'Reilly, 2a. ed., 1998)

 �  y Unix Shell Programming de Lowell Jay Arthur (Wiley, 1986; esta es
    la primera edici�n, la segunda apareci� en 1997).


 1.7.  Copyright y dem�s


 Este documento es copyright �1998-1999 de Giles Orr. Se anima a su
 distribuci�n, aunque no deber�a modificarse este documento (v�ase la
 secci�n ``Comentarios y Sugerencias'' para todo lo referente a ponerse
 en contacto conmigo:  he venido a�adiendo los cambios sugeridos por
 los lectores desde hace mucho).  P�ngase en contacto conmigo si est�
 interesado en realizar una traducci�n, esa es una de las
 modificaciones con las que puedo vivir.



 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:


 �  \a car�cter de campana ASCII (07)

 �  \d la fecha en formato d�a mes d�a (p.ej., mar may 26)


 �  \e caracter de escape ASCII (033)

 �  \h el nombre del host hasta el primer �.�

 �  \H el nombre del la m�quina completo (FQDN)


 �  \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 de bash (p.ej., 2.0)

 �  \V la versi�n del paquete del bash, versi�n + patch-level (p.ej.,
    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, un #; en otro caso, $

 �  \nnn el caracter correspondiente al n�mero en 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? �



 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, [email protected]
 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.


 3.  Comandos Externos



 3.1.  PROMPT_COMMAND


 bash proporciona otra variable de entorno llamada PROMPT_COMMAND. El
 contenido de esta variable se ejecuta como un comando bash normal
 justo antes de que bash muestre el prompt.



             [21:55:01][giles@nikola:~] PS1="[\u@\h:\w]\$ "
             [giles@nikola:~] PROMPT_COMMAND="date +%H%M"
             2155
             [giles@nikola:~] d
             bin   mail
             2156
             [giles@nikola:~]




 Lo que ocurre arriba es que he cambiado PS1 para que no incluya la
 secuencia de escape \t, de tal modo que la hora no forme parte del
 prompt.  Despu�s he usado date +%H%M para mostrar la hora en un
 formato que me gusta m�s. Pero aparece en una l�nea diferente a la del
 prompt. Esto se soluciona usando echo -n ... como se muestra debajo,
 funciona con bash 2.0+, pero parece que no lo hace con bash 1.14.7:
 aparentemente el prompt se dibuja de manera diferente, y el m�todo
 mostrado a continuaci�n resulta en superposici�n de texto.






        2156
        [giles@nikola:~] PROMPT_COMMAND="echo -n [$(date +%H%M)]"
        [2156][giles@nikola:~]$
        [2156][giles@nikola:~]$ d
        bin   mail
        [2157][giles@nikola:~]$ unset PROMPT_COMMAND
        [giles@nikola:~]




 echo -n ... controla la salida del comando date y suprime el caracter
 de nueva l�nea final, permitiendo que el prompt aparezca en una sola
 l�nea. Al final, uso el comando unset para eliminar la variable de
 entorno PROMPT_COMMAND.

 N�tese que uso la convenci�n $(<comando>) para la sustituci�n de
 comandos, es decir



             $(date +%H%M)




 significa �sustituye la salida de date +%H%M aqu�.  Esto funciona en
 bash 2.0+. En alguna versi�n antigua de bash, anterior a la 1.14.7,
 puede ser necesario el uso de comillas simples graves (`date +%H%M`).
 Estas comillas pueden usarse en bash 2.0+, pero es preferible usar
 $(), que funciona mejor en el caso de anidamientos. Voy a usar esta
 convenci�n a lo largo de este documento.  Si utiliza una versi�n
 anterior de bash, normalmente podr� sustituir los $() por las
 comillas. Si la sustituci�n de comandos est� escapada (es decir,
 \$(comando) ), entonces deber� usar contrabarras para escapar AMBAS
 comillas (o sea, \`comando\` ).


 3.2.  Comandos externos en el prompt


 Tambi�n se puede usar la salida de comandos regulares LiNUX
 directamente en el prompt. Obviamente, no es deseable insertar muchas
 cosas, o se crear� un prompt enorme. Adem�s ser� preferible usar un
 comando r�pido ya que se va a ejecutar cada vez que el prompt aparezca
 en pantalla, y retrasa la aparici�n de �ste lo que puede resultar muy
 molesto. (A diferencia del ejemplo anterior al que recuerda, esto
 funciona con bash 1.14.7)



             [21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
             [2159][giles@nikola:~]$ ls
             bin   mail
             [2200][giles@nikola:~]$




 Es importante hacer notar la contrabarra anterior al signo de d�lar de
 la sustituci�n del comando. Sin ella, el comando externo se ejecuta
 exactamente una vez: cuando se lee la cadena almacenada en PS1 del
 entorno. Para este prompt, eso significar�a que mostrar�a siempre la
 misma hora, sin importar cuanto tiempo se ha usado el prompt. La
 contrabarra protege los contenidos de $() de la interpretaci�n
 inmediata del shell, por lo que date es llamado cada vez que se genera
 un prompt.

 LiNUX incluye muchas utilidades de peque�o tama�o como date, grep o wc
 que permiten la manipulaci�n de datos. Si se encuentra en la situaci�n
 de crear una combinaci�n compleja de estos programas dentro del
 prompt, podr�a ser m�s f�cil crear un shell script y llamarlo desde el
 prompt. En ocasiones son necesarias secuencias de escape en los
 scripts de bash para asegurar que las variables se expanden en el
 momento correcto (como se ha mostrado arriba con el comando date):
 esto llega a niveles mayores con la l�nea de prompt PS1, y es una
 buena idea evitarlo creando scripts.

 Un ejemplo de un peque�o shell script usado dentro de un prompt es el
 siguiente:




        #!/bin/bash
        #     lsbytesum - suma del n�mero total de bytes de un ls
        TotalBytes=0
        for Bytes in $(ls -l | grep "^-" | cut -c30-41)
        do
            let TotalBytes=$TotalBytes+$Bytes
        done
        TotalMeg=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc)
        echo -n "$TotalMeg"




 A veces he mantenido ambos como funciones (mucho m�s eficiente, pero
 desafortunadamente, la explicaci�n de funciones en detalle va m�s all�
 de este documento), o como scripts en mi directorio /bin, que se
 encuentra en mi variable PATH. Utiliz�ndolo en un prompt:



             [2158][giles@nikola:~]$ PS1="[\u@\h:\w (\$(lsbytesum) Mb)]\$ "
             [giles@nikola:~ (0 Mb)]$ cd /bin
             [giles@nikola:/bin (4.498 Mb)]$





 3.3.  Qu� poner en el prompt


 Se habr� percatado de que yo pongo el nombre de usuario, el nombre de
 la m�quina, la hora y el directorio actual en la mayor�a de mis
 prompts. Con la excepci�n de la hora, son cosas muy normales de
 encontrar en un prompt, y la hora es posiblemente la adici�n m�s
 com�n. Pero lo que incluya cada uno es cosa de gusto personal. Aqu�
 hay ejemplos de personas que conozco que le pueden dar ideas.

 El prompt de Dan es m�nimo pero muy efectivo, particularmente para su
 forma de trabajar.








        [giles@nikola:~]$ cur_tty=$(tty | sed -e "s/.*tty\(.*\)/\1/")
        [giles@nikola:~]$ echo $cur_tty
        p4
        [giles@nikola:~]$ PS1="\!,$cur_tty,\$?\$ "
        1095,p4,0$




 A Dan no le gusta que el hecho de tener el directorio actual de
 trabajo en el prompt pueda variar el tama�o de �ste dr�sticamente
 mientras se pasa de un directorio a otro, as� que el mantiene la pista
 de esto en su cabeza (o usa pwd). El aprendi� Unix con csh y tcsh, as�
 que usa su hist�rico de comandos de forma intensiva (cosa que los
 adictos al bash no solemos hacer), as� que la primera cosa en el
 prompt es el n�mero del hist�rico. El segundo campo es el caracter
 significante de la tty (la salida de tty es recortada mediante sed),
 un dato que puede ser �til para los usuarios de screen. El tercer
 campo es el valor de retorno del �ltimo comando/tuber�a (n�tese que se
 muestra in�til para cualquier comando que se ejecuta dentro del
 prompt; se puede solucionar captur�ndolo en una variable). Finalmente,
 �\$� es un s�mbolo de d�lar para un usuario normal y cambia a # si el
 usuario es el root.

 Torben Fjerdingstad me escribi� para decirme que a menudo suspende
 tareas, y despu�s se le olvidan, as� que usa su prompt para servir de
 recordatorio de las tareas suspendidas:



             [giles@nikola:~]$ function jobcount {
             > jobs|wc -l| awk '{print $1}'
             > }
             [giles@nikola:~]$ export PS1='\W[`jobcount`]# '
             giles[0]# man ls &
             [1] 4150

             [1]+  Stopped (tty output)    man ls
             giles[1]#




 Torben usa awk para evitar el espacio de la salida de wc, mientras que
 yo habr�a usado sed o tr - no porque sean mejor, sino porque me
 resultan m�s familiares. Probablemente existan m�s formas.  Torben
 adem�s rodea sus cadenas PS1 con comillas simples. lo que evita que el
 bash interprete inmediatamente las contrabarras, as� no tiene que
 escaparlas como yo hab�a dicho.

 NOTA: existe un bug conocido en bash 2.02 que provoca que el comando
 jobs no retorne nada a una tuber�a. Si intenta lo de arriba bajo bash
 2.02, siempre obtendr� un �0� independientemente de los trabajos que
 haya suspendidos. Chet Ramey, uno de los responsables de bash me ha
 dicho que esto se soluciona en la v2.03.


 3.4.  Entorno bash  y funciones


 Como he mencionado antes, PS1, PS2, PS3, PS4 y PROMPT_COMMAND se
 almacenan todas en el entorno del bash. Para aquellos que provengan
 del DOS, la idea de almacenar gran cantidad de c�digo en el entorno es
 aterradora, ya que el entorno del DOS era peque�o, y no creci� bien
 exactamente.  Posiblemente haya l�mites pr�cticos en lo que se puede y
 debe poner en el entorno, pero no los conozco, y probablemente se est�
 hablando de un par de �rdenes de magnitud mayores de a lo que est�n
 acostumbrados los usuarios de DOS. Como dijo Dan:

 En mi shell interactivo tengo 62 alias y 25 funciones. Mi regla es que
 si necesito algo �nicamente para uso interactivo y puedo escribirlo
 bien en bash, hago de ello una funci�n de shell (teniendo en cuenta
 que no pueda expresarse de manera sencilla como un alias). Si la gente
 se preocupa por la memoria no deber�an estar usando bash. bash es uno
 de los programas m�s grandes que ejecuto en mi m�quina LiNUX (aparte
 de Oracle).  Ejecute top alg�n tiempo y pulse �M� para ordenar por
 memoria, y compruebe lo cerca que est� bash de la cima de la lista. O
 sea, que es �mayor que sendmail!... Recomienda que utilicen mejor  ash
 o algo as�.

 Supongo que estaba usando la consola el d�a que prob� eso: ejecutando
 X y aplicaciones X obtendr� muchas cosas mayores que bash. Pero la
 idea es la misma: el entorno es algo para ser usado, sin preocupaci�n
 de desbordarlo.

 Me arriesgo a la censura de los gur�s de unix cuando digo esto (por el
 delito de supersimplificaci�n), pero las funciones son b�sicamente
 peque�os shell scripts que se cargan en el entorno con el prop�sito de
 una mayor eficiencia. Citando a Dan de nuevo: las funciones shell son
 lo m�s eficiente. El procedimiento es similar a un source de un shell
 script pero con el ahorro de las operaciones entrada/salida, ya que la
 funci�n se encuentra ya en memoria. Las funciones shell se cargan
 t�picamente del .bashrc o .bash_profile dependiendo de si se las
 quiere en el shell inicial o en los sucesivos subshells tambi�n.

 Comp�rese esto con la ejecuci�n de un shell script: el shell realiza
 un  fork, el hijo lleva a cabo un exec, potencialmente se busca el
 path, el kernel abre el fichero y examina la cantidad suficiente de
 bytes para saber c�mo ejecutarlo, en el caso de un shell script debe
 arrancarse un shell con el nombre del script como argumento. Comparado
 con una funci�n shell, cualquier cosa aparte de la ejecuci�n de las
 sentencias, puede considerarse una sobrecarga innecesaria.



 4.  Manipulaciones de la barra de t�tulo de Xterm


 Pueden usarse secuencias de escape no imprimibles para producir
 efectos interesantes en los prompts. Para usar estas secuencias es
 necesario encerrarlas entre \[ y \], advirtiendo al bash de que ignore
 estas secuencias cuando calcule la longitud del prompt. No incluir
 estos delimitadores resulta en una colocaci�n err�nea del cursor en el
 c�digo de edici�n de l�nea, ya que no conoce el tama�o real del
 prompt.  Las secuencias de escape adem�s deben ir precedidas de \033[
 en bash anteriores a la versi�n 2, o por \033[ o \[e en versiones
 posteriores.

 Si se intenta cambiar la barra de t�tulo de la Xterm con el prompt
 mientras se est� en la consola, se producir� basura en el prompt. Para
 evitar esto, hay que comprobar la variable de entorno TERM para
 indicar que el prompt va a estar en una xterm:










   function proml
   {
   case $TERM in
       xterm*)
           local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
           ;;
       *)
           local TITLEBAR=''
           ;;
   esac

   PS1="${TITLEBAR}\
   [\$(date +%H%M)]\
   [\u@\h:\w]\
   \$ "
   PS2='> '
   PS4='+ '
   }




 Esta es una funci�n que puede ser a�adida al ~/.bashrc. Entonces se
 podr� invocar a la funci�n mediante su nombre. La funci�n, como la
 cadena PS1, se almacena en el entorno. Una vez que la funci�n ha dado
 valor a la cadena PS1, se puede eliminar la funci�n del entorno con
 unset proml. Debido a que el prompt no puede cambiar de estar en una
 Xterm a estar en la consola, la variable TERM no se comprueba cada vez
 que se genera el prompt. He usado marcadores de comtinuaci�n
 (contrabarras, \)  en la definici�n del prompt, para permitir
 continuarlo a lo largo de varias l�neas. Esto mejora la legibilidad,
 haciendo m�s f�cil modificarlo o depurarlo.

 Lo he definido como una funci�n porque es as� como funciona el paquete
 Bashprompt: no es la �nica manera de hacerlo pero funciona bien. A
 medida que los prompts usados se tornen m�s complejos, resulta m�s y
 m�s tedioso teclearlos en la l�nea de comando, y m�s pr�ctico
 situarlos en alg�n tipo de fichero de texto. En este caso, para probar
 esto como prompt, salve lo de arriba como un fichero de texto llamado
 proml. Se puede trabajar con �l de la manera que sigue:



      [giles@nikola:/bin (4.498 Mb)]$ cd     -> Ir a donde se almacena el prompt
      [giles@nikola:~ (0 Mb)]$ vi proml      -> Editar el prompt
             ...                             -> Introducir el texto anterior
      [giles@nikola:~ (0 Mb)]$ source proml  -> Leer la funcion de prompt
      [giles@nikola:~ (0 Mb)]$ proml         -> Ejecutar la funcion de
      prompt




 El primer paso en la creaci�n del prompt es comprobar si el shell en
 el que nos encontramos es o no una xterm; si lo es, estar� definida la
 variable de entorno ($(TITLEBAR)). Esta consiste de la secuencia de
 escape apropiada, y \u@;\h:\w, lo que escribe
 <usuario>@<m�quina>:<directorio> en la barra de t�tulo de la Xterm.
 Esto es particularmente �til para xterm minimizadas haci�ndolas m�s
 r�pidamente identificables. El resto de material de este prompt
 deber�a ser familiar de prompts previos que hemos creado.

 El �nico percance que puede darse manipulando la barra de t�tulo de la
 xterm de esta forma ocurre cuando se ingresa en un sistema en el que
 no se ha preparado la barra de t�tulo: la xterm continuar� mostrando
 la informaci�n del sistema anterior que ten�a la barra de t�tulo
 manipulada.


 5.  Secuencias de escape ANSI: colores y movimientos del cursor

 5.1.  Colores


 Como se mencion� antes, las secuencias escape de caracteres no
 imprimibles tienen que encerrarse entre \[\033[ y \]. Para las
 secuencias de escape de color, tambi�n deben aparecer, seguidos adem�s
 de una m min�scula.

 Si se prueba uno de los prompts siguientes en una xterm y resulta que
 no se ven los colores nombrados, compruebe su ~/.Xdefaults (y
 posiblemente sus hermanos) y busque l�neas como XTerm*Foreground:
 BlanchedAlmond. Esto puede comentarse colocando un ! delante. Por
 supuesto, depende de qu� emulador de terminal est� usando. Este es el
 lugar m�s probable en el que los colores de su terminal pueden ser
 redefinidos.

 Para incluir texto azul en el prompt



             PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "




 El problema con este prompt es que el color azul que comienza con el
 c�digo 34 no se retorna nunca al color habitual, por lo que cualquier
 texto que se teclee despu�s del prompt ser� del mismo color que el
 prompt.  Este es tambi�n un azul oscuro, as� que combinarlo con el
 c�digo de negrita puede resultar �til:



             PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] "





 Ahora el prompt es azul claro, y termina cambiando el color de nuevo a
 �nada� (el color que se ten�a previamente de primer plano)

 Aqu� est� el resto de equivalencias de colores:



             Negro       0;30     Gris oscuro    1;30
             Azul        0;34     Azul claro     1;34
             Verde       0;32     Verde claro    1;32
             Cyan        0;36     Cyan claro     1;36
             Rojo        0;31     Rojo claro     1;31
             Purpura     0;35     Purpura claro  1;35
             Marron      0;33     Amarillo       1;33
             Gris claro  0;37     blanco         1;37




 Tambi�n se pueden poner colores de fondo, usando 44 para fondo azul,
 41 para fondo rojo, etc. No hay colores de fondo 'negrita'; se pueden
 usar combinaciones, como texto rojo claro sobre fondo azul
 \[\033[44;1;31m\], aunque parece que funciona mejor poner los colores
 separadamente (es decir, \[\033[44m\]\[\033[1;31m\]). Otros c�digos
 disponibles incluyen 4: subrayado, 5: parpadeante, 7: inverso y 8:
 oculto.

 Nota: mucha gente (yo incluido), tienen fuertes objeciones al uso del
 atributo �parpadeo�. Afortunadamente no funciona en ning�n emulador de
 terminal que yo conozca - pero si que funciona en la consola. Y si
 alguien se preguntaba (como yo hice) ��para qu� sirve el atributo
 oculto?�, yo he visto usarlo en un ejemplo de shell script (no en un
 prompt) que permit�a introducir un password sin ser reflejado en la
 pantalla.

 Basado en el prompt elite2 del paquete bashprompt (que he modificado
 para funcionar mejor en una consola est�ndar, en lugar de con los
 tipos especiales de xterm necesarios para ver correctamente el
 original), este es un prompt que he usado mucho:



        function elite
        {

        local GRAY="\[\033[1;30m\]"
        local LIGHT_GRAY="\[\033[0;37m\]"
        local CYAN="\[\033[0;36m\]"
        local LIGHT_CYAN="\[\033[1;36m\]"

        case $TERM in
            xterm*)
                local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
                ;;
            *)
                local TITLEBAR=""
                ;;
        esac

        local GRAD1=$(tty|cut -d/ -f3)
        PS1="$TITLEBAR\
        $GRAY-$CYAN-$LIGHT_CYAN(\
        $CYAN\u$GRAY@$CYAN\h\
        $LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
        $CYAN\#$GRAY/$CYAN$GRAD1\
        $LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
        $CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\
        $LIGHT_CYAN)$CYAN-$GRAY-\
        $LIGHT_GRAY\n\
        $GRAY-$CYAN-$LIGHT_CYAN(\
        $CYAN\$$GRAY:$CYAN\w\
        $LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY "
        PS2="$LIGHT_CYAN-$CYAN-$GRAY-$LIGHT_GRAY "
        }




 Defino los colores como variables temporales del shell en favor de la
 legibilidad. Es m�s f�cil trabajar as�. La variable GRAD1 es una
 comprobaci�n para determinar en qu� terminal se est�. Como la prueba
 para saber si se est� en una xterm, solo es necesario llevarla a cabo
 una vez. El prompt es similar a esto, excepto el color





        --(giles@nikola)-(75/ttyp7)-(1908/12-Oct-98)--
        --($:~/tmp)--




 Para recordar qu� colores hay disponibles, uso el siguiente script que
 saca todos los colores por pantalla:


























































   #!/bin/bash
   #
   # Este fichero saca por pantalla un monton de codigos de color
   # para demostrar que hay disponible. Cada linea es un color con
   # fondo negro y gris, con el codigo en medio. Funciona sobre
   # fondos blancos, negros y verdes (2 dic. 98)
   #
   echo "  Sobre gris claro:        Sobre negro:"
   echo -e "\033[47m\033[1;37m  Blanco        \033[0m\
    1;37m \
   \033[40m\033[1;37m  Blanco        \033[0m"
   echo -e "\033[47m\033[37m  Gris Claro    \033[0m\
      37m \
   \033[40m\033[37m  Gris Claro    \033[0m"
   echo -e "\033[47m\033[1;30m  Gris          \033[0m\
    1;30m \
   \033[40m\033[1;30m  Gris          \033[0m"
   echo -e "\033[47m\033[30m  Negro         \033[0m\
      30m \
   \033[40m\033[30m  Negro         \033[0m"
   echo -e "\033[47m\033[31m  Rojo          \033[0m\
      31m \
   \033[40m\033[31m  Rojo          \033[0m"
   echo -e "\033[47m\033[1;31m  Rojo Claro    \033[0m\
    1;31m \
   \033[40m\033[1;31m  Rojo Claro    \033[0m"
   echo -e "\033[47m\033[32m  Verde         \033[0m\
      32m \
   \033[40m\033[32m  Verde         \033[0m"
   echo -e "\033[47m\033[1;32m  Verde Claro   \033[0m\
    1;32m \
   \033[40m\033[1;32m  Verde Claro   \033[0m"
   echo -e "\033[47m\033[33m  Marr�n        \033[0m\
      33m \
   \033[40m\033[33m  Marron        \033[0m"
   echo -e "\033[47m\033[1;33m  Amarillo      \033[0m\
    1;33m \
   \033[40m\033[1;33m  Amarillo      \033[0m"
   echo -e "\033[47m\033[34m  Azul          \033[0m\
      34m \
   \033[40m\033[34m  Azul          \033[0m"
   echo -e "\033[47m\033[1;34m  Azul Claro    \033[0m\
    1;34m \
   \033[40m\033[1;34m  Azul Claro    \033[0m"
   echo -e "\033[47m\033[35m  P�rpura       \033[0m\
      35m \
   \033[40m\033[35m  Purpura       \033[0m"
   echo -e "\033[47m\033[1;35m  Rosa          \033[0m\
    1;35m \
   \033[40m\033[1;35m  Rosa          \033[0m"
   echo -e "\033[47m\033[36m  Cyan          \033[0m\
      36m \
   \033[40m\033[36m  Cyan          \033[0m"
   echo -e "\033[47m\033[1;36m  Cyan Claro    \033[0m\
    1;36m \
   \033[40m\033[1;36m  Cyan Claro    \033[0m"





 5.2.  Movimiento del cursor


 Las secuencias de escape ANSI permiten mover el cursor por la pantalla
 a voluntad. Esto es m�s �til para interfaces de usuario a pantalla
 completa generados por shell scripts, pero tambi�n se pueden usar en
 prompts. Las secuencias de escape de movimientos son las siguientes:



             - Posicionar el cursor:
               \033[<L>;<C>H
               pone el cursor en la linea L, columna C.
             - Mover el cursor arriba N lineas:
               \033[<N>A
             - Mover el cursor abajo N lineas:
               \033[<N>B
             - Mover el cursor hacia adelante N columnas:
               \033[<N>C
             - Mover el cursor hacia atras N columnas:
               \033[<N>D
             - Guardar la posicion del cursor:
               \033[s
             - Restaurar la posicion del cursor:
               \033[u




 Los dos �ltimos c�digos no est�n presentes en muchos emuladores de
 terminal. Los �nicos que conozco que los soportan son xterm y nxterm,
 a pesar de que la mayor�a de los emuladores de terminal est�n basados
 en el c�digo de xterm. Por lo que yo s�, ni rxvt, kvt ni xiterm ni
 Eterm no soportan esto. La consola s� lo soporta.

 Pruebe a poner la siguiente l�nea de c�digo en el prompt (est� m�s
 claro lo que hace si el prompt est� bastantes l�neas m�s abajo que el
 tope superior de la terminal)




      echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"




 Esto deber�a mover el cursor 7 l�neas hacia arriba de la pantalla,
 escribir la palabra BASH, y volver a su sitio habitual en el prompt.
 Esto no es un prompt, es solo una demostraci�n de movimiento del
 cursor por la pantalla, usando color para enfatizar lo que se ha
 hecho.

 Salve lo siguiente en un fichero llamado clock:   (-- N.del T.:
 para que funcione bien, he tenido que poner let prompt_x=$COLUMNS-7,
 en lugar de la l�nea original--)















   #!/bin/bash

   function prompt_command {
   let prompt_x=$COLUMNS-5
   }

   PROMPT_COMMAND=prompt_command

   function clock {
   local       BLUE="\[\033[0;34m\]"
   local        RED="\[\033[0;31m\]"
   local  LIGHT_RED="\[\033[1;31m\]"
   local      WHITE="\[\033[1;37m\]"
   local  NO_COLOUR="\[\033[0m\]"
   case $TERM in
       xterm*)
           TITLEBAR='\[\033]0;\u@\h:\w\007\]'
           ;;
       *)
           TITLEBAR=""
           ;;
   esac

   PS1="${TITLEBAR}\
   \[\033[s\033[1;\$(echo -n \${prompt_x})H\]\
   $BLUE[$LIGHT_RED\$(date +%H%M)$BLUE]\[\033[u\033[1A\]
   $BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
   $WHITE\$$NO_COLOUR "
   PS2='> '
   PS4='+ '
   }




 Este prompt es bastante sencillo, excepto por el hecho de que mantiene
 un reloj en la esquina superior derecha de la pantalla (incluso aunque
 se var�e de tama�o el terminal). Esto NO funcionar� en los emuladores
 de terminal que he mencionado que no aceptan guardar y recuperar la
 posici�n del cursor. Si se intenta ejecutar este prompt en cualquiera
 de esos terminales, el reloj aparecer� correctamente, pero el prompt
 quedar� encajado en la segunda l�nea del terminal.

 V�ase la secci�n ``Prompt con Reloj Elegante e In�til'' para un uso
 m�s extensivo de estos c�digos.


 5.3.  Movimiento del cursor con tput


 Como ocurre con muchas cosas en unix, hay m�s de una forma de
 conseguir los mismos objetivos. Una utilidad llamada tput puede
 tambi�n usarse para mover el cursor por la pantalla, o devolver
 informaci�n acerca del estado del terminal. tput es menos flexible que
 las secuencias de escape ANSI para el posicionamiento del cursor: s�lo
 se puede mover el cursor a una posici�n absoluta, no se puede mover
 con relaci�n a la posici�n actual. Yo no uso tput, as� que no voy a
 explicarlo en detalle. Consulte la p�gina del manual y sabr� tanto
 como yo de tput.



 6.  Caracteres especiales: secuencias de escape octales



 Aparte de los caracteres que se pueden teclear mediante un teclado,
 hay muchos otros que se pueden mostrar por la pantalla. He creado un
 script que permite comprobar qu� tiene disponible el tipo que est�
 usando. El comando principal a usar para utilizar estos caracteres es
 echo -e.  La opci�n -e le indica a echo que habilite la interpretaci�n
 de caracteres escapados mediante contrabarra. Lo que aparezca a partir
 de un 200-400 octal ser� muy diferente con un tipo VGA de lo que
 aparezca con un tipo est�ndar linux. Queda avisado de que algunas de
 estas secuencias de escape tienen extra�os efectos en el terminal, y
 no he intentado evitarlos. Los caracteres de dibujos de l�neas y
 bloques (que nos resultan tan familiares a los usuarios de
 WordPerfect)  utilizados masivamente en el proyecto Bashprompt est�n
 entre el 260 y 337 octal.





















































   #!/bin/bash

   #   Script: escgen

   function usage {
      echo -e "\033[1;34mescgen\033[0m <valor_inferior> [<valor_superior>]"
      echo "   Generador de secuencias de escape octales: imprime todas las"
      echo "   secuencias de escape contenidas entre los valores menor y"
      echo "   mayor. Si no se proporciona el segundo valor, se imprimen"
      echo "   8 caracteres."
      echo "   1998 - Giles Orr, sin garant�a."
      exit 1
   }

   if [ "$#" -eq "0" ]
   then
      echo -e "\033[1;31mPor favor incluya uno o dos valores.\033[0m"
      usage
   fi
   let lower_val=${1}
   if [ "$#" -eq "1" ]
   then
      # Si no hay dos valores, sacar 8 caracteres
      upper_val=$(echo -e "obase=8 \n ibase=8 \n $lower_val+10 \n quit" | bc)
   else
      let upper_val=${2}
   fi
   if [ "$#" -gt "2" ]
   then
      echo -e "\033[1;31mPor favor, incluya dos valores.\033[0m"
      echo
      usage
   fi
   if [ "${lower_val}" -gt "${upper_val}" ]
   then
      echo -e "\033[1;31m${lower_val} es mayor que ${upper_val}."
      echo
      usage
   fi
   if [ "${upper_val}" -gt "777" ]
      then
      echo -e "\033[1;31mLos valores no pueden superar 777.\033[0m"
      echo
      usage
   fi

   let i=$lower_val
   let line_count=1
   let limit=$upper_val
   while [ "$i" -lt "$limit" ]
   do
      octal_escape="\\$i"
      echo -en "$i:'$octal_escape' "
      if [ "$line_count" -gt "7" ]
      then
         echo
         #   Put a hard return in.
         let line_count=0
      fi
      let i=$(echo -e "obase=8 \n ibase=8 \n $i+1 \n quit" | bc)
      let line_count=$line_count+1
   done
   echo



 Tambi�n se puede usar xfd para mostrar todos los caracteres de un tipo
 X, mediante el comando xfd -fn <tipo>. Pinchando sobre un caracter
 determinado se puede obtener mucha informaci�n sobre �l, incluyendo su
 valor octal. El script de arriba puede resultar �til en la consola, y
 en el caso de que no se est� seguro acerca del nombre del tipo de
 letra.


 7.  El paquete Bash Prompt

 7.1.  Disponibilidad


 El paquete Bash Prompt est� disponible en http://bash.current.nu, y es
 el resultado del trabajo de varias personas coordinadas por Rob
 Current (aka (-- N del T.:
 tambi�n como ..., alias ....--)

 BadLandZ). El paquete se encuentra en sus primeras betas, pero
 proporciona una manera simple de usar m�ltiples prompts (o temas),
 permitiendo poner prompts para los shells de ingreso (login shells), y
 para los subshells (es decir, poner cadenas PS1 en .bash_profile y
 .bashrc).

 La mayor�a de los temas usan caracteres VGA extendidos, as� que se ven
 mal a menos que se usen fuentes VGA (que no viene por defecto en la
 mayor�a de los sistemas).


 7.2.  Cambio de fuentes en una xterm


 Para usar algunos de los prompts m�s bonitos del paquete Bash Prompt,
 es necesario obtener e instalar fuentes que soporten el conjunto de
 caracteres esperado por los prompts. Se conocen como fuentes VGA, pero
 no tengo clara la distinci�n entre estos y las que Linux suele
 incluir, aunque claramente soportan diferentes conjuntos de
 caracteres.

 Las xterm est�ndar soportan un alfabeto extendido, incluyendo muchas
 letras con tildes. En las fuentes VGA todo esto se reemplaza con
 caracteres gr�ficos (l�neas, puntos, bloques...). Si alguien puede
 explicar esto con m�s detalle, que se ponga en contacto conmigo e
 incluir� la explicaci�n aqu�.

 (--  N. del T.:
 que tenga caracteres gr�ficos y adem�s incluya vocales acentuadas y
 e�es, para que resulte �til a un usuario hispanoamericano. Esto lo he
 hecho yo en mi sistema--)

 Obtener e instalar estas fuentes es de alguna forma un proceso
 relacionado.  Primero hay que conseguir lo(s) tipo(s). Despu�s
 asegurarse de que son ficheros .pcf o .pcf.gz. Si son ficheros .bdf
 viene bien el comando bdftopcf (mirar la p�gina del manual). Hay que
 colocar estos ficheros en el directorio /usr/X11R6/lib/X11/fonts/misc
 (este es el lugar correcto para RedHat 5.1 y Slackware 3.4  (-- N. del
 T.:
 RedHat 6.0.--) , aunque podr�an variar en otras distribuciones). Desde
 el directorio en cuesti�n hay que ejecutar el comando mkfontdir,
 seguido de xset fp rehash. En ocasiones es una buena idea editar el
 fichero fonts.alias del mismo directorio y crear alias m�s cortos para
 los tipos.

 Para usar los nuevos tipos, hay que lanzar el emulador de terminal
 deseado con el comando apropiado, que se puede encontrar bien en la
 p�gina del manual correspondiente o mediante la opci�n --help de l�nea
 de comando. En los emuladores de terminal m�s populares se usan as�:



             xterm -font <tipo>




 o



             xterm -fn <tipo> -fb <tipo-negrita>
             Eterm -F <tipo>
             rxvt -fn <tipo>




 Hay tipos VGA disponibles en la p�gina de Tipos ANSI de Stumpy en
 http://home.earthlink.net/~us5zahns/enl/ansifont.html (de la que he
 tomado mucho para escribir este documento).


 8.  Carga de un prompt diferente

 8.1.  Carga de un prompt diferente posterior


 Las explicaciones en este COMO han mostrado c�mo crear las variables
 de entorno PS1, o c�mo incorporar las cadenas PS1 y PS2 a funciones
 que pod�an ser llamadas por ~/.bashrc o como un tema por el paquete
 Bash Prompt.

 Mediante el paquete Bash Prompt, basta con escribir bashprompt -i para
 ver una lista de temas disponibles. Para poner un prompt a los shells
 de ingreso (login shells) futuros (sobre todo la consola, pero tambi�n
 telnet y Xterms, dependiendo de c�mo est�n configuradas las Xterms),
 se hace con bashprompt -l tema. bashprompt entonces modifica el
 ~/.bash_profile para llamar al tema seleccionado al arrancar. Para
 poner un prompt a subshells futuros (normalmente Xterms, rxvt, etc.),
 se hace con bashprompt -s tema, y bashprompt modifica el ~/.bashrc
 para llama al tema apropiado al iniciarse.

 Vea ``Valor permanente de las cadenas PS?'' la nota de Johan Kullstam
 acerca de la importancia de poner las cadenas PS? en ~/.bashrc


 8.2.  Carga inmediata de un prompt diferente


 Se puede cambiar el prompt en el terminal actual (usando la funci�n de
 ejemplo elite de arriba) escribiendo source elite seguido de elite
 (suponiendo que el fichero de la funci�n elite se encuentre en el
 directorio de trabajo). Esto es engorroso, y deja una funci�n extra
 (elite) en el espacio de entorno --si quiere limpiar el entorno, se
 hace con unset elite--. Esto parece un buen candidato para un peque�o
 shell script, pero un script no funciona aqu� porque no puede cambiar
 el entorno del shell actual: solo puede cambiar el entorno del
 subshell en el que se ejecuta. En cuanto termina el script, el
 subshell desaparece y con �l los cambios hechos al entorno.

 Algo que si puede cambiar el entorno del shell actual son las
 funciones de entorno. El paquete Bash Prompt coloca una funci�n
 llamada callbashprompt en el entorno, y, mientras no se documente, no
 puede usarse para cargar ning�n tema de bashprompt sobre la marcha.
 Mira en el directorio de temas que instala (el tema que se llama debe
 estar all�), hace un source de la funci�n solicitada, carga la funci�n
 y luego la elimina, de forma que mantiene el entorno limpio.
 callbashprompt no fue pensada para usarse de este modo, y no tiene
 control de errores, pero si se tiene esto en cuenta, funciona bastante
 bien.




 9.  Prompt din�mico con color seg�n la carga del sistema

 9.1.  Un ejemplo de �prueba de concepto�


 Esto es una �prueba de concepto� m�s que un prompt bonito: cambio de
 colores en el prompt din�micamente. En este ejemplo, el color del
 nombre del host cambia dependiendo de la carga (a modo de aviso).



        #!/bin/bash
        #   "hostloadcolour" - 17 Octubre 98, by Giles
        #
        #   La idea aqui es cambiar el color del nombre del host en el prompt
        #   dependiendo de un valor de carga que sirve de umbral.

        # THRESHOLD_LOAD es el valor de la carga en un minuto
        # (multiplicado por 100) al cual se desea que el prompt
        # cambie de COLOUR_LOW a COLOUR_HIGH

        THRESHOLD_LOAD=200
        COLOUR_LOW='1;34'
                  # light blue
        COLOUR_HIGH='1;31'
                   # light red

        function prompt_command {
        ONE=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
        # Aparentemente "scale" en bc no se aplica a las multiplicaciones
        # pero si a las divisiones
        ONEHUNDRED=$(echo -e "scale=0 \n $ONE/0.01 \nquit \n" | bc)
        if [ $ONEHUNDRED -gt $THRESHOLD_LOAD ]
        then
            HOST_COLOUR=$COLOUR_HIGH
                # Light Red
        else
            HOST_COLOUR=$COLOUR_LOW
                # Light Blue
        fi
        }

        function hostloadcolour {

        PROMPT_COMMAND=prompt_command
        PS1="[$(date +%H%M)][\u@\[\033[\$(echo -n \$HOST_COLOUR)m\]\h\[\033[0;37m\]:\w]$ "
        }




 Mediante su editor favorito, salve esto en un fichero llamado
 hostloadcolour. Si tiene instalado el paquete Bash Prompt, funcionar�
 como un tema. Si no lo tiene, escriba source hostloadcolour seguido de
 hostloadcolour. De cualquiera de las dos formas, prompt_commad se
 convierte en una funci�n del entorno. Si examina el c�digo, notar� que
 los colores ($COLOUR_HIGH y $COLOUR_LOW) se ponen mediante un c�digo
 parcial de color, es decir, 1;34 en lugar de \[\033[1;34m\], cosa que
 hubiera preferido, pero no he sido capaz de que funcione con el c�digo
 completo. Le agradecer�a que me avisara si lo consigue.


 10.  Prompt de ejemplo

 10.1.  Un prompt �ligero�




        function proml {
        local BLUE="\[\033[0;34m\]"
        local RED="\[\033[0;31m\]"
        local LIGHT_RED="\[\033[1;31m\]"
        local WHITE="\[\033[1;37m\]"
        local NO_COLOUR="\[\033[0m\]"
        case $TERM in
            xterm*)
                TITLEBAR='\[\033]0;\u@\h:\w\007\]'
                ;;
            *)
                TITLEBAR=""
                ;;
        esac

        PS1="${TITLEBAR}\
        $BLUE[$RED\$(date +%H%M)$BLUE]\
        $BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
        $WHITE\$$NO_COLOUR "
        PS2='> '
        PS4='+ '
        }





 10.2.  Tema elite de Bashprompt


 Es necesaria una fuente VGA



        # Created by KrON from windowmaker on IRC
        # Changed by Spidey 08/06
        function elite {
        PS1="\[\033[31m\]\332\304\[\033[34m\](\[\033[31m\]\u\[\033[34m\]@\[\033[31m\]\h\
        \[\033[34m\])\[\033[31m\]-\[\033[34m\](\[\033[31m\]\$(date +%I:%M%P)\
        \[\033[34m\]-:-\[\033[31m\]\$(date +%m)\[\033[34m\033[31m\]/\$(date +%d)\
        \[\033[34m\])\[\033[31m\]\304-\[\033[34m]\\371\[\033[31m\]-\371\371\
        \[\033[34m\]\372\n\[\033[31m\]\300\304\[\033[34m\](\[\033[31m\]\W\[\033[34m\])\
        \[\033[31m\]\304\371\[\033[34m\]\372\[\033[00m\]"
        PS2="> "
        }







 10.3.  Prompt de usuario avanzado


 Este es el prompt que yo uso, pero se nota un cierto retraso en la
 aparici�n del prompt en un PII-400 monousuario, as� que no lo
 recomendar�a para un P-100 multiusuario... T�melo como una idea, m�s
 que como un prompt pr�ctico.



























































   #!/bin/bash
   #----------------------------------------------------------------------
   #       POWER USER PROMPT "pprom2"
   #----------------------------------------------------------------------
   #
   #   Created August 98, Last Modified 9 November 98 by Giles
   #
   #  Problema: cuando la carga baja, dice "1.35down-.08". Hay que deshacerse
   #  del negativo

   function prompt_command
   {
   #   Crea la variable TotalMeg: la suma de los tamagnos de los ficheros
   #   visibles del directorio actual
   local TotalBytes=0
   for Bytes in $(ls -l | grep "^-" | cut -c30-41)
   do
       let TotalBytes=$TotalBytes+$Bytes
   done
   TotalMeg=$(echo -e "scale=3 \nx=$TotalBytes/1048576\n if (x<1)
         {print \"0\"} \n print x \nquit" | bc)

   #      Esto se usa para calcular el diferencial en los valores
   #      de carga proporcionados por el comando "uptime". "uptime"
   #      proporciona medias de carga en 1, 5, y 15 minutos.
   #
   local one=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
   local five=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\).*/\2/" -e "s/ //g")
   local diff1_5=$(echo -e "scale = scale ($one) \nx=$one - $five\n if (x>0)
         {print \"up\"} else {print \"down\"}\n print x \nquit \n" | bc)
   loaddiff="$(echo -n "${one}${diff1_5}")"

   #   Cuenta los ficheros visibles:
   let files=$(ls -l | grep "^-" | wc -l | tr -d " ")
   let hiddenfiles=$(ls -l -d .* | grep "^-" | wc -l | tr -d " ")
   let executables=$(ls -l | grep ^-..x | wc -l | tr -d " ")
   let directories=$(ls -l | grep "^d" | wc -l | tr -d " ")
   let hiddendirectories=$(ls -l -d .* | grep "^d" | wc -l | tr -d " ")-2
   let linktemp=$(ls -l | grep "^l" | wc -l | tr -d " ")
   if [ "$linktemp" -eq "0" ]
   then
       links=""
   else
       links=" ${linktemp}l"
   fi
   unset linktemp
   let devicetemp=$(ls -l | grep "^[bc]" | wc -l | tr -d " ")
   if [ "$devicetemp" -eq "0" ]
   then
       devices=""
   else
       devices=" ${devicetemp}bc"
   fi
   unset devicetemp

   }

   PROMPT_COMMAND=prompt_command

   function pprom2 {

   local        BLUE="\[\033[0;34m\]"
   local  LIGHT_GRAY="\[\033[0;37m\]"
   local LIGHT_GREEN="\[\033[1;32m\]"
   local  LIGHT_BLUE="\[\033[1;34m\]"
   local  LIGHT_CYAN="\[\033[1;36m\]"
   local      YELLOW="\[\033[1;33m\]"
   local       WHITE="\[\033[1;37m\]"
   local         RED="\[\033[0;31m\]"
   local   NO_COLOUR="\[\033[0m\]"

   case $TERM in
       xterm*)
           TITLEBAR='\[\033]0;\u@\h:\w\007\]'
           ;;
       *)
           TITLEBAR=""
           ;;
   esac

   PS1="$TITLEBAR\
   $BLUE[$RED\$(date +%H%M)$BLUE]\
   $BLUE[$RED\u@\h$BLUE]\
   $BLUE[\
   $LIGHT_GRAY\${files}.\${hiddenfiles}-\
   $LIGHT_GREEN\${executables}x \
   $LIGHT_GRAY(\${TotalMeg}Mb) \
   $LIGHT_BLUE\${directories}.\
   \${hiddendirectories}d\
   $LIGHT_CYAN\${links}\
   $YELLOW\${devices}\
   $BLUE]\
   $BLUE[${WHITE}\${loaddiff}$BLUE]\
   $BLUE[\
   $WHITE\$(ps ax | wc -l | sed -e \"s: ::g\")proc\
   $BLUE]\
   \n\
   $BLUE[$RED\$PWD$BLUE]\
   $WHITE\$\
   \
   $NO_COLOUR "
   PS2='> '
   PS4='+ '
   }





 10.4.  Un prompt con la anchura del terminal


 Un amigo se quej� de que no le gustaba tener un prompt que cambiara su
 tama�o debido a que ten�a un $PWD, as� que escrib� este prompt que
 ajusta su tama�o a la anchura exacta del terminal, con el directorio
 de trabajo en la l�nea superior.
















   #!/bin/bash

   #   termwide prompt
   #      by Giles - created 2 November 98
   #
   #  La idea aqui es tener la linea superior de un prompt de 2 lineas
   #  siempre de la misma anchura que el terminal. Esto se consigue
   #  calculando la anchura de los elementos de texto, y rellenando
   #  o truncando $PWD
   #

   function prompt_command {

   TERMWIDTH=${COLUMNS}

   #   Calcula la anchura del prompt:

   hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
   #   "whoami" y "pwd" incluyen un caracter de nueva l�nea al final
   usernam=$(whoami)
   let usersize=$(echo -n $usernam | wc -c | tr -d " ")
   newPWD="${PWD}"
   let pwdsize=$(echo -n ${newPWD} | wc -c | tr -d " ")
   #   Agnadir los accesorios debajo...
   let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})--" \
                    | wc -c | tr -d " ")
   let fillsize=${TERMWIDTH}-${promptsize}
   fill=""
   while [ "$fillsize" -gt "0" ]
   do
      fill="${fill}-"
      let fillsize=${fillsize}-1
   done

   if [ "$fillsize" -lt "0" ]
   then
      let cut=3-${fillsize}
      sedvar=""
      while [ "$cut" -gt "0" ]
      do
         sedvar="${sedvar}."
         let cut=${cut}-1
      done
      newPWD="...$(echo -n $PWD | sed -e "s/\(^${sedvar}\)\(.*\)/\2/")"
   fi
   }

   PROMPT_COMMAND=prompt_command

   function termwide {

   local GRAY="\[\033[1;30m\]"
   local LIGHT_GRAY="\[\033[0;37m\]"
   local WHITE="\[\033[1;37m\]"
   local NO_COLOUR="\[\033[0m\]"

   local LIGHT_BLUE="\[\033[1;34m\]"
   local YELLOW="\[\033[1;33m\]"

   case $TERM in
       xterm*)
           TITLEBAR='\[\033]0;\u@\h:\w\007\]'
           ;;
       *)
           TITLEBAR=""
           ;;
   esac

   PS1="$TITLEBAR\
   $YELLOW-$LIGHT_BLUE-(\
   $YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
   ${LIGHT_BLUE})-${YELLOW}-\${fill}${LIGHT_BLUE}-(\
   $YELLOW\${newPWD}\
   $LIGHT_BLUE)-$YELLOW-\
   \n\
   $YELLOW-$LIGHT_BLUE-(\
   $YELLOW\$(date +%H%M)$LIGHT_BLUE:$YELLOW\$(date \"+%a,%d %b %y\")\
   $LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)-\
   $YELLOW-\
   $NO_COLOUR "

   PS2="$LIGHT_BLUE-$YELLOW-$YELLOW-$NO_COLOUR "

   }





 10.5.  Prompt con Reloj elegante e in�til


 Este es posiblemente el prompt m�s atractivo (e in�til) que he creado.
 Debido a que muchos emuladores de terminal X no implementan las
 funciones de salvar y restaurar la posici�n del cursor, la alternativa
 cuando se sit�a un reloj en la esquina superior derecha es anclar el
 cursor a la parte baja del terminal. Esto se basa en la idea del
 prompt de la anchura del terminal anterior, con el dibujo de una l�nea
 desde el prompt hasta el reloj. Es necesaria una fuente VGA.

 Nota: hay una sustituci�n en este c�digo, que puede que no se muestre
 bien al pasar de SGML a otros formatos: he tenido que sustituir el
 car�cter de pantalla pro el c�digo \304; normalmente habr�a incluido
 la secuencia \304, pero ha sido necesaria la sustituci�n en este caso:




























   #!/bin/bash

   #   Este prompt requiere una fuente VGA. El prompt se ancla a la parte
   #   baja del terminal, rellena la anchura del terminal, y dibuja una linea
   #   hacia arriba en la parte derecha del terminal hasta unirse a un reloj
   #   en la esquina superior derecha del terminal

   function prompt_command {
   #   Calcula la anchura del prompt:
   hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
   #   "whoami" y "pwd" incluyen un caracter de nueva l�nea al final
   usernam=$(whoami)
   newPWD="${PWD}"
   #   Se agnaden todos los accesorios
   let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \
                    | wc -c | tr -d " ")
   #   Adivina cuanto agnadir entre user@host y PWD (o cuanto quitar a PWD)
   let fillsize=${COLUMNS}-${promptsize}
   fill=""
   #   si el prompt no es tan ancho como el terminal, lo relleno
   while [ "$fillsize" -gt "0" ]
   do
      fill="${fill}�"
      # La A con umlaut (aparecera como un gui�n largo si se utiliza
      # una fuente VGA) es \304, pero la cort� y pegu� aqu� porque
      # Bash s�lo hace una sustituci�n, que en este caso es hacer que
      # $fill aparezca en el prompt.
      let fillsize=${fillsize}-1
   done
   #   Trunco $PWD por la derecha si el prompt es mas ancho que el terminal:
   if [ "$fillsize" -lt "0" ]
   then
      let cutt=3-${fillsize}
      sedvar=""
      while [ "$cutt" -gt "0" ]
      do
         sedvar="${sedvar}."
         let cutt=${cutt}-1
      done
      newPWD="...$(echo -n $PWD | sed -e "s/\(^${sedvar}\)\(.*\)/\2/")"
   fi
   #
   #   Creo el reloj y la barra que sube hasta el
   #
   local LIGHT_BLUE="\033[1;34m"
   local     YELLOW="\033[1;33m"
   #   Posicion del cursor para dibujar el reloj:
   echo -en "\033[2;$((${COLUMNS}-9))H"
   echo -en "$LIGHT_BLUE($YELLOW$(date +%H%M)$LIGHT_BLUE)\304$YELLOW\304\304\277"
   local i=${LINES}
   echo -en "\033[2;${COLUMNS}H"
   #   Dibujo barras verticales:
   while [ $i -ge 4 ]
   do
      echo -en "\033[$(($i-1));${COLUMNS}H\263"
      let i=$i-1
   done

   let prompt_line=${LINES}-1
   #   Esto es necesario porque hacer \${LINES} dentro de una funci�n
   #   matematica de Bash (es decir $(()) ) no parece funcionar.
   }

   PROMPT_COMMAND=prompt_command

   function clock3 {
   local LIGHT_BLUE="\[\033[1;34m\]"
   local     YELLOW="\[\033[1;33m\]"
   local      WHITE="\[\033[1;37m\]"
   local LIGHT_GRAY="\[\033[0;37m\]"
   local  NO_COLOUR="\[\033[0m\]"

   case $TERM in
       xterm*)
           TITLEBAR='\[\033]0;\u@\h:\w\007\]'
           ;;
       *)
           TITLEBAR=""
           ;;
   esac

   PS1="$TITLEBAR\
   \[\033[\${prompt_line};0H\]
   $YELLOW\332$LIGHT_BLUE\304(\
   $YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
   ${LIGHT_BLUE})\304${YELLOW}\304\${fill}${LIGHT_BLUE}\304(\
   $YELLOW\${newPWD}\
   $LIGHT_BLUE)\304$YELLOW\304\304\304\331\
   \n\
   $YELLOW\300$LIGHT_BLUE\304(\
   $YELLOW\$(date \"+%a,%d %b %y\")\
   $LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)\304\
   $YELLOW\304\
   $LIGHT_GRAY "

   PS2="$LIGHT_BLUE\304$YELLOW\304$YELLOW\304$NO_COLOUR "

   }





 11.  Anexo: El INSFLUG


 El INSFLUG forma parte del grupo internacional Linux Documentation
 Project, encarg�ndose de las traducciones al castellano de los Howtos
 (Comos), as� como la producci�n de documentos originales en aquellos
 casos en los que no existe an�logo en ingl�s.

 En el INSFLUG se orienta preferentemente a la traducci�n de documentos
 breves, como los COMOs y PUFs (Preguntas de Uso Frecuente, las FAQs.
 :) ), etc.

 Dir�jase a la sede del INSFLUG para m�s informaci�n al respecto.

 En la sede del INSFLUG encontrar� siempre las �ltimas versiones de las
 traducciones �oficiales�:  www.insflug.org. Aseg�rese de comprobar
 cu�l es la �ltima versi�n disponible en el Insflug antes de bajar un
 documento de un servidor r�plica.

 Adem�s, cuenta con un sistema interactivo de gesti�n de fe de erratas
 y sugerencias en l�nea, motor de b�squeda espec�fico, y m�s servicios
 que estamos trabajando incesantemente para a�adir.

 Se proporcionar� tambi�n una lista de los servidores r�plica (mirror)
 del Insflug m�s cercanos a Vd., e informaci�n relativa a otros
 recursos en castellano.

 En http://www.insflug.org/insflug/creditos.php3 cuenta con una
 detallada relaci�n de las personas que hacen posible tanto esto como
 las traducciones.

 �Dir�jase a http://www.insflug.org/colaboracion/index.php3 si desea
 unirse a nosotros!.

 Francisco Jos� Montilla, [email protected].