PROMPT_COMMAND pode conter instruções bash comuns, enquanto a variável PS1 também pode conter os caracteres especiais, como '\ h' para o nome do host, na variável.
Por exemplo, aqui está meu prompt bash que usa PROMPT_COMMAND e PS1. O código bash em PROMPT_COMMAND calcula em qual branch git você está e o exibe no prompt, junto com o status de saída do último processo executado, nome do host e nome de base do pwd. A variável RET armazena o valor de retorno do último programa executado. Isso é conveniente para ver se houve um erro e o código de erro do último programa que executei no terminal. Observe o 'externo em torno de toda a expressão PROMPT_COMMAND. Inclui PS1 para que esta variável seja reavaliada cada vez que a variável PROMPT_COMMAND for avaliada.
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";'
A saída de exemplo fica assim em um diretório não git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
e em um diretório git você vê o nome do branch:
sashan@dhcp-au-122 rework mybranch $
Atualizar
Depois de ler os comentários e a resposta de Bob, acho que é melhor escrever como ele descreve. É mais sustentável do que o que escrevi originalmente acima, onde a variável PS1 é definida dentro do PROMPT_COMMAND, que por si só é uma string supercomplicada que é avaliada em tempo de execução pelo bash. Funciona, mas é mais complicado do que precisa ser. Para ser justo, eu escrevi esse PROMPT_COMMAND para mim há cerca de 10 anos e funcionou e não pensei muito sobre isso.
Para aqueles que estão curiosos para saber como eu alterei minhas coisas, basicamente coloquei o código para o PROMPT_COMMAND em um arquivo separado (como Bob descreveu) e, em seguida, ecoa a string que pretendo ser 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"
e no meu .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\
. Ele redireciona stdout e stderr para / dev / null. tldp.org/LDP/abs/html/io-redirection.html