less -R не может интерпретировать цветовые коды ASCII?

Вопрос или проблема

На Ubuntu 22.04 я попытался реализовать псевдоним lessh из less command and syntax highlighting — однако, странно, он не работает; я попробовал оба этих варианта:

alias lessh="LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s" less -R "

alias lessh="LESS=" -R " LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s" less "

… но каждый раз, когда я открываю, например, файл C с помощью lessh test.c, я получаю неокрашенный текст, как этот:

ESC[01;34m#includeESC[m ESC[31m<stdlib.h>ESC[m 
ESC[01;34m#includeESC[m ESC[31m<string.h>ESC[m  ESC[36m// memcpyESC[m

… вместо обычного цветного текста.

Странно, но это работает нормально — то есть выводит цветной текст:

/usr/bin/src-hilite-lesspipe.sh test.c | less -R

… и также, если выполнить команду из псевдонима прямо в командной строке, всё работает нормально:

LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s" less -R test.c

Что мне нужно сделать, чтобы псевдоним lessh тоже работал правильно?

Вероятно, у меня была неправильная версия командной строки раньше в моём ~/.bashrc; я просто сделал source ~/.bashrc после того, как убедился в правильности командной строки в псевдониме, и это сработало.

Ответ или решение

Проблема, описанная в вопросе, связана с неправильной обработкой цветовых ASCII-кодов в результате использования less -R в сочетании с алиасом lessh. На первый взгляд, цель пользовательских настроек — обеспечить возможность синтаксического выделения текста при просмотре исходных кодов с помощью команды less. Однако наблюдается ситуация, когда вывод неверно интерпретируется: вместо цветного текста отображаются экранированные строки, такие как ESC[01;34m.

Начнем с теоретической части. Команда less, в режиме -R, предназначена для отображения "сырых" управляющих символов ANSI. Эти символы применяются для изменения цвета текста и других визуальных эффектов в терминале. В нормальных условиях это позволяет сохранять цветовую разметку текста при его просмотре. Однако, когда отсутствует корректная привязка или правильная передача параметров окружения, описанные эффекты могут не проявляться.

Примером этого может служить некорректная работа переменных окружения в вашем алиасе, особенно LESSOPEN, которая отвечает за препроцессинг файлов перед их передачей в less. Когда мы вызываем less напрямую с LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s", обе команды синхронизированы, что обеспечивает правильное выполнение скрипта src-hilite-lesspipe.sh, осуществляющего разметку текста цветами.

При этом использование алиаса может нарушить последовательность установки переменных окружения, что препятствует корректной интерпретации управляющих символов. В вашем случае отсутствие или неправильная установка переменных среды в клиентском файле конфигурации, таком как ~/.bashrc, может повлиять на выполнение.

Теперь перейдем к примеру. Ваша команда для установки алиаса выглядела как:

alias lessh="LESSOPEN=\"| /usr/bin/src-hilite-lesspipe.sh %s\" less -R"

или

alias lessh="LESS=\" -R \" LESSOPEN=\"| /usr/bin/src-hilite-lesspipe.sh %s\" less"

Оба варианта имеют свои недостатки в части станировки кавычек и управления переменными. Особое внимание стоит уделить правильной установке переменной LESS, которая должна быть совместимой с -R, и также корректному экранированию и установке переменной LESSOPEN.

Практическое приложение: оптимально организовать это можно, указав установку переменной параметров до вызова less, причем важно выполнить так, чтобы они были активны в текущем запуске терминала. Например:

alias lessh='env LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s" less -R'

Таким образом используется env для безопасной установки переменных окружения с необходимыми значениями прямо в момент вызова, что минимизирует вероятность их потери или неправильной интерпретации.

Чтобы внести эти изменения, вы также должны быть уверены, что после выполнения редактирования вы обновили конфигурацию с помощью source ~/.bashrc. Это загрузит изменения в текущую сессию заставляя заново применить все алиасы и пользовательские параметры.

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

Оцените материал
Добавить комментарий

Капча загружается...