Использование переменных для хранения цветовых кодов терминала для 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}$ ' 
  • Как получить выход из удаленной оболочки
  • Ошибка ввода Whiptail / диалога при выполнении из rc.local
  • Переименуйте файл в терминале Mac OS с помощью Regex
  • Как запустить программу, перенаправить ее вывод и отобразить вывод на экране?
  • grep также возвращает не соответствующие строки
  • Что происходит шаг за шагом при использовании «rm -rf directory»?
  • Контрольный + L не очищающий экран
  • exec -t недействителен
  • Потенциальные проблемы (если они есть) при рекурсивной замене пробелов символами подчеркивания во всех именах файлов на жестком диске
  • Как скрипт bash обнаруживает поддержку escape-символов титрования окна?
  • Перенастройка cap-lock для выхода и меню для создания на консоли linux
  • Ошибка "dircolors: нет переменной окружения SHELL, и параметр типа оболочки не указан"
  • Linux и Unix - лучшая ОС в мире.