PROMPT_COMMAND kann gewöhnliche Bash-Anweisungen enthalten, während die PS1-Variable auch Sonderzeichen wie '\ h' für den Hostnamen in der Variablen enthalten kann.
Zum Beispiel ist hier meine Bash-Eingabeaufforderung, die sowohl PROMPT_COMMAND als auch PS1 verwendet. Der Bash-Code in PROMPT_COMMAND ermittelt, in welchem Git-Zweig Sie sich möglicherweise befinden, und zeigt diesen an der Eingabeaufforderung zusammen mit dem Exit-Status des zuletzt ausgeführten Prozesses, dem Hostnamen und dem Basisnamen des pwd an. Die Variable RET speichert den Rückgabewert des zuletzt ausgeführten Programms. Dies ist praktisch, um festzustellen, ob ein Fehler aufgetreten ist, und um den Fehlercode des letzten Programms anzuzeigen, das ich im Terminal ausgeführt habe. Beachten Sie das äußere ', das den gesamten PROMPT_COMMAND-Ausdruck umgibt. Es enthält PS1, sodass diese Variable jedes Mal neu ausgewertet wird, wenn die Variable PROMPT_COMMAND ausgewertet wird.
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";'
Die Beispielausgabe sieht in einem Nicht-Git-Verzeichnis folgendermaßen aus:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
und in einem Git-Verzeichnis sehen Sie den Filialnamen:
sashan@dhcp-au-122 rework mybranch $
Aktualisieren
Nachdem ich die Kommentare und Bobs Antwort gelesen habe, denke ich, dass es besser ist, sie so zu schreiben, wie er es beschreibt. Es ist wartbarer als das, was ich ursprünglich oben geschrieben habe, wo die PS1-Variable im PROMPT_COMMAND festgelegt ist, einer super komplizierten Zeichenfolge, die zur Laufzeit von bash ausgewertet wird. Es funktioniert, aber es ist komplizierter als es sein muss. Um fair zu sein, habe ich PROMPT_COMMAND vor ungefähr 10 Jahren für mich selbst geschrieben und es hat funktioniert und ich habe nicht zu viel darüber nachgedacht.
Für diejenigen, die neugierig sind, wie ich meine Sachen geändert habe, habe ich den Code für PROMPT_COMMAND im Grunde genommen in eine separate Datei gestellt (wie von Bob beschrieben) und dann die Zeichenfolge wiedergegeben, die ich als PS1 beabsichtige:
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"
und in meinem .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\
. Es leitet sowohl stdout als auch stderr nach / dev / null um. tldp.org/LDP/abs/html/io-redirection.html