PKG_DELETE(1)

名称
pkg_delete - インストールされているソフトウェア配布 package を削除するプログラム

書式
pkg_delete [-dDfGinrvx] [-p prefix] pkg-name ... pkg_delete -a [flags]

解説
pkg_delete コマンドは、 pkg_add(1) コマンドにより既にインストールされている package (訳注: FreeBSD の package system におけるパッケージを指す場合にこう表記します) を削除するために 用いられます。

警告
pkg_delete コマンドは package ファイルにより提供されるスクリプトやプログラムを 実行することがあるので、あなたのシステムは、危険な配布ファイルを 作る極悪人からの “トロイの木馬” や他の巧妙な攻撃などを受ける 可能性があります。

package ファイルを提供する人物の能力と身元を確認するとよいでしょう。 より進んだ安全のためには、package 記録ディレクトリ (/var/db/pkg/<pkg-name>/) にあるすべての package 制御ファイルを確認します。 +INSTALL, +POST-INSTALL, +DEINSTALL, +POST-DEINSTALL, +REQUIRE, +MTREE_DIRS の各ファイルには 特に注意を払い、+CONTENTS ファイルの @cwd, @mode (setuid をチェック), @dirrm, @exec, @unexec ディレクティブを調べてください。 インストールされている package 制御ファイルを調べるのには pkg_info(1) コマンドも使えます。

オプション
以下のコマンドラインオプションが提供されています:

pkg-name ...
    指定された package がアンインストールされます。

-a  無条件に、現在インストール済の package をすべて削除します。

-i  各 package の削除前に、確認を求めます。 これは、標準入力デバイスが端末かどうかに関係ありません。

-v  饒舌な出力に切り替えます。

-D  package にアンインストール用スクリプトが存在しても、それを実行しません。

-n  実際にはアンインストールは行わず、アンインストールした場合に実行されるであろう ステップを表示します。

-p prefix
    インストールされている package が明示的にディレクトリを設定していない 場合に、削除するファイルの前に prefix をディレクトリとして付け加えます。 ほとんどの package では、このディレクトリは pkg_add(1) によってインストールされた場所に自動的に設定されます。

-d  ファイル削除により生じた空のディレクトリを削除します。 デフォルトでは、package の内容一覧に明示的に羅列された ファイル/ディレクトリ (通常のファイル/ディレクトリか @dirrm ディレクトリを伴ったもの) のみがアンインストール時に削除されます。 このオプションにより pkg_delete は package を削除することにより生ずる空ディレクトリも削除するように なります。

-f  依存関係が記録されていたり、アンインストールスクリプトや require スクリプトが失敗した場合でも、強制的に package を削除します。

-G  削除対象の package の選択時に、 pkg-name 中のシェルグロブパターンの展開を試みません (デフォルトでは、 pkg_delete は pkg-name 中のシェルグロブパターンを自動的に展開します)。

-x  pkg-name を正規表現として扱い、名前がこの正規表現にマッチする全 package を削除します。 複数の正規表現を指定可能であす。 この場合、リスト中の少なくとも 1 個の正規表現にマッチする全 package が 削除されます。

-r  再帰的な削除。 指定した package に加え、これに依存する package もまた削除します。

技術詳細
pkg_delete は名前の通りに働きます。 pkg_delete は /var/db/pkg/<pkg-name> に記録されたインストール済みの package をチェックし、 package の内容を削除し、最後に package の記録も削除します。 環境変数 PKG_DBDIR が設定されている場合には、前記パス /var/db/pkg/ にこれが優先します。

ある package が他のインストール済みの package から必要とされている場合、 pkg_delete はそれらの依存している package の一覧を表示し、package の削除は 行いません (ただし -f オプションが指定された場合を除く)。

package が require ファイル( pkg_create(1) を参照)を含んでいる場合、まずそのファイルを以下の引数を付けて実行し、 アンインストール作業を続けるべきかどうかを確かめます:
require <pkg-name> DEINSTALL

(ここで pkg-name は問題としている package の名前であり、 DEINSTALL はこれがアンインストールであることを示すキーワードです) 終了ステータスが 0 以外の場合には、 -f オプションが指定されていない限りアンインストールを中断します。

package に deinstall スクリプトが含まれている場合、 そのスクリプトはファイルが削除される前に実行されます。 pkg_delete はオリジナルの package に含まれていたファイルを削除することしか 関知しないので、 package のインストールにまつわる雑多な事項をきれいに片づけるのは この deinstall スクリプトの責任です。 deinstall スクリプトは以下の引数を付けて実行されます:
script <pkg-name> DEINSTALL

ここで、 pkg-name は対象の package 名であり、 DEINSTALL はこれがアンインストール前のフェーズであることを示すキーワードです。

注: ( -k および -K のフラグを pkg_create(1) に使用することにより) package 作成時に deinstall と post-deinstall のスクリプトが別々に与えられる場合には、 DEINSTALL キーワードは登場しません。

post-deinstall スクリプトが package に対して存在する場合、 全ファイルが削除された 後 で実行されます。 package のインストールに際する更なる細々としたことを片づけ、 (願わくば) package インストール前と同じシステム状態に戻すことは、 このスクリプトの責任です。

post-deinstall は次のように呼び出されます:
script <pkg-name> POST-DEINSTALL

ここで pkg-name は対象の package 名であり、 POST-DEINSTALL はこれがアンインストール後のフェーズであることを示すキーワードです。

注: ( -k および -K のフラグを pkg_create(1) に使用することにより) package 作成時に deinstall と post-deinstall のスクリプトが別々に与えられる場合には、 POST-DEINSTALL キーワードは登場しません。

POST-DEINSTALL および PRE-DEINSTALL のキーワードを渡す背景には、 インストールと削除のすべてを扱うことができる単一のプログラム/スクリプト を記述可能にすることがあります。

しかしながら、この方法はメンテナンスがかなり難しく、 インストールおよびアンインストールの各局面を扱う別々のスクリプトを持つ方法 には及ばないことが、経験により分かりました。

すべてのスクリプトは環境変数 PKG_PREFIX にインストール時の prefix が設定された状態で実行されます (上記の -p オプションを参照)。 このことにより、package の作者は pkg_delete や pkg_add の -p フラグにより package がインストールされるディレクトリが 変更されても、きちんとふるまうスクリプトを書くことが可能になります。

環境変数
環境変数 PKG_DBDIR は、インストール済み package の代替データベースを指定します。

関連ファイル
/var/db/pkg
    インストール済み package のデーバベースのデフォルトの位置。

関連項目
pkg_add(1), pkg_create(1), pkg_info(1), pkg_version(1), mktemp(3), mtree(8)

作者
Jordan Hubbard

協力者
John Kohl <jtk@rational.com>

バグ
まだあるはずです。