Googleで"apt-get vs. aptitude"と検索すると、そのものずばりの記事やスレッドやフォーラムの投稿なんかが見つかります。やっぱみんな気になっているのね。ここでは、一番まとまっていたと思われるYet Another Linux Blogのこのエントリを基本に説明していこうと思います。
結論から言うと、「Ubuntuで使うなら今は
apt-getに統一しておいた方がいいよ」ということらしいです。実際、非公式なUbuntuGuideのGeneral NotesのところでもAll references to "aptitude" will be replaced with "apt-get". You may still use "aptitude" if you wish, however could cause dependency issues.なんて書いてあったりします(日本語訳:このガイドに書いてある"aptitude"は全て"apt-get"に脳内補完しておくれやす。"aptitude"も使えなくもないけど、依存性が破壊されるおそれがありますのねん)。
以下、apt-getとaptitudeの違いをつらつらと。
ログファイル
apt-getは特にログファイルを持っていません。そのかわり後ろで動くdpkgコマンドが/var/log/dpkg.logというログファイルを持っているようです。この中にはインストール・アンインストールしたパッケージの一覧が載っています。
aptitudeでもdpkgが後ろで動いていますが、dpkg.logとは別に
/var/log/aptitudeというファイルを管理しています。もし一度もaptitudeコマンドを使ったことがないのなら、ファイル自体が存在しません。
インストール時
主な違いは「推奨(recommends)パッケージ」の扱いです。apt-getは推奨パッケージを表示するだけに留めますが、aptitudeは推奨パッケージもインストールしようとします(たぶん提案(suggests)パッケージはインストールしません。推奨と提案の違いはこのエントリの質疑応答が参考になります)。アンインストール時
主な違いは必要のなくなったパッケージ(孤児(orphan)パッケージと呼ばれるらしい)の扱いです。apt-getもaptitudeもあるパッケージをインストールしたとき、必要なパッケージも自動的にインストールしてくれますが、インストールしたパッケージを削除したとき、apt-getはそのパッケージだけを、aptitudeは(/var/log/aptitudeのログを元に)不要になったパッケージも削除します。この不要パッケージに対する扱いの違いのために、aptitudeの愛用者が多かったようです。現在ではapt-get autoremoveコマンドでaptitude同様のことを独自のログファイルを作成することなく実現できます。
実例
仮想的なpackageXパッケージをapt-get、aptitudeの双方でインストールしたときの違いを見ていきましょう。まず、packageXに対する依存関係は以下のようになっているとします。- 依存:packageXdep
- 推奨:packageXrec
- 提案:packageXsug
ケース1:aptitudeを使ってインストールし、aptitudeを使ってアンインストールする。
- aptitude install packageX:packageXとpackageXdepとpackageXrecがインストールされる。
- aptitude remove packageX:packageXとpackageXdepとpackageXrecがアンインストールされる。
- 一緒にインストールされたパッケージはaptitudeのデータベースに基づいて全てアンインストールされる。
- aptitudeのデータベースの整合性は維持される。
ケース2:apt-getを使ってインストールし、apt-getを使ってアンインストールする。
- apt-get install packageX:packageXとpackageXdepがインストールされる。
- apt-get remove packageX:packageXのみがアンインストールされる。
- 依存関係によってインストールされたパッケージは残ったままになる。
- aptitudeのデータベースには触れないので整合性は維持される。
ケース3:apt-getを使ってインストールし、apt-get --autoremoveを使ってアンインストールする。
- apt-get install packageX:packageXとpackageXdepがインストールされる。
- apt-get --autoremove remove packageX:packageXとpacageXdepがアンインストールされる。
- 一緒にインストールされたパッケージは全てアンインストールされる。
- aptitudeのデータベースには触れないので整合性は維持される。
ケース4:apt-getを使ってインストールし、aptitudeを使ってアンインストールする。
- apt-get install packageX:packageXとpackageXdepがインストールされる。
- aptitude remove packageX:packageXがアンインストールされる。
- packageXdepはaptitudeのデータベースに登録されていないので、アンインストールされない。
- aptitudeのデータベース においてpackageXdepはインストールされていないことになっている。
ケース5:aptitudeを使ってインストールし、apt-get --autoremoveを使ってアンインストールする。
- aptitude install packageX:packageXとpackageXdepとpackageXrecがインストールされる。
- apt-get --autoremove remove packageX:packageXとpackageXdepがアンインストールされる(packageXrecはどうなるか不明)。
- packageXdepはaptitudeのデータベースに関係なくアンインストールされる。
- aptitudeのデータベース において、packageXdepはインストールされたままの状態になっている。
うーん、わかりやすくまとめたつもりがなぜかわかりにくくなっている……。全てのケースにおいて単独では問題はおきないと思います。ただ、ケース4、5の場合、このあとにpackateXdepが関係するパッケージをインストールしたときに何か問題が起きそうです。このへんの話が「apt-getとaptitudeの混用はやめたほうがいいよ」という理由になっているのだと思います。
ところで、aptitudeってapt-getの進化版と思っていたのですけれども、違うんですね。どちらもdpkgのフロントエンドを目指して作られたけれども出自は別で、どちらかというとaptitudeの方が古いんだとか。
追記(2007/12/17)
案外、このエントリにやってくる人が多いようなので、いくつか修正・追記しておきました。とりあえず、ここに書いてあることは、非公式の情報を元に推論したものであり、事実と違う可能性があるので注意してください。実際、apt-getに統一した方がいいと書きましたが、DebianのMLやDebian GNU/Linux スレッドテンプレを見ると、積極的にaptitudeが使われています。これはDebianでは、SynapticのようなGUIは利用せずに端末上からインストールする方が多いために、aptitudeで統一した方がいろいろとログが残るし、特にオプションを指定しなくても「推奨」パッケージがインストールされるし、aptitudeにはCUI用のインターフェースも用意されているしと利点が多いからだと思われます。また、上記では取り消し線をつけておきましたが、Synapticが
apt-getを呼び出しているわけではないようです。まずAdvanced Packaging Tool(APT)というパッケージ管理のライブラリがあり、apt-getはそのライブラリに付属するおまけのコマンドで、aptitudeとSynapticはそのライブラリを利用し、ユーザインターフェースを備えたものという位置づけのようです。よって、Synapticもまたapt-getと同様にaptitudeのログを無視するということには変わりありません。また、[アプリケーション] - [追加と削除...]から起動できる「アプリケーションの追加と削除」の正体はgnome-app-installというアプリケーションであり、これは、python-aptというPythonでAPTライブラリを利用するモジュール集を使っています。このため、これもまたSynapticと同様にaptitudeのログを無視します。Ubuntuでも、サーバ版を使うだとか、Synapticや「アプリケーションの追加と削除」は使わないだとか言う場合は、aptitudeに統一してもいいかもしれません。ただ、「
apt-getとaptitudeの混用は避けるべき」というのは、Debian GNU/Linux スレッドテンプレにも書いてあるので、どちらかに統一するべきでしょう。ただ、公式ドキュメントにはそのような記載が一切ないので、それほど気にする必要はないのかもしれません。個人的には、Synapticや「アプリケーションの追加と削除」、apturlなどが便利なので「aptitudeは使わない」というように決めています。タグ:ubuntu



aptitude のメンテナをやっているものなのでちょっと気になった点についてコメントです。
「aptitudeは(/var/log/aptitudeのログを元に)不要になったパッケージも削除します」は嘘ですよ。
/var/lib/apt/extended_states というデータベースがあり、依存関係で引き込まれて自動的にインストールされたか否かに関する情報がそこに含まれています。
ログなんて飾りですよ。
何ヶ月かすれば logrotate に消されてしまうものなので。;-)
aptitudeも(/var/lib/aptitude/pkgstatesだけでなく)/var/lib/apt/extended_statesを読み込んでくれるんですね。てことは、この二つを混用することによる問題って何が原因で起こるのでしょう。というか、問題自体も解決済みなのかな。やっぱちゃんと確認してからって話になっちゃいますね……。