Изменение цветов для информации о пользователе, хосте, директории в командной строке терминала

Вопрос или проблема

Можно ли изменить цвета в командной строке для user@computer, а также для текущего каталога и командной части отображения приглашения?

Я уже видел что-то подобное у пользователей OSX, но не знаю, как сделать то же самое в gnome terminal (я могу менять только цвета переднего и заднего фона).

Это было бы очень полезно, например, при попытке компилировать программы с ошибками, так как длинные, неформатированные сообщения затрудняют различение строк, которые являются командами, и строк, которые являются выводом.

Colors in osx terminal

Вы можете отредактировать настройки, изменив файл: ~/.bashrc.

  1. Откройте файл: gedit ~/.bashrc.

  2. Найдите строку с #force_color_prompt=yes и раскомментируйте ее (удалите #).

  3. Найдите строку ниже if [ "$color_prompt" = yes ]; then, которая должна выглядеть так:

     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    

    Обратите внимание на часть \u@\h, она обозначает “user@host”, а число перед ней \[\033[01;32m\] указывает цвет. Это то, что вам нужно изменить. Например, давайте изменим пользователя на фиолетовый, “@” на черный и хоста на зеленый. Отредактируйте строку, чтобы она выглядела так:

     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u\[\033[01;30m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    

Результат:
enter image description here

Цветовые номера:

0;30m черный      1;30m жирный черный      0;90m светлый черный
0;31m красный     1;31m жирный красный     0;91m светлый красный
0;32m зеленый     1;32m жирный зеленый     0;92m светлый зеленый
0;33m желтый      1;33m жирный желтый      0;93m светлый желтый
0;34m синий       1;34m жирный синий       0;94m светлый синий
0;35m магента     1;35m жирный магента     0;95m светлый магента
0;36m циан        1;36m жирный циан        0;96m светлый циан
0;37m белый       1;37m жирный белый       0;97m светлый белый

Ссылки: 1, 2.

Вы можете попробовать BashrcGenerator. Это, безусловно, самый простой способ получить приглашение, которое вы хотите. Я заметил, что цвета, определенные здесь, могут отличаться от вашей собственной системы, но это незначительная проблема. Сгенерировав код, вы сможете изменить цвета самостоятельно.

Пользователь сервера:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;32m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

Корневой пользователь сервера:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;31m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

Если нужно, вы можете изменить цвет имени хоста, чтобы отразить различия в типах серверов.

Я использую другой формат для моего локального компьютера:

export PS1="\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] > \[\e[0m\]"

Мой текущий фаворит:

export PS1="\n\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] \[\e[0m\]\n$ "

Последнее приглашение добавляет перенос строки после запроса и пустую строку перед ним. Теперь вы можете отображать полный путь каталога без проблем, и это делает более очевидным, где начинается новая команда, в случае длинного вывода.


Еще одно обновление, так как ZSH теперь является оболочкой по умолчанию на Macos. Это нужно редактировать в .zshrc:

NEWLINE=$'\n'
DATE=$( date +"[%Y-%m-%d %H:%M:%S]" )
PROMPT="${NEWLINE}%F{yellow}${DATE} %(!.%F{red}.%F{white})%n%F{cyan}@%m %F{yellow}%d${NEWLINE}%F{reset}> "

Для подробностей смотрите этот детальный HOWTO.

Вкратце, вы можете изменить приглашение, отредактировав переменную среды $PS1. Тут можно многое сказать, поэтому я просто покажу вам свое приглашение и отсылаю к вышеуказанной ссылке для более подробной информации.

Части, связанные с цветом, находятся в функции setPrompt:

# Эта функция взята из: https://wiki.archlinux.org/index.php/Color_Bash_Prompt_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29#Wolfman.27s
##################################################
# Эффектная функция отображения PWD
##################################################
# Домашний каталог (HOME) заменяется на ~
# Отображаются последние pwdmaxlen символов PWD
# Убираются начальные частичные имена каталогов
# /home/me/stuff          -> ~/stuff               если USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name если pwdmaxlen=20
##################################################
bash_prompt_shortener() {
    # Сколько символов из $PWD должно быть сохранено
    local pwdmaxlen=25
    # Указывает, что была усечена директория
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi
}

function setPrompt {
  COLOR1="\[\033[1;33m\]"     #Первый цвет
  COLOR2="\[\033[0;33m\]"     #Второй цвет
  NO_COLOR="\[\033[0m\]"      #Прозрачный - не изменять

  case $TERM in 
    xterm*)
      TITLEBAR="\[\033]0;\h - \w\007\]"
      ;;
    *)
      TITLEBAR=""
      ;;
  esac

  local dash_open="${COLOR1}-${COLOR2}-"
  local dash_close="${COLOR2}-${COLOR1}-"
  local spacer="${COLOR2}-"
  local jobs_and_history="${COLOR2}(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})"
  local user_host="${COLOR2}(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})"
  local host="${COLOR2}(${COLOR1}\H${COLOR2})"
  local root_or_not="${COLOR2}(${COLOR1}\\\$${COLOR2})"
  local cwd="${COLOR2}(${COLOR1}\w${COLOR2})"
  #PS1="${TITLEBAR}${COLOR1}-${COLOR2}-(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})-(${COLOR1}\w${COLOR2})-${COLOR1}-\n-${COLOR2}-(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})-(${COLOR1}\\\$${COLOR2})-${COLOR1}- ${NO_COLOR}"
  #PS1="${TITLEBAR}${dash_open}${cwd}${spacer}${root_or_not}${dash_close}\n${dash_open}${jobs_and_history}${spacer}${host}${dash_close}${NO_COLOR} "
  #PS2="${COLOR2}--${COLOR1}- ${NO_COLOR}"
  PS1="${TITLEBAR}${COLOR1}"'${NEW_PWD}'"${COLOR2}:\$${NO_COLOR} "
  PS2="$spacer$dash_close$NO_COLOR "
}

bash_prompt_shortener
setPrompt
unset setPrompt

#Определить и отобразить статус выхода последней команды, если он не равен нулю.
function checkExitStatus() {
  local status="$?"
  local signal=""
  local COLOR1="\033[0;0;33m"     #Первый цвет
  local COLOR2="\033[0;0;36m"     #Второй цвет
  local NO_COLOR="\033[0m"        #Прозрачный - не изменять

  if [ ${status} -ne 0 -a ${status} != 128 ]; then
    # Если процесс завершился сигналом, определить имя сигнала.
    if [ ${status} -gt 128 ]; then
      signal="$(builtin kill -l $((${status} - 128)) 2>/dev/null)"
      if [ "$signal" ]; then
        signal="$signal"
      fi
    fi
    echo -e "${COLOR1}[Exit ${COLOR2}${status} ${signal}${COLOR1}]${NO_COLOR}" 1>&2
    #echo -ne "${COLOR1}[Exit ${COLOR2}${status}${COLOR1} ${COLOR2}${signal}${COLOR1}]${NO_COLOR} " 1>&2
    fi
  return 0
}
print_prompt_time() {
    printf "%*s\r" $(tput cols) "$(date '+%T')"
}

promptCmd() {
    checkExitStatus
    print_prompt_time
}

PROMPT_COMMAND=promptCmd

Кроме цветов, мое приглашение имеет несколько других функций, таких как сокращение имен каталогов (см. функцию bash_prompt_shortener), автоматическое отображение статуса выхода последней команды, если статус не равен нулю (функция checkExitStatus), и отображение времени в правом верхнем углу (функция print_prompt_time).

Вы можете использовать сервис генерации bash. Например, мне нравится делать это через Ezprompt. Это пример, который я сделал:

PS1="\[\e[34m\][\[\e[m\] \[\e[36m\]\A\[\e[m\] \[\e[37m\]\u\[\e[m\]\[\e[31m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \[\e[35m\]~\[\e[m\] \[\e[34m\]]\[\e[m\]\n$ "

После того, как вы получите желаемые результаты bash, отредактируйте свое приглашение, запустив следующую команду export или отредактировав файл ~/.bashrc с помощью текстового редактора nano или vim:

sudo nano ~/.bashrc

и добавьте команду export:

export PS1="\[\e[34m\][\[\e[m\] \[\e[36m\]\A\[\e[m\] \[\e[37m\]\u\[\e[m\]\[\e[31m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \[\e[35m\]~\[\e[m\] \[\e[34m\]]\[\e[m\]\n$ "

Обновление:

Ответ был исправлен. Я оставлю это, так как мне нравится, как я иллюстрировала связь между цветовой палитрой и кодами. 😉

Исправление для утвержденного ответа от @desgua:

Таблица неверна. Чтобы получить доступ к цветам второго столбца таблицы (который соответствует второй строке цветовой палитры), вам нужно использовать числа 90 до 97, а не 30 до 37. Последние относятся только к первому столбцу таблицы (первой строке палитры).

Также, первая цифра 00 или 01 перед точкой с запятой просто влияет на то, будет ли текст напечатан жирным или нет. 1 или 01 для жирного текста и 00, 0 или просто ничего (и без точки с запятой) для обычного текста.

Исправленная таблица:

Черный       30     Темно-серый     90
Красный      31     Светло-красный  91
Зеленый      32     Светло-зеленый  92
Коричневый   33     Желтый          93
Синий        34     Светло-синий    94
Пурпурный    35     Светло-пурпурный 95
Циан         36     Светло-циан     96
Светло-серый 37     Белый           97

Первая строка: значения от 30 до 37. Вторая строка: значения от 90 до 97

Будет ли это циан, красный, зеленый и т.д., зависит от цветов, которые вы настроили в палитре цветов. Эти числа являются лишь селекторами для 16 записей цветовой палитры и не содержат информацию о цвете.

Таким образом, в моем случае, используя стандартную цветовую палитру GNOME, я настроил ее так:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;94m\]\u\[\033[01;36m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;94m\]\w\[\033[00m\]\$ '

[01;94m\]\u: имя пользователя жирным шрифтом, 5-й цвет второй строки палитры (светло-синий)
[01;36m\]@: @ жирным шрифтом, 7-й цвет первой строки палитры (циан)
[01;32m\]\h: имя хоста жирным шрифтом, 3-й цвет первой строки палитры (зеленый)

Я написал файл, который может помочь вам настроить все

Исполните файл с ведущей точкой, чтобы запустить его в той же терминале, иначе он создаст дочерний терминал, и результаты не будут видны. Например:

. shortern_path_terminal.sh

Как это работает:

  • Переменная PS1 контролирует отображение терминала.

    PS1='\[\e]0;\u@\h: \w\a\]\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]$ '
    
    • u – Обозначает пользователя

    • w – Обозначает текущий рабочий каталог

    • W – Показывает полный путь до текущего рабочего каталога

    • h – Отображает имя системы

    • [\033[01;32m] – Предшествует текстуре текста

    • 01 жирный

    • 00 не жирный

    • {цвет}m

        Черный       0;30     Темно-серый     1;30
        Синий        0;34     Светло-синий    1;34
        Зеленый      0;32     Светло-зеленый  1;32
        Циан         0;36     Светло-циан     1;36
        Красный      0;31     Светло-красный  1;31
        Пурпурный    0;35     Светло-пурпурный 1;35
        Коричневый   0;33     Желтый          1;33
        Светло-серый 0;37     Белый           1;37
      

Ссылка

.

Ответ или решение

Изменение цвета информации о пользователе, хосте и директории в командной строке терминала может значительно повысить удобство и продуктивность работы. Особенно это полезно при компиляции программ, так как яркие и различимые цвета позволяют быстро разделять команды и их вывод, что намного упрощает процесс поиска ошибок и их исправления.

Теория

Цвета в терминале обычно настраиваются через изменение переменной окружения PS1, которая отвечает за внешний вид приглашения командной строки. Переменная PS1 используется в Bash и сопутствующих ему оболочках для настройки отображения таких параметров, как имя пользователя, имя хоста и текущая рабочая директория. Цвета задаются с использованием специальных управляющих последовательностей ANSI, которые терминал понимает как команды изменения цвета текста.

Для изменения цветов вам понадобится отредактировать файл ~/.bashrc, где обычно и находится настройка PS1. Управляющие последовательности ANSI начинают с \[\033[...]m\], где цифры внутри квадратных скобок определяют цвет и стиль текста.

Пример

Предположим, вы хотите настроить цвета так, чтобы имя пользователя отображалось фиолетовым, символ @ — чёрным, а имя хоста — зелёным. Для этого вам нужно отредактировать файл ~/.bashrc следующим образом:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u\[\033[01;30m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Здесь:

  • \u заменяется на имя пользователя.
  • \h заменяется на имя хоста.
  • \w — на текущую директорию.

Каждую часть можно индивидуально стилизовать, используя соответствующие коды цвета. Например:

  • \[\033[01;35m\] здесь означает "фиолетовый, жирный".
  • \[\033[01;30m\] — "чёрный, жирный".
  • \[\033[01;32m\] — "зелёный, жирный".

Применение

После внесения изменений в файл ~/.bashrc необходимо применить их. Это можно сделать, вызвав команду source ~/.bashrc или открыв новый терминал, где изменения вступят в силу.

Изучив таблицу цветов:

0;30m black      1;30m bold black      0;90m light black
0;31m red        1;31m bold red        0;91m light red
0;32m green      1;32m bold green      0;92m light green
0;33m yellow     1;33m bold yellow     0;93m light yellow
0;34m blue       1;34m bold blue       0;94m light blue
0;35m magenta    1;35m bold magenta    0;95m light magenta
0;36m cyan       1;36m bold cyan       0;96m light cyan
0;37m white      1;37m bold white      0;97m light white

Вы сможете легко адаптировать цвета в терминале под свои нужды и предпочтения.

Также существует множество инструментов для генерации конфигураций bash, таких как BashrcGenerator и Ezprompt, которые позволяют пользователям легко настраивать свои приглашения Bash с помощью удобных веб-интерфейсов.

Во многих операционных системах, включая MacOS, по умолчанию используется оболочка ZSH, которая также поддерживает схожие методы настройки через файл .zshrc. Например, для ZSH настройка может выглядеть так:

NEWLINE=$'\n'
DATE=$( date +"[%Y-%m-%d %H:%M:%S]" )
PROMPT="${NEWLINE}%F{yellow}${DATE} %(!.%F{red}.%F{white})%n%F{cyan}@%m %F{yellow}%d${NEWLINE}%F{reset}> "

Заключение

Настраивая цвета в терминале, вы не только улучшаете визуальную идентификацию информации, но и создаёте более удобную рабочую среду, что особенно важно для системных администраторов и разработчиков, которые проводят большой объём времени в командной строке. Такой подход демонстрирует гибкость Linux и Unix-систем, позволяя пользователям настраивать интерфейс под свои конкретные рабочие процессы.

Оцените материал
Добавить комментарий

Капча загружается...