Почему «less» принимает пустое имя файла и показывает некоторые переменные среды?

Почему «less» принимает пустое имя файла и показывает некоторые переменные среды?

Я случайно запустил lessпрограмму с пустым именем файла, что, как я и ожидал, приведет к ошибке, но, к моему удивлению, она вывела некоторые переменные среды:

$ less -XE ""
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";

( -XEпо сути заставляет его вести себя как cat.)

cat, с другой стороны, терпит неудачу:

$ cat ""
cat: '': No such file or directory

А если вообще опустить имя файла, то lessвозникнет ошибка:

$ less -XE
Missing filename ("less --help" for help)

Зачем lessэто делать? Я могу только представить, что это проблематично, потому что если в вашем коде есть какая-то ошибка, которая приводит к пустому имени файла, вы получите поддельный вывод. (Например, less "$(which nonexistent-script)".)

Пока мы здесь, почему он печатает эти переменные окружения? Они из моего окружения? Они идентичны:

$ declare -p LESSOPEN LESSCLOSE 
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"

Я проверил man less, ноимя файлапараметр, похоже, не документирован явно. Другие упоминания о нем, похоже, не связаны с этим поведением. Я также проверилlessЧасто задаваемые вопросы.

решение1

Основная проблема в том, что lessон неправильно заключает в кавычки имя файла, передаваемое команде LESSOPEN: он делает следующее:«Вставьте обратную косую черту перед каждым метасимволом», так что это означает, что он вообще не обрабатывает пустые строки. Вы можете увидеть, что он работает так, как и ожидалось, если обойти LESSOPEN:

$ less --no-lessopen ''
: No such file or directory

В Ubuntu (и Debian, я полагаю) по умолчанию LESSOPENнастраивается запускомlesspipe без аргументов, который выводит необходимые переменные среды, чтобы установить себя в качестве LESSOPENобработчика. См.Можете ли вы объяснить выражение eval в файле .bashrc по умолчанию?. Таким образом, при запуске lessс нулевым аргументом неправильное заключение в кавычки удаляет переданный аргумент lesspipeи lesspipeвыводит его конфигурацию.


ПС

Я думал открыть баг против less, но это не было большой проблемой для меня. Если кто-то хочет проявить инициативу, пожалуйста, и дайте мне знать, если вам что-то понадобится. Одно из возможных решений (но не обратно совместимое) — lessвообще не пытаться заключать имя файла в кавычки, вместо этого имя файла должно быть заключено в кавычки в конфигурации, например LESSOPEN='| /usr/bin/lesspipe "%s"'.

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

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