Ich habe es versehentlich less
mit 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";
( -XE
bewirkt im Grunde, dass es sich wie verhält cat
.)
cat
schlägt dagegen fehl:
$ cat ""
cat: '': No such file or directory
Und wenn Sie den Dateinamen ganz weglassen, less
tritt der folgende Fehler auf:
$ less -XE
Missing filename ("less --help" for help)
Warum macht er less
das? 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 dieless
FAQ.
Antwort1
Das Grundproblem ist, dass less
der 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 LESSOPEN
Folgendes konfiguriert:lesspipe
ohne Argumente, das die notwendigen Umgebungsvariablen ausgibt, um sich selbst als LESSOPEN
Handler festzulegen. SieheKönnen Sie den Eval-Ausdruck in der Standard-.bashrc-Datei erklären?. Wenn also less
mit einem Nullargument gearbeitet wird, löscht die falsche Anführungszeichensetzung das an übergebene Argument lesspipe
und lesspipe
druckt 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 less
gar 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, lesspipe
um die Verwendung einer ausführlicheren Konfiguration zu empfehlen.