Infra Engineer

コマンドの検索~whatisコマンド・aproposコマンド~
2022.08.31
Lv1

コマンドの検索~whatisコマンド・aproposコマンド~

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、whatisコマンドとaproposコマンドについて解説します。
コマンドの検索をしたいときに使用します。
簡単に言うと、whatisコマンドは完全一致検索で、aproposコマンドは部分一致検索ですが、それ以外にも少し違いがあります。

・whatisコマンド
・aproposコマンド
・whatisデータベース
・まとめ
・確認問題

whatisコマンド

whatisコマンドは、「man -f」に相当するコマンドです。
コマンドを完全一致で検索し、説明を表示します。

whatisコマンド
意味 コマンドマニュアルを完全一致で検索する。
書式 whatis [オプション] 検索文字列
オプション 説明
-w 検索にワイルドカードを使用する。
例①)
「ls」コマンドを検索。
[root@localhost ~]# whatis ls
ls (1)               - ディレクトリの内容をリスト表示する
ls (1p)              - list directory contents

whatisの引数に文字列を置いて実行すると、該当するコマンドの説明が表示されます。

例②)
「passwd」コマンドを検索。
[root@localhost ~]# whatis passwd
passwd (1)           - ユーザパスワードを変更する
passwd (5)           - パスワードファイル

passwdコマンドを検索すると、2つの異なる結果が表示されました。
「passwd」には「passwdコマンド」と「passwdというファイル」が存在しています。
これらがふたつとも検索にかかっています。
括弧の中に書かれている数字は「セクション番号」です。
それぞれ以下の意味になります。

セクション番号 意味
1 シェルコマンドや実行ファイル
2 システムコール
3 ライブラリ関数
4 デバイスファイル
5 ファイルフォーマット
6 ゲームプログラム
7 その他(マクロ、規約、ファイルシステム、プロトコル等)
8 システム管理コマンド
9 カーネル用ドキュメント

manコマンドで、passwdのように複数のセクションに存在する文字列を検索する際、このセクション番号を指定すれば求める検索結果を得られます。
whatisコマンドを使用すれば、詳しいマニュアルを検索する前に、求める情報のセクション番号を調べることが可能です。

例③)
ワイルドカードを使用して「ls*」を検索。(-w)
[root@localhost ~]# whatis -w 'ls*'
ls (1)               - ディレクトリの内容をリスト表示する
lsattr (1)           - Linux 第 2 拡張ファイルシステム (ext2fs) ...
lsdev (8)            - 組み込まれているハードウェアに関する...
lsearch (3)          - 配列を線形検索する
lseek (2)            - ファイルの読み書きオフセットの位置を...
lseek64 (3)          - ファイルの 64 ビットの読み書きオフセ...
lsetxattr (2)        - 拡張属性の値を設定する
lsmod (8)            - Linux カーネルのモジュールの状態を表示...
lspci (8)            - 全ての PCI デバイスを表示する
lstat (2)            - ファイルの状態を取得する
lstat64 (2)          - ファイルの状態を取得する
ls (1p)              - list directory contents
lsblk (8)            - list block devices
lscgroup (1)         - list all cgroups
lscpu (1)            - display information about the CPU architecture
lsearch (3p)         - linear search and update
lseek (3p)           - move the read/write file offset
lshw (1)             - list hardware
lsinitrd (1)         - tool to show the contents of an initramfs image
lsipc (1)            - show information on IPC facilities currently employed ...
lslocks (8)          - list local system locks
lslogins (1)         - display information about known users in the system
lsmcli (1)           - libStorageMgmt command line interface
lsmd (1)             - lsmd
lsmd.conf (5)        - libStorageMgmt daemon lsmd configuration file.
lsmem (1)            - list the ranges of available memory with their online ...
lsns (8)             - list namespaces
lsof (8)             - list open files
lsscsi (8)           - list SCSI devices (or hosts) and their attributes
lssubsys (1)         - list hierarchies containing given subsystem
lstat (3p)           - get symbolic link status
lsusb (8)            - list USB devices

「-w」オプションを使用すると、ワイルドカードを使用した検索が可能です。
この例では、「ls」から始まるものをすべて検索していることになります。


aproposコマンド

aproposコマンドは、「man -k」に相当するコマンドです。
コマンドを部分一致で検索し、説明を表示します。

apropos
意味 コマンドマニュアルを部分一致(正規表現)で検索する。
書式 apropos [オプション] 検索文字列

aproposコマンドは、部分一致検索です。
正確に言えば、デフォルトの状態で正規表現検索になっています。
aproposコマンドのオプションについては試験でも問われず使用頻度も低いため割愛します。

