たとえば次のようになります。
$ ## 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