bash: optimizando un prompt de shell con reconocimiento de git

He escrito la siguiente PS1 , que adjuntará la twig de trabajo actual al indicador del intérprete si estoy en un repository git, y no haré nada de lo contrario:

 PS1='\[\e[00;32m\]\u@\h\[\e[0m\]\[\e[00;33m\] [\w]$(branch=`git symbolic-ref --short -q HEAD 2> /dev/null || git rev-parse -q --short HEAD 2> /dev/null` ; if [ $branch ] ; then echo -n -e " \e[95m<$branch>" ; fi) \[\e[00;33m\]\$\[\e[0m\] ' 

El problema es que esto ralentiza las indicaciones, hasta el punto de que si trato de saltar rápidamente varias líneas, a menudo no recibo ninguna indicación.

Me pregunto si esto se puede optimizar para correr más rápido. Lo único que he podido pensar es crear un contenedor alnetworkingedor de la git branch que imprimirá la nueva twig de trabajo a un file en /repo/.git/ . Entonces simplemente podría llamar a cat /repo/.git/.prompt o algo dentro del command PS1. No estoy seguro de que esto funcione realmente más rápido porque necesitaría un poco de lógica para determinar si hay un directory .git en algún lugar del tree de files, que tendría sus propios problemas.

Realmente no me gusta esta solución, así que me pregunto si existe una manera más rápida de get el nombre de la sucursal actual dentro de un git repo.

NOTA: Estoy al tanto de cosas como git-aware-prompt , pero tengo el mismo problema. Y también podría usar $PROMPT_COMMAND , que se ejecuta un poco más rápido, pero también solo es capaz de imprimir el nombre de la twig al comienzo del post, lo cual no es realmente lo que me gusta.

Uno de los principales beneficios de PROMPT_COMMAND es que le permite generar el aviso de manera dinámica cada vez que se muestra.

 build_prompt () { PS1='\[\e[00;32m\]\u@\h\[\e[0m\]\[\e[00;33m\] [\w]' branch=$(git symbolic-ref --short -q HEAD 2> /dev/null || git rev-parse -q --short HEAD 2> /dev/null) [[ $branch ]] && PS1+=" \e[95m<$branch>" PS1+=' \[\e[00;33m\]\$\[\e[0m\] ' } PROMPT_COMMAND=build_prompt