Цветной текст, настроенный с помощью PS1, и цветной вывод команд мешают друг другу

Цветной текст, настроенный с помощью PS1, и цветной вывод команд мешают друг другу

У меня PS1это заканчивается открывающей последовательностью цветов (например \[\e[0;32m\], ), чтобы весь текст в терминале был окрашен (в данном случае зеленым). Однако, когда я использую команду, например ls(которая имеет псевдоним ls --color=autoв моем .bashrc), цвета в выводе немного перепутаны: зеленый до первого «цветного» слова, а следующий неокрашенный текст белый вместо зеленого.

Есть ли способ получить чистый вывод во всех случаях? Меня устраивает белый цвет текста «по умолчанию», когда вывод содержит цвета, но я хотел бы, чтобы он был единообразным.

Конечно, мне больше всего хотелось бы решение, которое автоматически применялось бы ко всем командам и не требовало бы от меня изменения способа их вызова.

Лично у меня нет никаких идей. Может быть, можно что-то сделать, чтобы искать escape-последовательности в выводе "на лету" и выполнять какие-то замены? Я не знаю, как это реализовать, тем более, чтобы это делалось "за кулисами".

решение1

Причина в том, что вы делаете это неправильно.

Вы сказали, что у вас есть "открытая" цветовая последовательность в конце вашего запроса. Это неверно. Цветане гнездятся. Нет никаких "открыть" и "закрыть". Это "переключиться на ..." или "сбросить на значение по умолчанию" (что на самом деле "переключиться на 0"). Поэтому, когда ls --color=autoпереключается цвет для чего-то, когда это сделано, он выдает последовательность для сброса на значение по умолчанию. Это не "вернуться к тому, что было раньше".

Установите терминал на использование цвета текста, который вы хотите сделать "по умолчанию" (т.е. палитру номер 0). Затем, если вы хотите, чтобы ваш запрос имел другой цвет, установите его в начале и сбросьте в конце.

Для получения дополнительной информации прочтите Bash Prompt HOWTOГлава 6. Escape-последовательности ANSI: цвета и перемещение курсорадокументация.

решение2

Как уже было сказано, окончание PS1с открывающей последовательностью цветов — не очень хорошая идея. Это сделает вывод цветных команд неправильным. Если вы хотите, чтобы цвет переднего плана вашего терминала (обычный цвет текста) был зеленым, просто установите его на зеленый в настройках эмулятора терминала на обеих машинах — в данном случае в guakeнастройках вашего терминала. Таким образом, цвет переднего плана останется зеленым, а команды с цветным выводом будут использовать этот цвет для отображения обычного текста. Сбросьте приглашение, PS1как это должно быть сделано с помощью \[\e[0m\].

решение3

Вот как я делаю подсказки разного цвета для разных машин.

case $HOSTNAME in
    host1*) PSC="\e[32m" ;;
    host2*) PSC="\e[33m" ;;
    host3*) PSC="\e[34m" ;;
    host4*) PSC="\e[35m" ;;
    *) PSC="\e[36m" ;;
esac

PS1="[\j]\[${PSC}\]\u@\h(\l) \[\e[37m\][ \w ]\[\e[00m\]\n\[\e[1m\]\#\[\e[0m\] \$ "

Остальное вы можете настроить по вкусу. Поместите копию этого ~/.bashrc на каждую используемую вами машину. Если вы используете смонтированный NFS домашний каталог, то это просто автоматически.

Связанный контент