web-dev-qa-db-ja.com

システムパッケージマネージャーの識別

デフォルトのシステムパッケージマネージャーを(スクリプトから)識別する方法はありますか?

明確にするために、私がしたいのは、与えられたコマンドを実行することであり、Debianまたはその派生物では「apt」のようなものを返し、openSUSEでは「zypp」を返し、Fedoraなどではそれを返します。 「yum」、Arch Linuxでは「pacman」などを返します。

私は次のようなものでこれを行うことができることを知っています、同じ名前の実行可能ファイルがあるとすぐに壊れないより堅牢な方法があるかどうか疑問に思いました。

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...
12
DrAl

この質問に対する受け入れられた回答から始めてください 単純なシェルスクリプトでディストリビューション名とバージョン番号を取得するにはどうすればよいですか? 。次に、検出されたディストリビューションに基づいて、使用するパッケージマネージャーを決定します。

9
Jim Paris

バイナリプログラムを特定する代わりに、ディストリビューションを特定することから始めるべきです。

Bashスクリプトで機能する数行を指定します。

declare -A osInfo;
osInfo[/etc/redhat-release]=yum
osInfo[/etc/Arch-release]=pacman
osInfo[/etc/gentoo-release]=emerge
osInfo[/etc/SuSE-release]=zypp
osInfo[/etc/debian_version]=apt-get

for f in ${!osInfo[@]}
do
    if [[ -f $f ]];then
        echo Package manager: ${osInfo[$f]}
    fi
done

これらの部分を通して信頼することはできませんが、一般的に人々はそれを行いません。

8
daisy

他の人を確認した後、私はこのルートに行くことを選びました。これは、多くのDockerコンテナーを実行していて、curl/jqが必要で、ジョブ間で利用可能なものに依存できない場合に思い付きました。

script:
 - if [ -x "$(command -v apk)" ]; then apk add --no-cache curl jq; fi
 - if [ -x "$(command -v apt-get)" ]; then apt-get install curl jq; fi
 - if [ -x "$(command -v dnf)" ]; then dnf install curl jq; fi
 - if [ -x "$(command -v zypper)" ]; then zypper install curl jq; fi
2
Mark