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ではどのような仕組みでヒントを出しているのか?

調べてみたところ、その名もずばり 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_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 ツールと似た使い方で、覚えやすく便利になります。
ただし、こちらはあいまい検索はできないようで、正確にコマンド名を指定する必要があります。

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

$ function command_not_found_handle { sudo dnf provides $1 ; }

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

command not foundのキーワードで探してもなかなか見つけられなかった方法だったので、自分のための備忘も兼ねて紹介しました。 

No comments:

Post a Comment