¿Por qué "menos" acepta un nombre de archivo vacío y muestra algunas variables de entorno?

¿Por qué "menos" acepta un nombre de archivo vacío y muestra algunas variables de entorno?

Accidentalmente ejecuté lesscon un nombre de archivo vacío, lo cual esperaba que fallara, pero para mi sorpresa, imprimió algunas variables de entorno:

$ less -XE ""
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";

( -XEbásicamente hace que se comporte como cat).

cat, por otro lado, falla:

$ cat ""
cat: '': No such file or directory

Y si omite el nombre del archivo por completo, lessaparece el error:

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

¿Por qué hace lessesto? Sólo puedo imaginar que sea problemático, porque si hay algún error en su código que causa un nombre de archivo vacío, obtendrá un resultado falso. (Como, digamos,. less "$(which nonexistent-script)")

Mientras estamos aquí, ¿por qué imprime esas variables de entorno? ¿Son de mi entorno? Son identicos:

$ declare -p LESSOPEN LESSCLOSE 
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"

lo comprobéman less pero elNombre del archivoEl parámetro no parece estar documentado explícitamente. Otras menciones al respecto no parecían estar relacionadas con este comportamiento. También revisé ellessPreguntas más frecuentes.

Respuesta1

El problema raíz es que lessno cita correctamente el nombre del archivo que está pasando alLESSOPEN comando: lo que hace es"Inserte una barra invertida antes de cada metacarácter", eso significa que no maneja cadenas nulas en absoluto. Puedes ver que funciona como se esperaba si omites LESSOPEN:

$ less --no-lessopen ''
: No such file or directory

En Ubuntu (más Debian, creo), de forma predeterminada, LESSOPENse configura ejecutandolesspipe sin argumentos, que imprime las variables de entorno necesarias para establecerse como elLESSOPEN controlador. Ver¿Puedes explicar la expresión de evaluación en el .bashrc predeterminado?. Entonces, cuando se ejecuta lesscon un argumento nulo, las comillas incorrectas eliminan el argumento que se pasa lesspipee lesspipeimprime su configuración.


PD

Consideré abrir un error contra less, pero esto no ha sido un gran problema para mí. Si alguien quiere tomar la iniciativa, por supuesto, que me avise si necesita algo. Una posible solución (pero no compatible con versiones anteriores) es lessno intentar citar el nombre del archivo en absoluto, sino que el nombre del archivo debería citarse en la configuración, como LESSOPEN='| /usr/bin/lesspipe "%s"'.

También podría ser una buena idea abrir un error lesspipepara recomendar un uso de configuración más detallado.

información relacionada