Man

為什麼 man -k 或 Apropos 找不到某些頁面而 man -a 可以?

  • October 10, 2020

在我的 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 printforman -f printfapropos 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

兩個主要原因可能會使whatislist 的手冊頁數少於man -a

  1. 不完整的配置:如果配置的搜尋路徑/etc/manpath.config(用於 Debian 和衍生產品;/etc/man_db.conf在其他一些發行版上)包括系統上所有包含手冊頁的目錄,但MANDB_MAP該文件中沒有其中一些目錄,則索引數據庫未初始化(也不搜尋,如果存在的話);man -a無論如何都會找到它們包含的頁面,因為它直接搜尋搜尋路徑中列出的目錄,而whatis不會,因為它只搜尋索引數據庫;
  2. 即使包含手冊頁的所有目錄都有正確的MANDATORY_MANPATHMANDB_MAP條目/etc/manpath.configwhatis列出的結果仍然可能比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
)

引用自:https://unix.stackexchange.com/questions/609561