Использование переменных для хранения цветовых кодов терминала для PS1?

В моем .bashrc я использую цветовые коды терминала ANSI, чтобы раскрасить различные биты. Это выглядит так:

 PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ ' 

где virtual_env и git_branch – это функции bash, которые выводят материал на stdout.

Теперь, чтобы упростить чтение и изменение, я хотел бы сохранить цветовые коды в переменных и ссылаться на них, а не встраивать их непосредственно в PS1 . Итак, у меня есть куча переменных вроде этого:

 GREEN="\[\033[32m\]" YELLOW="\[\033[33m\]" RESET="\[\033[0m\]" 

Я хотел бы написать что-то вроде:

 PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ ' 

Но это не сработает – цветовые коды отображаются в подсказке, как будто они экранированы. Цвета работают правильно, если вместо PS1 использовать двойные кавычки, но тогда подсказка меняется только тогда, когда я делаю source ~/.bashrc .

Я пробовал другие вещи, которые я видел, – используя printf , используя одинарные кавычки для цветов, помещая \[ и \] в PS1 вместо цветовой переменной, но ничего не работает.

Как я могу использовать переменные для цветовых кодов?

3 Solutions collect form web for “Использование переменных для хранения цветовых кодов терминала для PS1?”

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

 PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ " 

Обратите внимание на \ перед $() для каждой команды.

Если мы повторим это, мы увидим:

 echo "$PS1" \u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

Как вы можете видеть, цветовые переменные были заменены, но не командами.

Проблема в том, что ваша переменная GREEN содержит литеральную строку, состоящую из «обратной косой черты обратной косой черты три три» и т. Д. Он не содержит, например, ASCII escape-символ, необходимый для изменения цвета вашего терминала.

Вы можете поместить управляющие символы в GREENYELLOW и RESET ) вручную, но гораздо лучше использовать tput в первую очередь, так что вам не нужно ничего жестко кодировать, и вы будете поддерживать любой тип терминала.

 GREEN="$(tput setaf 2)" YELLOW="$(tput setaf 3)" RESET="$(tput setaf 0)" 

Причина, по которой этот мир, когда вы помещаете «обратную косую черту с тремя тремя» и т. Д. Непосредственно в PS1 состоит в том, что интерпретация определенных последовательностей обратной косой черты является особенностью запроса bash (см. Раздел PROMPTING в руководстве. Эта замена происходит до расширения параметра, подстановка команд, арифметическое расширение и удаление цитат, тем не менее, поэтому он не применяется к результатам всех этих других операций.

Измените способ заполнения $ GREEN, $ ЖЕЛТЫЙ и $ RESET:

 GREEN="$(echo -e "\033[32m")" YELLOW="$(echo -e "\033[33m")" RESET="$(echo -e "\033[0m")" PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ ' 
  • Как открыть первые 10 файлов в папке, начиная с определенной буквы или цифры?
  • Печать на X-терминал быстрее, чем печать на tty?
  • Как просмотреть все команды, выполняемые текущим пользователем, во всех терминалах session / screen / byobu?
  • Распечатайте длинный IPv6 интерфейса
  • Как автозапуск devilspie под gnome3 на Fedora 21?
  • Как я могу очистить терминал другими командами?
  • Ошибка "dircolors: нет переменной окружения SHELL, и параметр типа оболочки не указан"
  • Установите цвет по умолчанию для верхнего
  • Терминал изменяет размеры
  • Символы, отличные от ASCII, обрабатываются неправильно в командной строке
  • Как предотвратить завершение сценария при выходе из оболочки?
  • Linux и Unix - лучшая ОС в мире.