PROMPT_COMMAND może zawierać zwykłe instrukcje bash, podczas gdy zmienna PS1 może również zawierać w zmiennej znaki specjalne, takie jak „\ h” dla nazwy hosta.
Na przykład tutaj jest moja zachęta bash, która używa zarówno PROMPT_COMMAND, jak i PS1. Kod bash w PROMPT_COMMAND sprawdza, w jakiej gałęzi git możesz się znajdować i wyświetla to po znaku zachęty, wraz z kodem zakończenia ostatniego uruchomionego procesu, nazwą hosta i podstawową nazwą pwd. Zmienna RET przechowuje wartość zwracaną przez ostatnio wykonany program. Jest to wygodne, aby sprawdzić, czy wystąpił błąd i kod błędu ostatniego programu, który uruchomiłem w terminalu. Zwróć uwagę na zewnętrzne „otaczające całe wyrażenie PROMPT_COMMAND. Zawiera PS1, więc ta zmienna jest ponownie oceniana za każdym razem, gdy oceniana jest zmienna 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";'
Przykładowe wyjście wygląda następująco w katalogu innym niż git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
aw katalogu git zobaczysz nazwę gałęzi:
sashan@dhcp-au-122 rework mybranch $
Aktualizacja
Po przeczytaniu komentarzy i odpowiedzi Boba myślę, że pisanie tego tak, jak opisuje, jest lepsze. Jest łatwiejszy w utrzymaniu niż to, co pierwotnie napisałem powyżej, gdzie zmienna PS1 jest ustawiana wewnątrz PROMPT_COMMAND, który sam jest bardzo skomplikowanym ciągiem, który jest oceniany w czasie wykonywania przez bash. Działa, ale jest bardziej skomplikowane, niż powinno. Aby być uczciwym napisałem to PROMPT_COMMAND dla siebie około 10 lat temu i zadziałało i nie myślałem o tym zbyt wiele.
Dla tych, którzy są ciekawi, jak zmieniłem swoje rzeczy, po prostu umieściłem kod PROMPT_COMMAND w oddzielnym pliku (jak opisał Bob), a następnie powtórzyłem ciąg, który mam zamiar być 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"
i w moim .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\
. Przekierowuje zarówno stdout, jak i stderr do / dev / null. tldp.org/LDP/abs/html/io-redirection.html