PROMPT_COMMAND може містити звичайні оператори bash, тоді як змінна PS1 також може містити в змінній спеціальні символи, такі як "\ h" для імені хоста.
Наприклад, ось мій баш-рядок, який використовує як PROMPT_COMMAND, так і PS1. Код bash в PROMPT_COMMAND визначає, в якій гітці git ви можете знаходитись, і відображає це під час запиту, а також статус виходу останнього процесу запуску, ім'я хоста та базове ім'я pwd. Змінна RET зберігає повернене значення останньої виконаної програми. Це зручно, щоб побачити, чи була помилка та код помилки останньої програми, яку я запустив у терміналі. Зверніть увагу на зовнішнє ", що оточує весь вираз PROMPT_COMMAND. Він включає PS1, так що ця змінна переоцінюється щоразу, коли змінна 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";'
Приклад виводу виглядає так у каталозі, що не містить git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
і в каталозі git ви бачите назву гілки:
sashan@dhcp-au-122 rework mybranch $
Оновлення
Прочитавши коментарі та відповідь Боба, я думаю, що краще писати його так, як він описує. Це більш рентабельне, ніж те, що я спочатку писав вище, де змінна PS1 встановлюється всередині PROMPT_COMMAND, що сама по собі є надто складною рядком, що оцінюється під час виконання за допомогою bash. Це працює, але це складніше, ніж потрібно. Чесно кажучи, я написав, що PROMPT_COMMAND для себе близько 10 років тому, і він працював і не надто думав про це.
Для тих, хто цікавиться, як я змінив свої речі, я в основному поклав код для PROMPT_COMMAND в окремий файл (як описав Боб), а потім повторює рядок, який я маю намір 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"
і в моєму .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\
. Він перенаправляє як stdout, так і stderr на / dev / null. tldp.org/LDP/abs/html/io-redirection.html