Вопрос или проблема
Можно ли изменить цвета в командной строке для user@computer
, а также для текущего каталога и командной части отображения приглашения?
Я уже видел что-то подобное у пользователей OSX, но не знаю, как сделать то же самое в gnome terminal (я могу менять только цвета переднего и заднего фона).
Это было бы очень полезно, например, при попытке компилировать программы с ошибками, так как длинные, неформатированные сообщения затрудняют различение строк, которые являются командами, и строк, которые являются выводом.
Вы можете отредактировать настройки, изменив файл: ~/.bashrc
.
-
Откройте файл:
gedit ~/.bashrc
. -
Найдите строку с
#force_color_prompt=yes
и раскомментируйте ее (удалите#
). -
Найдите строку ниже
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\]\$ '
Результат:
Цветовые номера:
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 светлый белый
Вы можете попробовать 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
Будет ли это циан, красный, зеленый и т.д., зависит от цветов, которые вы настроили в палитре цветов. Эти числа являются лишь селекторами для 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-систем, позволяя пользователям настраивать интерфейс под свои конкретные рабочие процессы.