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 dans PROMPT_COMMAND détermine dans quelle branche git vous pourriez être 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 du pwd. La variable RET stocke la valeur de retour du dernier programme exécuté. Ceci est pratique pour voir s'il y a eu une erreur et le code d'erreur du dernier programme que j'ai exécuté dans le terminal. Notez le «externe» entourant toute l'expression PROMPT_COMMAND. Il 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 $
Mettre à jour
Après avoir lu les commentaires et la réponse de Bob, je pense qu'il est préférable de l'écrire comme il le décrit. C'est plus facile à maintenir que ce que j'ai écrit à l'origine ci-dessus, où la variable PS1 est définie dans PROMPT_COMMAND, qui est elle-même une chaîne super compliquée qui est évaluée au moment de l'exécution par bash. Cela fonctionne, mais c'est plus compliqué que nécessaire. Pour être honnête, j'ai écrit ce PROMPT_COMMAND pour moi-même il y a environ 10 ans et cela a fonctionné et n'y a pas trop pensé.
Pour ceux qui sont curieux de savoir comment j'ai modifié mes choses, j'ai essentiellement mis le code de PROMPT_COMMAND dans un fichier séparé (comme Bob l'a décrit), puis j'ai fait écho à la chaîne que j'ai l'intention d'ê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
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
if git branch &>/dev/null ; then\
. Il redirige à la fois stdout et stderr vers / dev / null. tldp.org/LDP/abs/html/io-redirection.html