PROMPT_COMMAND может содержать обычные операторы bash, тогда как переменная PS1 может также содержать в переменной специальные символы, такие как '\ h' для имени хоста.
Например, вот мое приглашение bash, в котором используются как 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