例①)
「ls」コマンドを検索。
[root@localhost ~]# apropos ls
_llseek (2)          - ファイルの読み書きオフセットの位置を...
backtrace_symbols (3) - アプリケーション自身でのデバッグの...
backtrace_symbols_fd (3) - アプリケーション自身でのデバッグ...
credentials (7)      - 認証に用いられるプロセスの識別子
dircolors (1)        - ls 用の色設定
dlsym (3)            - 動的リンクを行うローダへの プログラ...
false (1)            - 何もせず、失敗で終了する
get_thread_area (2)  - スレッド局所記憶 (TLS) 領域を取り出す ※注意
llseek (2)           - ファイルの読み書きオフセットの位置を...
ls (1)               - ディレクトリの内容をリスト表示する
lsattr (1)           - Linux 第 2 拡張ファイルシステム (ext2fs) ...
lsdev (8)            - 組み込まれているハードウェアに関する...
lsearch (3)          - 配列を線形検索する
(以下省略)

whatisコマンドとの違いを抑えましょう。
aproposコマンドは正規表現検索になっているため、「ls」を含むすべての検索結果が表示されます。

「※注意」とした行について、「get_thread_area」には「ls」という文字列が含まれていないことにお気づきでしょうか。
なぜこれが「apropos ls」で検索結果に表示されたのでしょう。
「get_thread_area」の説明文を見ると「TLS」という文字列があります。
実は、この説明文の「TLS」に含まれる「LS」にヒットしています。
つまり、aproposコマンドはコマンド名称だけでなく、マニュアル内容も検索対象に含めています

例②)
「検索」という文字列を含むものを検索。
[root@localhost ~]# apropos 検索
apropos (1)          - マニュアルページの名前と要約文を検索...
bsearch (3)          - ソートされた配列を二分木検索 (binary sea...
bzgrep (1)           - bzip2 圧縮されている可能性のあるファイ...
find (1)             - ディレクトリ階層をたどって、条件を満...
gawk (1)             - パターン検索・処理言語
host (1)             - ドメインサーバを使ってホスト名の検索...
lfind (3)            - 配列を線形検索する
lkbib (1)            - 文献目録データベースを検索する
lookbib (1)          - 文献目録データベースを検索する
lsearch (3)          - 配列を線形検索する
manpath (1)          - マニュアルページの検索パスを設定します
wcschr (3)           - ワイド文字文字列中のワイド文字を検索...
wcscspn (3)          - ワイド文字文字列から、与えた文字集合...
wcspbrk (3)          - ワイド文字列から、与えられたワイド文...
zgrep (1)            - 圧縮されている可能性のあるファイルで...
[root@localhost ~]# whatis 検索  
検索: 適切なものはありませんでした。# whatisでは不可

例①で説明した通り、aproposコマンドはマニュアル内容も検索対象であることから、このような使い方が可能です。
これで「検索」に関するコマンドを疑似的に検索している形です。
ただし、日本語マニュアルがインストールされていないともちろんヒットしません。


whatisデータベース

whatisコマンドやaproposコマンドは「whatisデータベース」というマニュアルのデータベースを対象に検索を行っています。
新しいコマンドをインストールした際などは、whatisデータベースを更新しないと正しい結果が得られません。

whatisデータベースを更新するコマンドが、「makewhatis」「mandb」です。

makewhais
意味 whatisデータベースを更新する。
書式 whatis
mandb
意味 whatisデータベースを更新する。
書式 mandb

makewhatisコマンドは古いコマンドであり、現在ではmandbコマンドを使用します。

例)
whatisデータベースを更新。
[root@localhost ~]# mandb
/usr/share/man 内の古いデータベース要素を取り除いています...
/usr/share/man 配下のマニュアルページを処理しています...
/usr/share/man/hu 内の古いデータベース要素を取り除いています...
/usr/share/man/hu 配下のマニュアルページを処理しています...
/usr/share/man/ja 内の古いデータベース要素を取り除いています...
/usr/share/man/ja 配下のマニュアルページを処理しています...
/usr/share/man/de 内の古いデータベース要素を取り除いています...
/usr/share/man/de 配下のマニュアルページを処理しています...
(中略)
0 man subdirectories contained newer manual pages.
0 manual pages were added.
0 stray cats were added.
0 old database entries were purged.

まとめ

今回は、whatisコマンド、aproposコマンドについて解説しました。
それぞれの特徴をまとめておきます。

コマンド 書式 検索方法 その他の特徴
whatis whatis [オプション] 検索文字列 完全一致 名称のみを検索対象とする。
apropos apropos [オプション] 検索文字列 部分一致(正規表現) 名称だけでなく、説明文も検索対象である。

最後に、確認問題で今回の記事で得た知識を確かめましょう。


確認問題

問題

次のコマンドのうち、「ssh」から始まるマニュアルを検索するものはどれか。

A) apropos ssh
B) whatis ssh
C) which ssh
D) whatis -w ‘ssh*’
E) man ssh

解答
答え:D

A) aproposコマンドは正規表現での検索です。よって「sshを含む」ものがヒットします。
B) whatisは完全一致検索です。よって「sshに完全一致する」ものがヒットします。
C) whichはコマンドの絶対パスを表示します。
D) 正解です。whatisコマンドの「-w」オプションはワイルドカードでの検索を使用できます。
E) 「ssh」のマニュアルページが表示されることになります。