Linux Tux logo

Решил сегодня поменять приглашение в терминале и консоли на более удобное и информативное.
Так это выглядит у меня в эмуляторе терминала:

BASH prompt on macOS
Custom BASH prompt in iTerm2, macOS

И подробнее в пару строк

  • Определение терминал это или консоль.
  • Отображение времени, когда было закончено выполнение команды.
  • Отображение загрузки процессора на момент выполнения команды.
  • Отображение имени пользователя и хоста (если это root, то меняется цвет на красный).
  • Если команда была закончена с ошибкой, то отображается код ошибки в круглых скобочках.
  • Отображение текущего пути. Если путь превышает указанную длину (я остановился на цифре 25), то начало пути обрезается и заменяется на троеточие.
  • До конца строки отображается разделитель (зависит от ширины терминала).
  • На следующей строке отображается информация о GIT (если текущая директория находится внутри репозитория) и приглашение для ввода команды.

Мой текущий prompt

makePrompt()
{
    # if we're in a Git repo, show current branch
    if [ "\$(type -t __git_ps1)" ]; then
        local BRANCH="\$(__git_ps1)"
    elif [ -d ".svn" ]; then
        local BRANCH="[ "`svn info | awk '/Last\ Changed\ Rev/ {print $4}'`" ]"
    fi

    local CURENT_PATH="\w"

    if [ "$TERM" != "dumb" ]; then
        local GREEN="\[\033[0;32m\]"
        local CYAN="\[\033[0;36m\]"
        local BCYAN="\[\033[1;36m\]"
        local BLUE="\[\033[0;34m\]"
        local GRAY="\[\033[0;37m\]"
        local DKGRAY="\[\033[1;30m\]"
        local WHITE="\[\033[1;37m\]"
        local RED="\[\033[0;31m\]"
        # return color to Terminal setting for text color
        local DEFAULT="\[\033[0;39m\]"
    fi

    # different prompt and color for root
    if [ "$UID" = "0" ]; then
        local USERNAME_COLORED="${RED}${USER}${GREEN}@${RED}${HOSTNAME}"
        local PRMT_COLORED="${RED}#"
    else
        local USERNAME_COLORED="${BCYAN}${USER}${GREEN}@${BCYAN}${HOSTNAME}"
        local PRMT_COLORED="${GREEN}$"
    fi

    # use only ASCII symbols in linux console
    if [ "$TERM" != "linux" -a "$TERM" != "dumb" -a "$TERM" != "cygwin" ]; then
        local TITLEBAR="\[\e]2;${CURENT_PATH}\a\]"
    fi

    local TOP_LINE="${CYAN}[ ${DEFAULT}\t ${USERNAME_COLORED} ${CYAN}] ${CYAN}[ ${GRAY}${CURENT_PATH}${CYAN} ]${GRAY}${SEPARATOR}"
    local BOTTOM_LINE="${CYAN}[ ${GREEN}${BRANCH}${PRMT_COLORED} ${DEFAULT}"
    export PS1="${TITLEBAR}\n${TOP_LINE}\n${BOTTOM_LINE}"
}
# Whenever displaying the prompt, write the previous line to disk:
export PROMPT_COMMAND="history -a; history -n"
makePrompt