![¿Por qué "menos" acepta un nombre de archivo vacío y muestra algunas variables de entorno?](https://rvso.com/image/1071714/%C2%BFPor%20qu%C3%A9%20%22menos%22%20acepta%20un%20nombre%20de%20archivo%20vac%C3%ADo%20y%20muestra%20algunas%20variables%20de%20entorno%3F.png)
Accidentalmente ejecuté less
con 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";
( -XE
bá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, less
aparece el error:
$ less -XE
Missing filename ("less --help" for help)
¿Por qué hace less
esto? 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é elless
Preguntas más frecuentes.
Respuesta1
El problema raíz es que less
no 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, LESSOPEN
se 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 less
con un argumento nulo, las comillas incorrectas eliminan el argumento que se pasa lesspipe
e lesspipe
imprime 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 less
no 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 lesspipe
para recomendar un uso de configuración más detallado.