我不小心运行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
常见问题解答。
根本问题是它
less
没有正确引用它传递给LESSOPEN
命令的文件名:它所做的是"Insert a backslash before each metacharacter",这意味着它根本不处理空字符串。如果您绕过,您可以看到它按预期工作LESSOPEN
:在 Ubuntu(加上 Debian,我相信)上,默认情况下
LESSOPEN
是通过运行lesspipe
不带参数来配置的,它会打印必要的环境变量以将自己设置为LESSOPEN
处理程序。请参阅您能否在默认 .bashrc 中解释 eval 表达式。因此,当less
使用 null 参数运行时,不正确的引用会删除传递给的参数lesspipe
,并lesspipe
打印其配置。附言
我考虑打开一个针对 的错误
less
,但这对我来说并不是一个大问题。如果有人想采取主动,无论如何,如果你需要什么,请告诉我。一种可能的解决方案(但不向后兼容)是less
根本不尝试引用文件名,而是需要在配置中引用文件名,例如LESSOPEN='| /usr/bin/lesspipe "%s"'
.lesspipe
打开一个错误以推荐更详细的配置使用也可能是一个好主意。