man -kまたはAproposはいくつかのページを見つけることができませんが、man -aが見つかる理由は何ですか?

man -kまたはAproposはいくつかのページを見つけることができませんが、man -aが見つかる理由は何ですか?

man -aw printf私のPop!_OS 20.04 LTSシステムでこれを使用すると、次のものが返されます。

/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 printfまたはを使用するとapropos printfそうなります。ただ次の情報を返します。

/usr/share/man/man1/printf.1.gz
/usr/share/man/man3/printf.3.gz

なぜこのコマンドは可能なものを見つけることができないのですかman -a

これを試してみましたが、mandb更新することはありません。

ベストアンサー1

以下は、あなたmanとあなたの友人が次のものであると仮定します。人データベース。 Pop!_OSがUbuntuに基づいており、Ubuntu 20.04にはデフォルトでman-dbがインストールされていることを考慮すると、これは正しいことです。

man -f「whatis」または「apropos」モード(およびそれぞれapropos)man -kで動作すると、バイナリがman実際に呼び出され、検索が委任されます。whatis一方、デフォルトモード(例)または「where」モード()で実行すると、バイナリ自体で検索が実行されます。そして検索ルーチンは互いに独立して実装される。man pageman -w pagemanmanwhatis

whatisより少ない数のマニュアルページがリストされている2つの主な理由は次のとおりですman -a

  1. 不完全な設定:設定された検索パス/etc/manpath.config(Debianとその派生製品、他のいくつか/etc/man_db.confのディストリビューションで使用されています)には、マニュアルページを含むシステム上のすべてのディレクトリが含まれていますが、そのMANDB_MAP一部がファイルに存在しない場合、インデックスデータベースは初期化されませんでした(検索されません)なし)。 (存在する場合)インデックスデータベースのみを検索するため、インデックスデータベースではなく検索パスにリストされているman -aディレクトリを直接検索するため、含まれているページはとにかく見つかります。whatis

  2. マニュアルページを含むすべてのディレクトリに正しいものとエントリが含まれていMANDATORY_MANPATHMANDB_MAPも、まだ表示されることがあります/etc/manpath.configwhatisman -aそれは単に省略出力に名前部分の組み合わせが重複しています。。あなたの場合は、printf(1)両方に見つかり、検索パスに最初に表示されるディレクトリのみが一覧表示されます。/usr/share/man/usr/share/fish/man

検索パスを使用するmanpathShow & Friends コマンドを使用し、関連するすべてのディレクトリが含まれていることを確認できます。manデフォルトではのMANDATORY_MANPATH項目に基づいて作成されます/etc/manpath.config

manMANPATH&Friendsは、検索結果の設定を変更して、明示的に定義された検索パスを使用して呼び出すこともできます。例えば(2)の状況にあった場合、

MANPATH=/usr/share/fish/man:/usr/share/man whatis printf

1行の説明ではなく、1行/usr/share/fish/man/man1/printf.1の説明を印刷できます/usr/share/man/man1/printf.1.gz

また、このオプションを使用して、後で何が起こっているのかを確認することもできます--debug。プログラムは/usr/share/man以前にリストされた検索パスを使用しており、3つのファイルがすべて見つかり/usr/share/fish/manましたが、printfセクションで見つかった2番目のファイルの行は(または)1として印刷されていないように見えることがあります。whatisman -f

最後に、ケース(2)を解決するために、重複する名前部分の組み合わせもリストするようにラップするmanヘルパー関数を定義できます。

slowman () (
    IFS=:
    for path in ${MANPATH-$(manpath)}
    do
        printf '%s\n' "Searching ${path}:" 1>&2
        MANPATH="$path" man "$@"
    done
)

おすすめ記事