「less」が空のファイル名を受け入れ、いくつかの環境変数を表示するのはなぜですか?

「less」が空のファイル名を受け入れ、いくつかの環境変数を表示するのはなぜですか?

誤って空のファイル名で実行してしまいless、失敗するだろうと思っていましたが、驚いたことに、いくつかの環境変数が出力されました。

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

(-XE基本的には のように動作しますcat。)

cat一方、失敗します:

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

ファイル名を完全に省略すると、lessエラーが発生します:

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

なぜ はlessこのような動作をするのでしょうか? コードに空のファイル名を引き起こすバグがある場合、不正な出力が得られるため、問題が発生するとしか考えられません。(たとえば、 などless "$(which nonexistent-script)")

ところで、なぜこれらの環境変数が出力されるのでしょうか? これらは私の環境のものでしょうか? これらは同一です:

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

確認しましたman lessが、ファイル名パラメータは明示的に文書化されていないようです。他の言及はこの動作に関連していないようです。また、lessよくある質問

答え1

根本的な問題は、コマンドlessに渡すファイル名を適切に引用符で囲んでいないことですLESSOPEN「各メタ文字の前にバックスラッシュを挿入します」つまり、null 文字列をまったく処理しないということです。 をバイパスすると、期待どおりに動作することがわかりますLESSOPEN

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

Ubuntu(Debianもそうだと思う)では、デフォルトではLESSOPENlesspipe 議論なしは、自身をハンドラとして設定するために必要な環境変数を出力しますLESSOPENデフォルトの.bashrcのeval式について説明していただけますか?したがって、lessnull 引数で実行すると、不適切な引用符により に渡される引数が削除されlesspipelesspipeその設定が出力されます。


追伸

に対してバグを報告することも考えましたlessが、私にとっては大きな問題ではありませんでした。誰かが率先して対処したい場合は、ぜひとも、何か必要なことがあれば私に知らせてください。1 つの解決策 (ただし下位互換性はありません) は、lessファイル名を引用符で囲まないことです。代わりに、 のように、設定内でファイル名を引用符で囲む必要がありますLESSOPEN='| /usr/bin/lesspipe "%s"'

lesspipeより詳細な構成の使用を推奨するために、バグを報告するのも良い考えかもしれません。

関連情報