2026-01-18

Ubuntu Linuxではcommand not foundエラー時にヒントが出て便利なので、CentOS/Fedora/RHEL/Rocky/Almaでも何とかしたい

Ubuntu Linuxでは未インストールのコマンドを打ってエラーになった時、どのパッケージをインストールすればよいかのヒントが表示されます。
たとえば次のようになります。

$ ## Ubuntuの場合
$ ifconfig
Command 'ifconfig' not found, but can be installed with:
sudo apt install net-tools
$

ところがRocky Linux (同様に CentOS、Fedora、Alma Linux、RHEL、Red Hat Enterprise Linuxなど) では、単にcommand not foundのエラーになるだけです。

$ ## Rockyの場合
$ ifconfig
-bash: ifconfig: command not found
$

コマンドのインストール漏れの場合は https://www.rpmfind.net/ 等で調ればどのパッケージなのか分かるのですが、わざわざブラウザを開いて調べるのが面倒なので、Ubuntuの動きをうらやましく思っていました。

Ubuntuではどのような仕組みでヒントを出しているのか?

調べてみたところ、その名もずばり command-not-found というツールが関与していました。
シェルに対する設定は、次の場所にありました。

$ grep -n -C5 -e 'command.not.found' /etc/bash.bashrc
55-
56:# if the command-not-found package is installed, use it
57:if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
58:     function command_not_found_handle {
59-             # check because c-n-f could've been removed in the meantime
60:                if [ -x /usr/lib/command-not-found ]; then
61:                /usr/lib/command-not-found -- "$1"
62-                   return $?
63:                elif [ -x /usr/share/command-not-found/command-not-found ]; then
64:                /usr/share/command-not-found/command-not-found -- "$1"
65-                   return $?
66-             else
67:                printf "%s: command not found\n" "$1" >&2
68-                return 127
69-             fi
70-     }
71-fi
$

「/usr/lib/command-not-found -- "調べたいコマンド"」という使い方ということが分かります。
また、command_not_found_handle というコールバック関数がもともとbashに組み込まれていることも分かりました。

$ strings /usr/bin/bash | grep command_not_found
command_not_found_handle
$

Rockyでもこのコールバック関数自体は組み込まれてはいるのですが、肝心の command-not-found ツールが提供されていません。

Rockyでの command-not-found の代替ツールは、dnf provides が良さそう

Ubuntuと全く同じ動作でなくても良いので、Rockyでわざわざ rpmfind を調べず、すぐにわかる方法がないかをずっと探していました。
そしてとうとう、ちょうどよいツールとして dnf コマンドの provides サブコマンドを見つけました。
次のように使います。

$ sudo dnf provides ifconfig
Last metadata expiration check: 0:17:40 ago on Sun Jan 18 15:36:16 2026.
net-tools-2.0-0.64.20160912git.el9.x86_64 : Basic networking tools
Repo        : baseos
Matched from:
Filename    : /usr/sbin/ifconfig

$

この例では、ifconfigコマンドを使うはnet-toolsをインストールすればよいことが分かります。
このコマンドはdnfのデーターベースを参照するためにsudoで起動する必要があります。
ちなみに、dnf provides は dnf whatprovides と打っても dnf wp と打っても良いようですので、短いコマンドが好きな方はこちらを覚えると良いでしょう。
さらに、たとえば次のようにaliasを定義することで、

$ alias command-not-found='sudo dnf provides'

「command-not-found 調べたいコマンド」のように Ubuntu の command-not-found ツールと似た使い方で、覚えやすく便利になります。
ただし、こちらは本物のcommand-not-foundツールのようなあいまい検索はできなので、正確にコマンド名を指定する必要があります。

また更に、次のような感じで、Ubuntuと同様のbashの設定を行えば、いつでもすぐにヒントが出るようになります。

$ function command_not_found_handle { sudo dnf provides $1 ; }

ですが、ここまでやってしまうと、コマンドの単なるスペルミスの場合にも毎回探しに行って結局見つからないエラーになってしまうだけなので、私はそこまでの設定はしませんでした。

ずっとcommand not foundのキーワードで探してもなかなか見つけられなかった解決策が今回やっと見つかったので、自分のための備忘も兼ねて紹介しました。

[2026-01-19] さらに便利かもしれない「dnf install コマンドフルパス」コマンド
dnf provides を見つけて喜んでいたのですが、その直後に、場合によってはもっと便利なコマンドを見つけてしまいました。
いつもの dnf install に対してパッケージ名ではなくてコマンドフルパスを直接指定するという方法です。
コマンドのフルパスを知っている必要はありますが、コマンド名からパッケージ名が分かりにくい場合にはこちらが断然良いですね。
たとえば次のようになります。

$ sudo dnf install /usr/bin/c
Last metadata expiration check: 3:41:01 ago on Mon Jan 19 06:57:56 2026.
Dependencies resolved.
================================================================================
 Package                           Arch      Version         Repository    Size
================================================================================
Installing:
 command-line-assistant            noarch    0.4.2-1.el9     AppStream    233 k
Installing dependencies:
 command-line-assistant-selinux    noarch    0.4.2-1.el9     AppStream     26 k
 python3-greenlet                  x86_64    1.1.2-4.el9     AppStream    128 k
 python3-sqlalchemy                x86_64    1.4.45-3.el9    AppStream    2.4 M
 python3-tomli                     noarch    2.0.1-5.el9     AppStream     37 k

Transaction Summary
================================================================================
Install  5 Packages

Total size: 2.8 M
Installed size: 15 M
Is this ok [y/N]:

いろいろ便利な機能がありますね。

No comments:

Post a Comment