¿La variable de shell PROMPT_COMMAND no funciona según lo previsto?

Quiero que mi indicador bash cambie según las condiciones externas.

Aquí hay un extracto del manual de bash:

PROMPT_COMMAND: If set, the value is executed as a command prior to issuing each primary prompt.

PS1: The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.

En mi .bash_profiletengo lo siguiente:

export PROMPT_COMMAND="echo -n ┏━━━[$(date +%H:%M)]"
export PS1="━━[\t]━━━┓\n\$ "

Esto es lo que veo en la terminal:

┏━━━[03:46]━━[03:46:52]━━━┓
$ cd ..
┏━━━[03:46]━━[03:51:37]━━━┓
$

Como puede ver, PROMPT_COMMAND no se ejecuta más de una vez y permanece estático para siempre.

¿Cómo puedo hacer que se ejecute "antes de emitir cada mensaje", como se indica en el manual?

Estoy ejecutando Mac OS X 10.9.3
echo $BASH_VERSION
3.2.51(1)-release

Respuestas (2)

Se PROMPT_COMMANDejecuta cada vez, pero el $(...)fragmento solo se evalúa cuando .bash_profilese carga. Esto se debe a que las comillas dobles aún significan expandir variables y comandos.

Si usa comillas simples, el comando no se sustituye durante la ejecución de .bash_profile, se evalúa cuando se PROMPT_COMMANDejecuta.

Gracias. Esto funciona como se esperaba: export PROMPT_COMMAND='echo -n "┏━━━[$(date +%H:%M)]"'
Acabo de descubrir que también es posible evaluar el código en la PS1 PS1="[\$(date +%H:%M)] \u@\w\ $ ". Hace que PROMPT_COMMAND sea superfluo.
@Sergei Eso es increíble, voy a usar eso. Pero por lo que estás haciendo (ya que es la línea de arriba), te recomiendo usar PROMPT_COMMAND.

Su datellamada se evaluó cuando la configuró, PROMPT_COMMANDpor lo que se atascó para siempre en el momento en que la ejecutó:

export PROMPT_COMMAND="echo -n ┏━━━[$(date +%H:%M)]"

Intente definir una función en su lugar y asignarla a PROMPT_COMMAND:

function prompt_command() {
    PS1="┏━━━[$(date +%H:%M)]━━[\t]━━━┓\n\$ "
}
export PROMPT_COMMAND=prompt_command

También puede usar \@para la hora actual en formato de 12 horas AM/PM en su aviso. Entonces:

function prompt_command() {
    PS1="┏━━━[\@]━━[\t]━━━┓\n\$ "
}
export PROMPT_COMMAND=prompt_command

te daría:

┏━━━[06:17 PM]━━[18:17:57]━━━┓
$

Y mientras hablamos de personalizaciones de bash, permítanme agregar un complemento para el excelente proyecto bash-it : es un bash equivalente a oh-my-zsh y viene con un montón de funciones de ayuda para la creación de temas. Es posible que encuentre que hace que este tipo de cosas sea un poco más fácil.

¡Gracias! Tu respuesta es muy útil (¡la función es una gran idea!), pero acepté la primera, porque explica claramente lo que sucede desde el punto de vista técnico. bash-es una mina de oro.
@Sergei no te preocupes. Así es como funciona por aquí. ¡Debe elegir la respuesta que crea que mejor representa la solución a su pregunta planteada!