PROMPT_COMMAND può contenere istruzioni bash ordinarie mentre la variabile PS1 può contenere anche i caratteri speciali, come "\ h" per hostname, nella variabile.
Ad esempio, ecco il mio prompt di bash che utilizza sia PROMPT_COMMAND che PS1. Il codice bash in PROMPT_COMMAND calcola in quale ramo git potresti trovarti e lo visualizza al prompt, insieme allo stato di uscita dell'ultimo processo eseguito, hostname e basename del pwd. La variabile RET memorizza il valore di ritorno dell'ultimo programma eseguito. Questo è comodo per vedere se c'è stato un errore e il codice di errore dell'ultimo programma che ho eseguito nel terminale. Notare l'esterno 'che circonda l'intera espressione PROMPT_COMMAND. Include PS1 in modo che questa variabile venga rivalutata ogni volta che viene valutata la variabile 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";'
L'output di esempio è simile a questo in una directory non git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
e in una directory git vedi il nome del ramo:
sashan@dhcp-au-122 rework mybranch $
Aggiornare
Dopo aver letto i commenti e la risposta di Bob, penso che scriverlo come lui descrive sia meglio. È più gestibile di quello che ho scritto originariamente sopra, dove la variabile PS1 è impostata all'interno di PROMPT_COMMAND, che a sua volta è una stringa super complicata che viene valutata in fase di esecuzione da bash. Funziona, ma è più complicato di quanto dovrebbe essere. Per essere onesti, ho scritto PROMPT_COMMAND per me stesso circa 10 anni fa e ha funzionato e non ci ho pensato troppo.
Per chi è curioso di sapere come ho modificato le mie cose, ho praticamente messo il codice per PROMPT_COMMAND in un file separato (come descritto da Bob) e poi echo la stringa che intendo essere 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 nel mio .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\
. Reindirizza sia stdout che stderr a / dev / null. tldp.org/LDP/abs/html/io-redirection.html