PROMPT_COMMAND puede contener declaraciones bash ordinarias, mientras que la variable PS1 también puede contener caracteres especiales, como '\ h' para el nombre de host, en la variable.
Por ejemplo, aquí está mi indicador de bash que usa tanto PROMPT_COMMAND como PS1. El código bash en PROMPT_COMMAND determina en qué rama de git podría estar y lo muestra en el indicador, junto con el estado de salida del último proceso ejecutado, el nombre de host y el nombre de base del pwd. La variable RET almacena el valor de retorno del último programa ejecutado. Esto es conveniente para ver si hubo un error y el código de error del último programa que ejecuté en la terminal. Tenga en cuenta el exterior 'que rodea toda la expresión PROMPT_COMMAND. Incluye PS1 para que esta variable se vuelva a evaluar cada vez que se evalúe la variable PROMPT_COMMAND.
PROMPT_COMMAND='RET=$?;\
BRANCH="";\
ERRMSG="";\
if [[ $RET != 0 ]]; then\
ERRMSG=" $RET";\
fi;\
if git branch &>/dev/null; then\
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\
fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'
La salida de ejemplo se ve así en un directorio que no es de git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
y en un directorio de git ves el nombre de la rama:
sashan@dhcp-au-122 rework mybranch $
Actualizar
Después de leer los comentarios y la respuesta de Bob, creo que es mejor escribirlo como él lo describe. Es más fácil de mantener que lo que escribí originalmente anteriormente, donde la variable PS1 se establece dentro de PROMPT_COMMAND, que en sí misma es una cadena súper complicada que bash evalúa en tiempo de ejecución. Funciona, pero es más complicado de lo necesario. Para ser justos, escribí PROMPT_COMMAND para mí hace unos 10 años y funcionó y no pensé demasiado en ello.
Para aquellos curiosos sobre cómo modifiqué mis cosas, básicamente puse el código para PROMPT_COMMAND en un archivo separado (como Bob describió) y luego repitió la cadena que pretendo que sea PS1:
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour
if [ -z $SCHROOT_CHROOT_NAME ]; then
SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
ERRMSG=" $RET"
fi
if which git &>/dev/null; then
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2)
else
BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"
y en mi .bashrc
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
if git branch &>/dev/null ; then\
. Redirige tanto stdout como stderr a / dev / null. tldp.org/LDP/abs/html/io-redirection.html