Warum akzeptiert „less“ einen leeren Dateinamen und zeigt einige Umgebungsvariablen an?

Warum akzeptiert „less“ einen leeren Dateinamen und zeigt einige Umgebungsvariablen an?

Ich habe es versehentlich lessmit einem leeren Dateinamen ausgeführt, was meiner Erwartung nach fehlschlagen würde. Zu meiner Überraschung wurden jedoch einige Umgebungsvariablen ausgegeben:

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

( -XEbewirkt im Grunde, dass es sich wie verhält cat.)

catschlägt dagegen fehl:

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

Und wenn Sie den Dateinamen ganz weglassen, lesstritt der folgende Fehler auf:

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

Warum macht er lessdas? Ich kann mir nur vorstellen, dass es problematisch ist, denn wenn Ihr Code einen Fehler enthält, der einen leeren Dateinamen verursacht, erhalten Sie eine falsche Ausgabe. (Zum Beispiel less "$(which nonexistent-script)".)

Und wenn wir schon dabei sind: Warum werden diese Umgebungsvariablen gedruckt? Stammen sie aus meiner Umgebung? Sie sind identisch:

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

Ich habe nachgesehen man less, aber dieDateinameParameter scheint nicht explizit dokumentiert zu sein. Andere Erwähnungen davon schienen nicht mit diesem Verhalten in Zusammenhang zu stehen. Ich habe auch dielessFAQ.

Antwort1

Das Grundproblem ist, dass lessder Dateiname, den es an den Befehl übergibt, nicht richtig zitiert wird LESSOPEN: Was es tut, ist"Fügen Sie vor jedem Metazeichen einen Backslash ein", das heißt, es verarbeitet überhaupt keine Null-Strings. Sie können sehen, dass es wie erwartet funktioniert, wenn Sie umgehen LESSOPEN:

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

Unter Ubuntu (und Debian, glaube ich) wird standardmäßig LESSOPENFolgendes konfiguriert:lesspipe ohne Argumente, das die notwendigen Umgebungsvariablen ausgibt, um sich selbst als LESSOPENHandler festzulegen. SieheKönnen Sie den Eval-Ausdruck in der Standard-.bashrc-Datei erklären?. Wenn also lessmit einem Nullargument gearbeitet wird, löscht die falsche Anführungszeichensetzung das an übergebene Argument lesspipeund lesspipedruckt dessen Konfiguration.


PS

Ich habe überlegt, einen Bug gegen zu melden less, aber das war für mich kein großes Problem. Wenn jemand die Initiative ergreifen möchte, dann nur zu, und lassen Sie mich wissen, wenn Sie etwas brauchen. Eine mögliche Lösung (aber nicht abwärtskompatibel) wäre, dass man lessgar nicht versucht, den Dateinamen in Anführungszeichen zu setzen, sondern dass der Dateiname in der Konfiguration in Anführungszeichen gesetzt werden müsste, wie LESSOPEN='| /usr/bin/lesspipe "%s"'.

Es kann auch eine gute Idee sein, einen Fehler zu melden, lesspipeum die Verwendung einer ausführlicheren Konfiguration zu empfehlen.

verwandte Informationen