¿Cómo puedo hacer que el título de la window de Xterm cambie entre el command de ejecución actual y la ruta actual?

Quiero establecer el título de la window Xterm para cambiar entre dos estados:

  • Cuando se está ejecutando un command, muestre el nombre del command (por ejemplo, "less")
  • Cuando no se está ejecutando ningún command, muestre la ruta actual (por ejemplo, "src")

Puedo crear un título de window Xterm con la ruta actual con:

$ export PROMPT_COMMAND='echo -ne "\033]0;`basename ${PWD}`\007"' 

Y puedo mostrar el command de ejecución actual agregando una statement de trap a .bashrc :

 $ trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG 

Pero no puedo cambiar automáticamente entre los dos. ¿Es posible?

EDITAR: @terdon muestra una solución que funciona en un xterm regular, ¡eso es genial! Pero no mencioné que uso el MacOSX Terminal.app. Eso muestra que todavía muestra "bash" en lugar de la ruta actual cuando no se está ejecutando ningún command. Con un pequeño retoque , descubrí cómo resolver esto .

Puede hacer esto si usa una function que verifica si $BASH_COMMAND está configurado e imprime su CWD si no lo está. Agregue estas líneas a su ~/.bashrc :

 trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG function show_name(){ if [[ -n "$BASH_COMMAND" ]]; then echo -en "\033]0;`pwd`\007"; else echo -en "\033]0;$BASH_COMMAND\007"; fi } export PROMPT_COMMAND='show_name' 

Esto causará que el nombre de su terminal sea el command actualmente en ejecución (si hay uno) o su directory actual, si no es así. Tenga en count que esto dará como resultado una terminal ligeramente esquizofrénica si ejecuta un bucle largo que ejecuta un command muchas veces. Pruébalo con while true; do echo foo; done while true; do echo foo; done while true; do echo foo; done por ejemplo.

Si está utilizando zsh es mucho más fácil de lograr ( fuente ) y maneja los loops correctamente:

 case $TERM in xterm*) preexec () { print -Pn "\e]0;$*\a" } ;; esac 

Me di count de que el MacOSX Terminal.app no ​​lee .bashrc . Con algo de ayuda sobre cómo extraer la primera palabra de una cadena y un pequeño retoque, modifiqué la gran respuesta de @ terdon agregando lo siguiente a .bash_profile :

 trap 'echo -ne "\033]0;${BASH_COMMAND%% *}\007"' DEBUG function show_name { if [[ -n "$BASH_COMMAND" ]]; then echo -en "\033]0;`basename ${PWD}`\007" fi } export PROMPT_COMMAND='show_name' 

Voila! Funciona a las mil maravillas.