识别系统包管理器

DrA*_*rAl 19 distros shell package-management

有没有办法(从脚本)来识别默认的系统包管理器?

澄清一下,我想要做的是运行一个给定的命令,在 Debian 或其任何衍生产品上它会返回类似“apt”的东西,在 openSUSE 上它会返回“zypp”,在 Fedora 等上它会返回“yum”,在 Arch Linux 上它会返回“pacman”等。

我知道我可以用下面的方法来做到这一点,我只是想知道是否有一种更强大的方法,只要有同名的可执行文件就不会中断。

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...
Run Code Online (Sandbox Code Playgroud)

dai*_*isy 11

你应该从识别发行版开始,而不是识别二进制程序,

只需给您几行适用于 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
Run Code Online (Sandbox Code Playgroud)

尽管这些部分是不可信的,但通常人们不会这样做。


小智 10

在审查了其他路线后,我选择了走这条路线。当我运行许多 docker 容器并需要curl / jq 并且无法依赖工作之间可用的内容时,就会出现这种情况。

script:
 - packagesNeeded='curl jq'
 - if [ -x "$(command -v apk)" ];       then sudo apk add --no-cache $packagesNeeded
 - elif [ -x "$(command -v apt-get)" ]; then sudo apt-get install $packagesNeeded
 - elif [ -x "$(command -v dnf)" ];     then sudo dnf install $packagesNeeded
 - elif [ -x "$(command -v zypper)" ];  then sudo zypper install $packagesNeeded
 - else echo "FAILED TO INSTALL PACKAGE: Package manager not found. You must manually install: $packagesNeeded">&2; fi
Run Code Online (Sandbox Code Playgroud)

在纯 bash 中:

packagesNeeded=(curl jq)
if [ -x "$(command -v apk)" ];
then
    sudo apk add --no-cache "${packagesNeeded[@]}"
elif [ -x "$(command -v apt-get)" ];
then
    sudo apt-get install "${packagesNeeded[@]}"
elif [ -x "$(command -v dnf)" ];
then
    sudo dnf install "${packagesNeeded[@]}"
elif [ -x "$(command -v zypper)" ];
then
    sudo zypper install "${packagesNeeded[@]}"
else
    echo "FAILED TO INSTALL PACKAGE: Package manager not found. You must manually install: "${packagesNeeded[@]}"">&2;
fi
Run Code Online (Sandbox Code Playgroud)

您还可以直接测试退出状态command -v

if command -v apk &> /dev/null
then
    sudo apk add ...
fi
Run Code Online (Sandbox Code Playgroud)


Jim*_*ris 9

从这个问题的公认答案开始:How can I get distribution name and version number in a simple shell script? . 然后,根据检测到的分发决定要使用的包管理器。