Получение неожиданного цветного вывода по нескольким командам


8

Я только добавил это к моему, .bashrcчтобы получить цветной вывод с less:

# Colorize less man pages.
export LESS_TERMCAP_md=$'\e[01;34m'
export LESS_TERMCAP_us=$'\e[01;33m'
export LESS_TERMCAP_so=$'\e[01;44;37m'
export LESS_TERMCAP_mb=$'\e[01;31m'
export LESS_TERMCAP_mr=$'\e[01;35m'
export LESS_TERMCAP_me=$'\e[00m'
export LESS_TERMCAP_ue=$'\e[00m'
export LESS_TERMCAP_se=$'\e[00m'

... и теперь некоторые команды (похоже, связанные с отображением переменных среды) выдают цвет, соответствующий этим новым настройкам. Я сбегаю неправильно? Или это намеренное поведение? Я попробовал несколько других вариантов побега, но они не работали less.

Например, вот скриншот envкоманды.

команда env

php -i также имеет цветной вывод, но только в разделе переменных среды.

команда php -i

Ответы:


4

Это нормальное поведение. Эти переменные среды содержат escape-последовательности, которые заставляют терминал менять свой основной цвет. Вы получаете тот же визуальный эффект, когда любая программа выводит их, будь то lessили env.

Эти переменные должны содержать фактические escape-символы, less не выполняет никакой постобработки на них.

Обычно вы можете поместить меньше переменных конфигурации в файл lesskey , но это не сработает для LESS_TERMCAP_xxпеременных, потому что less читает их до того, как прочитает файл lesskey (начиная с менее 444). Таким образом, у вас нет выбора, кроме как поместить их в окружающую среду.

Если вы хотите, чтобы эти переменные применялись только к manдругим применениям less, а не к другим , вы можете использовать псевдоним, для manкоторого в качестве PAGERпеременной задается скрипт-обертка, который устанавливает переменные среды.

#!/bin/sh
escape=␛     # a literal escape character
export LESS_TERMCAP_md=$escape'[01;34m'

exec less "$@"

(В качестве альтернативы, используйте #!/bin/bashв первой строке, и вы можете использовать #'\e'синтаксис для получения escape-символа. В системах, где /bin/shесть тире, использование /bin/shочень немного быстрее, хотя на практике это может быть незаметно.)

Назовите этот скрипт less-colorи добавьте его alias man='PAGER=less-color man'в свой ~/.bashrcили ~/.zshrc. В некоторых системах вместо создания псевдонима вы можете указать manиспользовать другой пейджер, установив MANPAGERпеременную окружения: export MANPAGER=less-colorв вашем ~/.profile.


1

Я предполагаю, что вы по ошибке установили значения этих переменных LESS_ * в строки, содержащие действительные escape-символы, в отличие от строк, которые содержат обратную косую черту, за которой следует символ e. Таким образом, каждый раз, когда вы отображаете эти значения, они меняют цвет вашего терминала.

Я бы очень внимательно посмотрел на настройки, которые вы сделали в вашем .bashrc, и убедился, что они правильные. Я подозреваю, что все, что вам нужно сделать, это устранить знак доллара.


Удаление знака доллара портит мои справочные страницы. Например, man top= \e[01;34mSYNOPSIS\e[00mвместо раскрашивания слова «СИНОПСИС».
Джефф

Знак доллара не работал. Можете ли вы придумать обходной путь? Может быть, способ ограничить эти переменные LESS только для использования на страницах руководства?
Джефф

0

Как отмечает @Gilles в своем ответе, это ожидаемое поведение.

Позвольте мне просто добавить информацию о паре. LESS_TERMCAP_xxпереопределить возможности TERMCAP. Это переопределение управляется lessсамо по себе, screen.cа значение используется позже, как если бы оно было возвращено библиотекой TERMCAP. Это означает, что это должна быть необработанная последовательность управляющих символов.

Моя учетная запись о том, как "исправить", это обернуть lessсебя

$ cat ~/bin/less 
#!/bin/bash

# Start bold mode
export LESS_TERMCAP_md=$'\e[1;37m'
# Start standout mode
export LESS_TERMCAP_so=$'\e[1;37;41m'
# End standout mode
export LESS_TERMCAP_se=$'\e[0m'
# Start underlining
export LESS_TERMCAP_us=$'\e[4;93m'
# End underlining
export LESS_TERMCAP_ue=$'\e[0m'
# End all mode like so, us, mb, md and mr
export LESS_TERMCAP_me=$'\e[0m'

exec /usr/bin/less "$@"

Забавно, я работаю над этим прямо сейчас, и это выглядит хорошо. Есть ли у вас версия, которая также работает #!/bin/sh(в моем случае это тире)? Я не могу понять, как вставить буквальный ESCсимвол с помощью vim.
Джефф

1
@ Джефф Просто из головы всегда можно сделать что-то вроде export LESS_TERMCAP_me="$(printf '\e[0m')". На самом деле, если вы посмотрите на ответ @Gilles, он утверждает, export LESS_TERMCAP_me=$escape'[0m'что /bin/shтоже должен работать .
Мирослав Кошкар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.