
Corri acidentalmente less
com um nome de arquivo vazio, que esperava falhar, mas para minha surpresa, ele imprimiu algumas variáveis de ambiente:
$ less -XE ""
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";
( -XE
basicamente faz com que ele se comporte como cat
.)
cat
, por outro lado, falha:
$ cat ""
cat: '': No such file or directory
E se você omitir totalmente o nome do arquivo, less
ocorre um erro:
$ less -XE
Missing filename ("less --help" for help)
Por que faz less
isso? Só posso imaginar que isso seja problemático, porque se houver algum bug no seu código que cause um nome de arquivo vazio, você obterá uma saída falsa. (Como, digamos,. less "$(which nonexistent-script)"
)
Já que estamos aqui, por que ele imprime essas variáveis de ambiente? Eles são do meu ambiente? Eles são idênticos:
$ declare -p LESSOPEN LESSCLOSE
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
Eu verifiquei man less
, mas onome do arquivoparâmetro não parece estar documentado explicitamente. Outras menções não parecem estar relacionadas a esse comportamento. Eu também verifiquei oless
Perguntas frequentes.
Responder1
A raiz do problema é que less
não cita corretamente o nome do arquivo que está passando para o LESSOPEN
comando: o que ele faz é"Insira uma barra invertida antes de cada metacaractere", então isso significa que ele não lida com strings nulas. Você pode ver que funciona conforme o esperado se você ignorar LESSOPEN
:
$ less --no-lessopen ''
: No such file or directory
No Ubuntu (mais Debian, acredito), por padrão, LESSOPEN
é configurado executandolesspipe
sem argumentos, que imprime as variáveis de ambiente necessárias para se definir como LESSOPEN
manipulador. VerVocê pode explicar a expressão eval no .bashrc padrão. Portanto, ao executar less
com um argumento nulo, a citação inadequada exclui o argumento que está sendo passado lesspipe
e lesspipe
imprime sua configuração.
PS
Pensei em abrir um bug no less
, mas isso não foi um grande problema para mim. Se alguém quiser tomar a iniciativa, por favor, e me avise se precisar de alguma coisa. Uma solução possível (mas não compatível com versões anteriores) é less
não tentar citar o nome do arquivo; em vez disso, o nome do arquivo precisaria ser citado na configuração, como LESSOPEN='| /usr/bin/lesspipe "%s"'
.
Também pode ser uma boa ideia abrir um bug lesspipe
para recomendar um uso de configuração mais detalhado.