我不小心使用less了空文件名运行,我预计会失败,但令我惊讶的是,它打印了一些环境变量:
$ less -XE ""
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";
Run Code Online (Sandbox Code Playgroud)
(-XE基本上使它的行为像cat。)
cat另一方面,失败:
$ cat ""
cat: '': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果您完全省略文件名,less则会出现错误:
$ less -XE
Missing filename ("less --help" for help)
Run Code Online (Sandbox Code Playgroud)
为什么要这样做less?我只能想象它是有问题的,因为如果您的代码中存在一些导致空文件名的错误,您将得到虚假的输出。(比如,说,less "$(which nonexistent-script)"。)
当我们在这里时,为什么它会打印这些环境变量?它们来自我的环境吗?它们是相同的:
$ less -XE
Missing filename ("less --help" for help)
Run Code Online (Sandbox Code Playgroud)
我检查过man less,但文件名参数似乎没有明确记录。其他提及的内容似乎与此行为无关。我还检查了less常见问题解答。
根本问题是less没有正确引用它传递给命令的文件名LESSOPEN:它所做的是“在每个元字符之前插入反斜杠”,这意味着它根本不处理空字符串。如果绕过,您可以看到它按预期工作LESSOPEN:
$ less --no-lessopen ''
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu(加上 Debian,我相信)上,默认情况下是通过不带参数LESSOPEN运行来配置的,它会打印必要的环境变量以将自身设置为处理程序。请参阅您能否解释一下默认 .bashrc 中的 eval 表达式。因此,当使用空参数运行时,不正确的引用会删除传递给 的参数,并打印其配置。lesspipe LESSOPENlesslesspipelesspipe
聚苯乙烯
我考虑过打开一个针对 的错误less,但这对我来说并不是一个大问题。如果有人想采取主动,请务必告诉我您是否需要任何东西。一种可能的解决方案(但不向后兼容)是根本less不会尝试引用文件名,而是需要在配置中引用文件名,例如LESSOPEN='| /usr/bin/lesspipe "%s"'.
lesspipe打开一个错误来推荐更详细的配置用法也可能是一个好主意。