誤って空のファイル名で実行してしまい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もそうだと思う)では、デフォルトではLESSOPEN
、lesspipe
議論なしは、自身をハンドラとして設定するために必要な環境変数を出力しますLESSOPEN
。デフォルトの.bashrcのeval式について説明していただけますか?したがって、less
null 引数で実行すると、不適切な引用符により に渡される引数が削除されlesspipe
、lesspipe
その設定が出力されます。
追伸
に対してバグを報告することも考えましたless
が、私にとっては大きな問題ではありませんでした。誰かが率先して対処したい場合は、ぜひとも、何か必要なことがあれば私に知らせてください。1 つの解決策 (ただし下位互換性はありません) は、less
ファイル名を引用符で囲まないことです。代わりに、 のように、設定内でファイル名を引用符で囲む必要がありますLESSOPEN='| /usr/bin/lesspipe "%s"'
。
lesspipe
より詳細な構成の使用を推奨するために、バグを報告するのも良い考えかもしれません。