Как проверить, установлен ли виртуальный пакет?

В следующем вопросе существует решение проверки пакет до установки его:

Как я проверяю, установлен ли пакет на моем сервере?

Однако я нашел, что это не работает на Виртуальные Пакеты.

Существует ли способ пересечь, имя пакета, настолько склонное - получают автоматически выбор и проверку на корректную?

5
задан 22 April 2017 в 08:29

4 ответа

Можно использовать 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
5
ответ дан 23 November 2019 в 08:52

Кв. не установит виртуальный пакет, если не будет только один поставщик для нее. Если другой пакет зависит от виртуального пакета, он обычно также называет реальный пакет как альтернативу (т.е. существенный для сборки зависят от "libc6-dev | libc-dev" - второе, являющееся виртуальным пакетом).

Виртуальные пакеты не установлены, таким образом Вы не можете проверить их состояние. Можно использовать apt-cache showpkg <pkg-name> для просмотра, какие пакеты обеспечивают виртуальный пакет и затем проверяют, установлен ли какой-либо из них.

7
ответ дан 23 November 2019 в 08:52

@FlorianDiesch'answer выглядит интересным, но я хочу что-то без потребности в любом программном обеспечении, не установленном по умолчанию.

я закончил тем, что использовал это:

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
1
ответ дан 23 November 2019 в 08:52

Можно запросить базу данных установленных пакетов для packagename с

dpkg -l packagename   

, И можно перечислить все файлы в packagename с

dpkg -L packagename

Read man dpkg для получения дополнительной информации, как то, как использовать подстановочные знаки.

-3
ответ дан 23 November 2019 в 08:52

Другие вопросы по тегам:

Похожие вопросы: