openSUSEでコマンドが見つからないときにぐぐるより先にやること
この記事は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に統合されてるらしい
- 他ディストリビューションでは同様コマンドはあるのでしょうか?情報お持ちの方、是非ご教示ください