如何检查虚拟包是否已安装?

如何检查虚拟包是否已安装?

在以下问题中,有一个在安装包之前检查包的解决方案:

如何检查某个软件包是否安装在我的服务器上?

然而,我发现这不适用于虚拟套餐

有没有办法遍历 apt-get 自动选择的包名称并检查正确的包名称?

答案1

除非只有一个提供程序,否则 Apt 不会安装虚拟包。如果另一个包依赖于虚拟包,它通常还会将真实包命名为替代包(即 build-essential 依赖于“libc6-dev | libc-dev” - 第二个是虚拟包)。

虚拟包未安装,因此您无法检查其状态。您可以使用apt-cache showpkg <pkg-name>查看哪些包提供虚拟包,然后检查其中是否已安装。

答案2

您可以使用grep 状态(包dctrl-tools,默认情况下未安装)查找所有已安装的包,提供一些虚拟包:

$ grep-status -FProvides,Package -sPackage,Provides,Status awk 
Package: mawk
Provides: awk
Status: install ok installed

Package: gawk
Provides: awk
Status: install ok installed

答案3

@FlorianDiesch 的答案看起来很有趣,但我想要一些不需要任何默认未安装的软件的东西。

我最终使用了这个:

function check_packages_and_install_if_absent()
{
    for PACKAGENAME
    do
        if
            dpkg -l "$PACKAGENAME" | grep ^ii
        then
            echo "Package $PACKAGENAME is present"
            continue
        fi

        FOUND=""

        while read ACTUALPACKAGENAME
        do
            echo "$PACKAGENAME is a virtual package, that can be provided by $ACTUALPACKAGENAME"

            if
                dpkg -l "$ACTUALPACKAGENAME" | grep ^ii
            then
                echo "Actual package $ACTUALPACKAGENAME is present"
                FOUND=true
                break;
            fi

        done < <( apt-cache showpkg "${PACKAGENAME}" | sed -e '1,/^Reverse Provides: *$/ d' -e 's/ .*$//' | sort | uniq )

        # Using sed to print lines after match
        # https://stackoverflow.com/questions/32569032/sed-print-all-lines-after-match#answer-32569573

        if [[ "$FOUND" == "true" ]]
        then
            continue
        fi

        echo "Package $PACKAGENAME is absent, installing"
        sudo apt-get install -y "$PACKAGENAME"
    done
}

您可以使用普通包名称和/或虚拟包名称列表来调用它:

function check_packages_and_install_if_absent foo bar baz

答案4

您可以查询已安装软件包的数据库包裹名字

dpkg -l packagename   

您可以列出所有文件包裹名字

dpkg -L packagename

阅读man dpkg更多信息,例如如何使用通配符。

相关内容