PROMPT_COMMAND peut contenir des instructions Bash ordinaires, tandis que la variable PS1 peut également contenir des caractères spéciaux, tels que ' \h ' pour le nom d'hôte, dans la variable.
Par exemple, voici mon invite Bash qui utilise à la fois PROMPT_COMMAND et PS1. Le code Bash de PROMPT_COMMAND détermine la branche Git dans laquelle vous vous trouvez et l'affiche à l'invite, ainsi que l'état de sortie du dernier processus exécuté, le nom d'hôte et le nom de base de l'ordinateur. pwd .
La variable RET stocke la valeur de retour du dernier programme exécuté. C'est pratique pour voir s'il y a eu une erreur et le code d'erreur du dernier programme exécuté dans le terminal. Notez le ' extérieur entourant l'expression PROMPT_COMMAND entière. Elle inclut PS1 afin que cette variable soit réévaluée chaque fois que la variable PROMPT_COMMAND est évaluée.
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'exemple de sortie ressemble à ceci dans un répertoire non-Git :
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
Et dans un répertoire Git, vous voyez le nom de la branche :
sashan@dhcp-au-122 rework mybranch $
Mise à jour
Après avoir lu les commentaires et la réponse de Bob, je pense que l'écrire comme il le décrit est mieux. C'est plus facile à maintenir que ce que j'ai écrit à l'origine ci-dessus, où la variable PS1 est définie dans la PROMPT_COMMAND, qui est elle-même une chaîne de caractères super compliquée qui est évaluée à l'exécution par Bash.
Ça marche, mais c'est plus compliqué que nécessaire. Pour être honnête, j'ai écrit cette PROMPT_COMMAND pour moi-même il y a environ 10 ans et elle a fonctionné, sans trop y penser.
Pour ceux qui sont curieux de savoir comment j'ai modifié mes choses, j'ai essentiellement placé le code de la PROMPT_COMMAND dans un fichier séparé (comme Bob l'a décrit) et j'ai ensuite fait écho à la chaîne de caractères que j'entends être 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"
Et dans mon .bashrc fichier :
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command