bash y sus promptsbash ?
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.
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.
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.
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]$
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:~]$
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.