Corredor

ウェブ、プログラミングの勉強メモ。

yum や apt コマンドをラップする「pmw」コマンドを作った

僕は CentOS 歴が長いので、Ubuntu の apt コマンドに慣れず、ついつい yum コマンドの要領でコマンドを叩いてしまう。また、Windows の Git SDK に同梱される pacman は全くオプションが覚えられないでいる。

こうしたパッケージ管理ツールのラッパーコマンドを作ってみたら楽になるんじゃないか、と思い、作ってみた。その名も pmw : Package Manager Wrapper

ツールの在り処

pmw は以下よりダウンロードできる。

github.com

特徴

pmw は、対応しているパッケージ管理ツールのサブコマンドを特定し、適切なコマンドを構築・実行できる。

対応しているパッケージ管理ツールは以下のとおり。

  • dnf
  • yum
  • apt
  • apt-get
  • brew (Homebrew)
  • pacman

サブコマンドは以下を用意している。カッコ内はエイリアスだ。

  • install (iin)
  • remove (rrmununinstall)
  • update (upd)
  • upgrade (upupg)
  • search (find)
  • list installed (ls installedllslist-installedls-installed)
  • list available (ls availableLlalist-availablels-availablelist --upgradablels --upgradablelist upgradablels upgradablelist-upgradablels-upgradable)
  • info (show)

実際に使ってみせよう。

インストール方法と使い方

pmw は単一のシェルスクリプトで実装している。上の GitHub リポジトリから pmw ファイルをダウンロードし、PATH の通っているところに置けば良い。

内部的には type コマンドを使ってパッケージ管理ツールの存在をチェックし、見つけたコマンドに対応するサブコマンドを拾っている。よって、環境に応じて次のような要領で使用できる。

  • CentOS (yum が使える環境)
$ pmw install vim
# -> yum install vim

$ pmw up vim
# -> yum update vim
  • Ubuntu (apt が使える環境)
$ pmw in -y vim
# -> apt install -y vim

$ pmw ls
# -> apt list installed
  • MacOS (brew が使える環境)
$ pmw in vim
# -> brew install vim
  • Windows の Git SDK (pacman が使える環境)
$ pmw in vim
# -> pacman -S vim

…とこんな感じ。自分はほとんど installupdateupgrade くらいしか使わないので、コレだけちゃんと動けばいいかなー、というノリで作った。

以下製作に際しての細々

パッケージ管理ツールのコマンド対応表は以下などを参考にした。

最初、installremove などの単位でサブコマンドを解釈して実行できるようにしようかと考えて、以下あたりを見た。

yumlist available と書けて、apt は同等のことが list --upgradable で…みたいな、コマンドの種類と対応付けを、連想配列みたいに持ちたいなーと思っていた。JSON で書くなら以下のようなイメージ。

{
  "yum": {
    "install": "install",
    "list-available": "list available"
  },
  "apt-get": {
    "install": "install",
    "list-available": "list --upgradable"
  }
}

JSON ファイルを外に持ったり、jq を使ったりするのは何となく嫌だったので、Bash で連想配列が書けないか調べた。書けなくはないが、declare -A が Bash 4.3 以降でしか使えず、環境を選ぶので却下。

じゃあもっと単純に、配列で Find するかー、と思い、Bash の配列 (Array) も避けて、カンマ区切りの文字列を cut でちぎって参照することにした。

全体的な実装は、function に切り出して、結果を echo する、不正な値は空文字を echo し、呼び出し元でそれを判断して exit 1 する、という感じ。結果的に事足りたが、なんかシェルスクリプトらしくないというか…。

あと、まだまだ使われる apt-get は、list-installeddpkg-llist-availableapt-cache dumpavail を使うなど、apt-get 以外のコマンドも登場することがあり、今回の作りでは対応しきれなかったので諦めた。なんか全体的に判定ロジックを考え直した方が良いんだろうなぁ…。

連想配列でマスタデータを管理したり、それをサクッと find したりするのは、どうも JavaScript に慣れきってしまって、シェルスクリプトでやるのがツラい。でもまぁいいや、apt-get への対応は不十分でもきっと apt が入ってるだろ。

とゆーワケで以上。

今スグ始められる!  Linuxスタートブック (日経BPパソコンベストムック)

今スグ始められる! Linuxスタートブック (日経BPパソコンベストムック)

  • 作者:
  • 出版社/メーカー: 日経BP
  • 発売日: 2019/07/02
  • メディア: ムック

Ubuntu サーバー徹底構築

Ubuntu サーバー徹底構築

  • 作者:麻生 二郎
  • 出版社/メーカー: ソーテック社
  • 発売日: 2019/02/21
  • メディア: 単行本

[改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus)

[改訂新版]プロのためのLinuxシステム構築・運用技術 (Software Design plus)

  • 作者:中井 悦司
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/09/22
  • メディア: 大型本