Linux / コマンド / whatis - コマンドの一行説明を確認

whatisは、マニュアルページの名前を検索してそのページの一行説明を表示するコマンドです。コマンドの名前は知っているが、どの機能かをすぐに確認したい場合や、同じ名前が複数のマニュアルセクションに存在するかを調べたい場合に便利です。

基本的に正確なページ名を探し、man -fも同じ目的で使用できます。テーマや説明中のキーワードで広く探したい場合は、whatisよりaproposが適しています。

whatisコマンドとは?

マニュアルページのNAME部分にはページ名と短い説明が入っています。whatisはman-dbの索引データベースから指定した名前と一致するページを検索し、この説明を一行で出力します。

マニュアル本文を開かないため、複数のコマンドの概要を素早く確認するのに適しています。ただし、実行ファイルの場所やシェルで実際に選択されるコマンドを教えるツールではありません。

基本文法と出力の読み方

whatis [オプション] 名前...

lsの一行説明を確認します。

whatis ls

出力は一般的に次の構造です。

ls (1)               - list directory contents

lsはページ名、(1)はマニュアルのセクションで、ハイフンの後は一行説明です。全体の使い方は結果のセクション番号と名前を使って開きます。

man 1 ls

複数の名前を一度に確認する

引数を複数指定すると、それぞれの名前の結果をまとめて見ることができます。

whatis ls cp mv rm

基本コマンドの役割を比較したり、サーバーにインストールされているマニュアルを確認する際に便利です。ある名前がなくても他の名前の結果は出力されることがあるため、自動化では最終終了状態と個別の結果を一緒に確認する必要があります。

同じ名前が複数のセクションにある場合

同じページ名が複数のマニュアルセクションに存在する場合、whatisは複数行を出力することがあります。代表的な例としてpasswdはユーザーコマンドとファイル形式文書が区別されます。

whatis passwd

結果にpasswd(1)とpasswd(5)が表示される場合、それぞれ以下のように開きます。

man 1 passwd
man 5 passwd

括弧内の数字はプログラムのバージョンではなく、マニュアルのセクションです。コマンドの使い方は通常セクション1または8、設定ファイル形式は主にセクション5で確認します。

正規表現とワイルドカード検索

正規表現 -r

-r または --regex は、入力した名前を正規表現として解釈します。ページ名の一部が一致しても結果が出ることがあります。

whatis -r '^ssh'
whatis --regex 'printf$'

正規表現の特殊文字がシェルで先に解釈されないように、引用符で囲むと安全です。

ワイルドカード -w

-w または --wildcard は、シェルスタイルのワイルドカードパターンで名前を検索します。展開されたパターンがページ名全体に一致する必要があります。

whatis -w 'ssh*'
whatis --wildcard '*printf*'

引用符を付けないと、* はまず現在のディレクトリのファイル名に展開されることがあります。

マニュアルセクションを制限する

-s または --sections で希望するセクションだけを検索することができます。

whatis -s 1 passwd
whatis -s 5 passwd
whatis --sections=2,3 printf
セクション 主な内容
1 一般ユーザーのコマンドと実行プログラム
2 システムコール
3 ライブラリ関数
5 設定ファイルとファイル形式
8 システム管理コマンド

よく使う whatis オプション

オプション 説明
-r, --regex 入力した名前を正規表現で処理します。
-w, --wildcard シェルスタイルのワイルドカードパターンで検索します。
-s リスト, --sections=リスト 指定したマニュアルセクションのみ検索します。
-l, --long 端末幅に合わせて説明が切れる動作を無効にします。
-M パス, --manpath=パス 検索するマニュアルの階層パスを指定します。
-L ロケール, --locale=ロケール その実行で使用するロケールを指定します。

whatis と man -f の関係

man-db 環境では、man -f は whatis と同じ方法でページの短い説明を探します。

whatis printf
man -f printf

覚えやすい方を使えます。全文を読むには、man のページ表示とセクション指定を利用します。man -f は man の関連機能として覚えやすく、whatis は一行説明を確認するという目的が名前に現れています。

whatis、apropos、type の違い

コマンド 答える質問
whatis ls この名前を持つマニュアルページは何を説明していますか?
apropos copy このテーマに関連するマニュアルページは何ですか?
type ls 現在のシェルはこのコマンド名をどのように解釈していますか?
command -v ls 現在のシェルでこのコマンドを見つけることができ、どのような形式ですか?

whatis 結果があるからといって、同じ名前の実行ファイルが現在 PATH にあるという意味ではありません。逆に、実行ファイルがあってもマニュアルページがインストールされていなければ結果がないこともあります。

検索結果がないときの解決方法

ページ名とインストール状況の確認

whatis は基本的に正確なページ名を検索します。トピックや説明の単語を入力した場合は apropos によるキーワード検索を使用し、実行ファイルの有無は command -v で確認してください。

apropos archive
command -v tar
whatis tar

索引データベースを更新する

マニュアルを新たにインストールしたのに結果が出ない場合、man-db のインデックスがまだ更新されていない可能性があります。

sudo mandb

システムがパッケージインストールの過程や予約タスクによって自動更新される場合もあります。管理権限がない環境では、まずユーザーマニュアルのパスとディストリビューション設定を確認してください。

ロケールと MANPATH の確認

locale
manpath
printf '%s\n' "$MANPATH"

特定のロケールのインデックスやユーザーが指定した MANPATH のために、予想したドキュメントが検索されないことがあります。

スクリプトで結果を使用する

man-db では、一致なしは終了状態 16、使用法・設定の問題は 1、動作上のエラーは 2 です。以下は成功か失敗かを表示する部分の例なので、失敗をすべて「説明が存在しない」と断定せず、必要に応じて終了状態と診断メッセージを確認してください。

スクリプトでマニュアルの存在有無を確認することはできますが、出力文はロケールや文書内容によって異なる場合があります。表示文字列を解析するよりも終了状態を使用し、実際のコマンドの存在を確認する目的であればcommand -vを使用してください。

if whatis "$1" >/dev/null 2>&1; then
  printf '%s\n' 'マニュアルの説明を見つけました.'
else
  printf '%s\n' 'マニュアルの説明を見つけられませんでした.' >&2
fi

$1 はスクリプトの最初の引数です。例を check-description.sh として保存した場合、bash check-description.sh tar のように検索する名前を渡します。この例は判定結果を表示し、失敗時の終了コードを呼び出し側へそのまま返す処理までは含めていません。

よくある質問

whatisはコマンドの実際のパスを表示しますか?

いいえ。マニュアルページの名前と説明を表示します。実行パスやコマンドの種類はtypeやcommand -vで確認してください。

説明に含まれる単語で検索するにはどうすればよいですか?

apropos キーワードまたはman -k キーワードを使用します。whatisは基本的にページ名がわかっている場合に適しています。

なぜ同じ名前が複数行表示されるのですか?

異なるマニュアルセクションに同じ名前のページがあるためです。括弧内のセクション番号を確認し、man セクション 名前で目的のページを開いてください。

まとめ

whatisは、知っているマニュアルページの名前の役割を一行で確認するツールです。複数のセクションで同名のページを区別し、複数の名前を素早く確認し、必要な文書をmanで開く前に候補を確認できます。

機能キーワードで文書を探すときはaproposを、実際のコマンド解釈を確認するときはtypeやcommand -vを使用してください。他の基本コマンドはLinuxコマンド一覧と概要で確認できます。

公式文書を参照