Command-Line

為什麼 apropos 和 man -k 會忽略或錯過有效結果?

  • November 5, 2020

例如,如果我輸入以下命令:

$ man -k compare

diff結果中缺少該命令,但該test命令不是。我得到了與apropos預期相同的結果。

$ whereis diff
diff: /usr/bin/diff /usr/share/man/man1/diff.1.gz
$ whereis test
test: /usr/bin/test /usr/share/man/man1/test.1.gz

如果我檢查 的簡短描述diff,它是以下內容:

NAME
      GNU diff - compare files line by line

如您所見,“比較”在簡短描述中。此外,讓我們也檢查一下長描述:

DESCRIPTION
      Compare FILES line by line.

再次,“比較”出現在描述中。

現在,讓我們檢查一下 的簡短描述test

NAME
      test - check file types and compare values

這是我所期望的。但是,測試的描述中缺少“比較”。

所以,我不清楚為什麼man -k compareapropos compare找不到diff。但是我相信它與whatis命令的輸出有關:

$ whatis diff
diff (1)             - (unknown subject)
$ whatis test
test (1)             - check file types and compare values

現在這種差異的原因可能是由於手冊頁diff的名稱由兩個單詞“GNU diff”而不是一個組成,但我不確定。

這是 GNU diffutils 軟體包手冊頁中的一個錯誤。正如您所懷疑的,問題在於它們顯示“GNU diff”(等等)而不僅僅是“diff”作為程序名稱。這會導致 man 程序無法辨識簡短描述。

python3
>>> import dbm
>>> db = dbm.open('/var/cache/man/index.db')
>>> db['diff\0']
b'-\t1\t1\t1554725040\t0\tA\t-\t-\tgz\t\x00'
>>> db['cat\0']
b'-\t1\t1\t1567679920\t0\tA\t-\t-\tgz\tconcatenate files and print on the standard output\x00'

該錯誤是在 diffutils 3.3 之後和 diffutils 3.6 之前的某個地方引入的。它被報告為錯誤 #39760並在此送出或實際上可能在此送出中修復。修復程序尚未發布,它們將在 diffutils 3.8 中。

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