Зміна кольорів для інформації користувача, хоста, каталогів у командному рядку терміналу


104

Чи можливо змінити кольори в командному рядку для user@computer, а також у поточному каталозі та частинах командного рядка?

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

Було б дуже корисно, наприклад, намагаючись компілювати програми з помилками, оскільки довгі неформатизовані повідомлення важко розрізнити, які рядки є командами, а які - вихідними.

Кольори в osx-терміналі


1
Ви шукаєте bashналаштування (або налаштування для бажаної оболонки), а не термінал Gnome.
Скотт Северанс

Відповіді:


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
Cyan 0; 36 Світло Cyan 1; 36
Червоний 0; 31 Світло-червоний 1; 31
Фіолетовий 0; 35 Світло-Фіолетовий 1; 35
Коричневий 0; 33 Жовтий 1; 33
Світло-сірий 0; 37 Білий 1; 37

Список літератури: 1 , 2 .


Я радий, що це працює. Ласкаво просимо.
десгуа

Також варто згадати, що не слід змінювати колір 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$ "

Цей останній підказки має один приємний штрих. Він додає новий рядок після підказки та порожній новий рядок раніше. Тепер ви можете без проблем відображати повний шлях до каталогу, і це робить більш зрозумілим, з чого починається нова команда, у разі тривалого виведення.


5
Генератор PS1: +1: D
anishsane

1
дуже сподобався останній, я хвилювався, тому що ім’я користувача та шлях зайняли у мене багато місця, з останньою опцією можна отримати весь екран
Damián Rafael Lattenero

Це спрацювало чудово! однак як я можу це зробити для конкретних хостів? тобто встановити конкретну колірну схему, наприклад, коли я сшу на виробничий сервер? чи потрібно це робити "вручну" з блоками if-fi в .bashrc? або є більш елегантний спосіб?
Акапулько

На кожному хості, на який ви входите, є особистий .bashrc файл для цього віддаленого користувача, і ви можете його змінити. Якщо ви станете root, у нього є власні налаштування, які побачать інші користувачі, якщо вони стануть root.
SPRBRN

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) .


Дякуємо за те, що ви поділилися своїми користувацькими функціями :) Чи тільки зі мною зникає часова марка, коли я натискаю зворотну область?
Луїз Родріго

Ні. Я також. Є помилка, яку я не вважав достатньо важливою, щоб спробувати виправити.
Скотт Северанс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.