识别系统软件包管理器


12

有没有办法(通过脚本)来标识默认的系统软件包管理器?

为了澄清,我想做的是运行一个给定的命令,在Debian或其任何派生版本上,它将返回类似“ apt”的内容,在openSUSE上它将返回“ zypp”,在Fedora等上它将返回“ yum”,在Arch Linux上将返回“ pacman”等。

我知道我可以使用类似以下的方法来做到这一点,我只是想知道是否存在一种更健壮的方法,只要有同名可执行文件就不会中断。

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

Answers:


9

从对这个问题的公认答案开始:如何在一个简单的shell脚本中获取发行名称和版本号?。然后,根据检测到的分发来决定要使用哪个程序包管理器。


是否有适用于不同发行版的软件包管理器列表?特别是有很多debian克隆。
DrAl 2012年

不确定列表是否可用,但是所有Debian克隆都将使用apt-get
吉姆·巴黎

是的,我意识到这一点;我的问题不是要识别发行版(尽管您的链接肯定会简化此过程),而是要弄清楚如何使用apt链接发行版名称((随机选择一个)“ SolusOS”)而不保留每个发行版的列表存在。
DrAl 2012年

以自动工具的方式进行:检查是否有效。顺便说一句,发行版使用apt表示它是Debian的亲戚(并且它们是相当紧凑的一堆),发现yum并不意味着包装约定(分成库/开发,Perl的一大块砖或单独打包) CPAN,...)相同。甚至不要尝试在CentOS上安装Fedora软件包(至少存在3或4年的版本偏斜,否则将无法使用)。
vonbrand

检测发行版仅适用于流行发行版。无法为所有鲜为人知的发行版更新白名单。直接测试工具的存在是使其工作的唯一方法。如果它看起来像鸭子,像鸭子一样游泳,而像鸭子一样嘎嘎叫,那可能就是鸭子。
liberforce

8

除了标识二进制程序,您应该从标识发行版开始,

请给您几行适用于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

这些部分虽然不能被信任,但是通常人们不会这么做。


1

在查看其他人之后,我选择了这条路线。当我运行许多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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.