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 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.
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.
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 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]$
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:~]$
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.