
我不小心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
推薦更詳細的配置用法也可能是個好主意。