為什麼 man -k 或 Apropos 找不到某些頁面而 man -a 可以?
在我的 Pop!_OS 20.04 LTS 系統上,如果我使用
man -aw printf
它將返回:/usr/share/fish/man/man1/printf.1 /usr/share/man/man1/printf.1.gz /usr/share/man/man3/printf.3.gz
但如果我使用
man -k printf
orman -f printf
或apropos printf
它只會返回以下資訊:/usr/share/man/man1/printf.1.gz /usr/share/man/man3/printf.3.gz
為什麼這些命令找不到可以的東西
man -a
?我試過
mandb
了,沒有什麼可更新的。
以下假設您
man
和朋友來自man-db。考慮到 Pop!_OS 基於 Ubuntu,並且 Ubuntu 20.04 預設安裝了 man-db,這應該是正確的。當以“whatis”或“apropos”模式(分別為
man -f
和)操作時,實際上呼叫二進製文件並將搜尋委託給它。另一方面,當以預設模式(例如)或“where”模式()執行時,搜尋由二進製文件本身執行。和的搜尋常式彼此獨立實現。man -k``man``whatis``man *page*``man -w *page*``man``man``whatis
兩個主要原因可能會使
whatis
list 的手冊頁數少於man -a
:
- 不完整的配置:如果配置的搜尋路徑
/etc/manpath.config
(用於 Debian 和衍生產品;/etc/man_db.conf
在其他一些發行版上)包括系統上所有包含手冊頁的目錄,但MANDB_MAP
該文件中沒有其中一些目錄,則索引數據庫未初始化(也不搜尋,如果存在的話);man -a
無論如何都會找到它們包含的頁面,因為它直接搜尋搜尋路徑中列出的目錄,而whatis
不會,因為它只搜尋索引數據庫;- 即使包含手冊頁的所有目錄都有正確的
MANDATORY_MANPATH
和MANDB_MAP
條目/etc/manpath.config
,whatis
列出的結果仍然可能比man -a
因為*它簡單地從其輸出中省略*重複的名稱-節組合而列出的結果更少。在您的情況下,printf(1)
在兩者中都可以找到,/usr/share/man
並且/usr/share/fish/man
僅列出搜尋路徑中第一個目錄中的目錄。您可以使用該
manpath
命令顯示man
&friends 將使用的搜尋路徑,並確保它包含所有相關目錄。預設情況下,它是MANDATORY_MANPATH
基於/etc/manpath.config
.
man
&friends 也可以通過設置MANPATH
更改搜尋結果來使用明確定義的搜尋路徑呼叫。例如,如果您在情況 (2) 中,MANPATH=/usr/share/fish/man:/usr/share/man whatis printf
可能會列印一行描述,
/usr/share/fish/man/man1/printf.1
而不是/usr/share/man/man1/printf.1.gz
.
--debug
您還可以使用該選項查看引擎蓋下發生的事情。它可能會顯示您的程序正在使用/usr/share/man
之前列出的搜尋路徑,並且找到了所有三個文件,但是在 section中/usr/share/fish/man
找到的第二個文件的行不是由(或) 列印的。printf``1``whatis``man -f
最後,為了解決案例 (2),您可以定義一個輔助函式,該函式可以包裝
man
以使其也列出重複的名稱部分組合:slowman () ( IFS=: for path in ${MANPATH-$(manpath)} do printf '%s\n' "Searching ${path}:" 1>&2 MANPATH="$path" man "$@" done )