Por que “less” aceita um nome de arquivo vazio e mostra algumas variáveis ​​de ambiente?

Por que “less” aceita um nome de arquivo vazio e mostra algumas variáveis ​​de ambiente?

Corri acidentalmente lesscom 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";

( -XEbasicamente 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, lessocorre um erro:

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

Por que faz lessisso? 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 olessPerguntas frequentes.

Responder1

A raiz do problema é que lessnão cita corretamente o nome do arquivo que está passando para o LESSOPENcomando: 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 LESSOPENmanipulador. VerVocê pode explicar a expressão eval no .bashrc padrão. Portanto, ao executar lesscom um argumento nulo, a citação inadequada exclui o argumento que está sendo passado lesspipee lesspipeimprime 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) é lessnã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 lesspipepara recomendar um uso de configuração mais detalhado.

informação relacionada