この記事はopenSUSE Advent Calendar 2019の7日目です。

さて、一年越しの遊びたいねぇを実施したいと思います。

openSUSEのコンソールで作業していると、タイプミスやパッケージの未インストールなどで、システムにないコマンドを打ってしまうことがあります。

そんな時、コンソールには次のようなメッセージが表示されると思います。

$ ifconfig

‘ifconfig’ が入力間違いでなければ、下記のように入力することで command-not-found を利用してパッケージを検索することができます:
   cnf ifconfig

ネットワーク関連のコマンドはipやssというコマンドになったため、ifconfigはdeprecatedになっていて、システムには入っていません。

ここで私はzypper seで検索したり、ぐぐったり、と、コマンドを探しに行くわけですが、簡単にどこにあるかを探してくれるコマンドがありました。

そう、それがメッセージで親切にも教えてくれている、”cnf”です。

cnf – Command Not Found

cnfはCommand Not Foundの頭文字を並べたコマンドで、そのコマンドがどのパッケージに入っているかを探してくれたり、$PATHに設定がないのでは、などのNot Foundとなってしまう理由を表示したりしてくれます。なお、command-not-foundというコマンドも同じ模様。

$ cnf ifconfig

                        …  
プログラム ‘ifconfig’ は下記のパッケージに存在しています:
 * net-tools-deprecated [ パス: /bin/ifconfig, リポジトリ: zypp (repo-oss) ]
 * net-tools-deprecated [ パス: /usr/bin/ifconfig, リポジトリ: zypp (repo-oss) ]

下記を利用してインストールしてみてください:
   sudo zypper install net-tools-deprecated

net-tools-deprecatedパッケージにあることと、zypperコマンドでインストール可能なことが表示されました。ここでdeprecatedと名前のついているパッケージに入っているので、ぐぐる意味がでてきそうです。

コマンド名からパッケージが推測できる場合はzypper seで探すことも簡単ですが、そうでない場合などは有効ですね。たとえば、brctlなど。

ちなみに、私はbrctlを導入済みです。この状態でcnfを実行するとどうなるでしょうか。(導入済みなのに、brctlとコマンドを打ってもNot Foundとなってしまった想定)

$ cnf brctl

                     …  
プログラム ‘brctl’ は、システムにインストール済みのパッケージ ‘bridge-utils’ 内に存在します。

絶対パス ‘brctl’ は ‘/usr/sbin/brctl’ を指しています。そのため、このコマンドを実行するにはスーパーユーザ (root など) の権限が必要
かもしれません。

をを、親切にも、/usr/sbin下だから、sudoいるんじゃないの?と、アドバイスをしてくれます。

他にも、一般コマンドで試してみると、

$ cnf podman

                      …  
プログラム ‘podman’ は、システムにインストール済みのパッケージ ‘podman’ 内に存在します。

絶対パス ‘podman’ は ‘/usr/bin/podman’ を指しています。左記のパスがお使いの環境での $PATH 変数に含まれているかどうかご確認ください。

ちゃんと、$PATHに指定されているかをアドバイスしてくれます。

チュートリアルをしているときなどで、コマンドが見つからなかった場合、まずcnf叩いてみるのが有効そうですね。ただ、私の環境では1-clickで追加したリポジトリにあるパッケージを認識しなかったりしたので、ちょっとチューニングがいるのかもしれません。(Cloud:OpenStack:Masterに入っている、genisoimageなど)

まとめ

  • cnfはそのコマンドがNot Fonudとなる理由を表示するユーティリティで、これ自体は勝手に何かをインストールしたりはしないので、気軽に使える
  • コマンド名からパッケージ名の推測が難しいときや、パッケージ入れたのに使えないときに使用する
  • 認識しないリポジトリがある?←要調査
  • manを見ると、厳密にはハンドラでbashやzshに統合されてるらしい
  • 他ディストリビューションでは同様コマンドはあるのでしょうか?情報お持ちの方、是非ご教示ください