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

104

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

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

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

Цвета в терминале osx

Луис Родриго
источник
1
Вы ищете bashнастройки (или настройки для предпочитаемой вами оболочки), а не Gnome Terminal.
Скотт Северанс

Ответы:

135

Вы можете изменить параметры редактирования файла: ~/.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\]\$ '

Результат:
введите описание изображения здесь

Номера цветов:

Черный 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

Рекомендации: 1 , 2 .

desgua
источник
Я рад, что это работает. Добро пожаловать.
Desgua
Также стоит упомянуть, что вам не следует менять цвет Paletteпо сравнению с терминалом, Preferencesпрежде чем пытаться это сделать, так как это приведет к путанице с цветовыми кодами.
Рифаз Нахайян
Но как мы можем сделать конкретную строку, чтобы показать в определенном цвете? Например, есть сообщение об ошибке, которое печатается в определенном формате, и я хочу видеть его красным цветом. ИЛИ В GDB, когда я вижу сообщение типа - «предупреждение: исходный файл более поздний, чем исполняемый.», Я хочу, чтобы оно отображалось красным цветом. Как этого достичь?
Даршан Л
36

Вы можете попробовать 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$ "

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

SPRBRN
источник
5
Генератор PS1: +1: D
анишсан
1
последний действительно очень понравился, я волновался, потому что имя пользователя и путь заняли у меня много места, с последним вариантом вы можете получить весь экран
Damián Rafael Lattenero
Это сработало отлично! Тем не менее, как я могу сделать это для конкретных хостов? т.е. установить конкретную цветовую схему, когда я ssh на производственном сервере, например? я должен сделать это "вручную" с блоками if-fi в .bashrc? или есть более элегантный способ?
Акапулько
На каждом хосте, в который вы входите, у вас есть личный файл .bashrc для этого удаленного пользователя, и вы можете изменить его. Если вы становитесь пользователем root, у него есть свои настройки, которые будут видны другим пользователям, если они станут пользователем root.
СПРБР
6

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

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

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

# This function from: 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
##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff          -> ~/stuff               if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_shortener() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    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\]"     #First color
  COLOR2="\[\033[0;33m\]"     #Second color
  NO_COLOR="\[\033[0m\]"      #Transparent - don't change

  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

#Determine and display the exit Status of the last command, if non-zero.
function checkExitStatus() {
  local status="$?"
  local signal=""
  local COLOR1="\033[0;0;33m"     #First color
  local COLOR2="\033[0;0;36m"     #Second color
  local NO_COLOR="\033[0m"        #Transparent - don't change

  if [ ${status} -ne 0 -a ${status} != 128 ]; then
    # If process exited by a signal, determine name of signal.
    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) ,

Скотт Северанс
источник
Спасибо, что поделились своими пользовательскими функциями :) Только у меня исчезает отметка времени, когда я нажимаю клавишу Backspace?
Луис Родриго
Нет. Я тоже. Есть какая-то ошибка, которую я не считаю достаточно важной, чтобы попытаться ее исправить.
Скотт Северанс