為什麼「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:它的作用是“在每個元字元前插入反斜線”,這意味著它根本不處理空字串。如果繞過,您可以看到它按預期工作LESSOPEN

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

在 Ubuntu(加上 Debian,我相信)上,預設情況下,LESSOPEN透過運行進行配置lesspipe 沒有參數,它會列印必要的環境變數以將其自身設定為LESSOPEN處理程序。看你能解釋一下預設 .bashrc 中的 eval 表達式嗎。因此,當使用空參數執行時less,不正確的參考會刪除傳遞給 的參數lesspipe,並lesspipe列印其配置。


聚苯乙烯

我考慮過打開一個針對 的錯誤less,但這對我來說並不是一個大問題。如果有人想採取主動,請務必告訴我您是否需要任何東西。一個可能的解決方案(但不向後相容)是less根本不會嘗試引用文件名,而是需要在配置中引用文件名,例如LESSOPEN='| /usr/bin/lesspipe "%s"'.

開啟一個錯誤來lesspipe推薦更詳細的配置用法也可能是個好主意。

相關內容