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

Я не думаю его связанное с Xorg во всяком случае. Посмотрите, есть ли у Вас надлежащие модули ядра, загруженные (lsmod). Если это работает после перезагрузки, которая, вероятно, не должна быть проблемой все же.

например.

$ cat /etc/modules-load.d/snd_mixer_oss.conf 
snd_mixer_oss

Попытайтесь выполнить alsamixer или aumix как по умолчанию, аудио отключено звук (странно) или установлено очень низко (или не установлено Вашими X средами).

33
03.07.2014, 23:09
3 ответа

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

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\]$ 

Как видите, подставлены переменные цвета, но не команды.

20
27.01.2020, 19:37

Изменение способа заполнения $GREEN, $YELLOW и $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}$ '
2
27.01.2020, 19:37

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

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

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

Причина, по которой это происходит, когда вы помещаете "обратный слеш ноль три" и т.д... непосредственно в PS1, заключается в том, что интерпретация некоторых последовательностей обратного слеша - это возможность bash's prompting (смотрите раздел PROMPTING в руководстве. Эта замена происходит до расширения параметров, подстановки команд, арифметического расширения и удаления кавычек, однако, поэтому она не применяется к результатам всех этих других операций.

7
27.01.2020, 19:37

Теги

Похожие вопросы