![Почему «less» принимает пустое имя файла и показывает некоторые переменные среды?](https://rvso.com/image/1071714/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%C2%ABless%C2%BB%20%D0%BF%D1%80%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%B5%D1%82%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%B8%20%D0%BF%D0%BE%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B%3F.png)
Я случайно запустил 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
чтобы порекомендовать более подробное использование конфигурации.