Как узнать, установлен ли уже конкретный пакет в Arch Linux

Я хочу написать сценарий bash, позволяющий мне проверить, установлен ли уже определенный пакет в arch linux.

Как я могу это сделать?

4 ответов


вы должны использовать Pacman, менеджер пакетов Arch Linux.

вы хотите использовать -Q операция запроса установленной базы данных локального пакета и -i возможность получить информацию о пакете.

это дает вам

pacman -Qi <packageName>

затем вы можете использовать код выхода, чтобы определить, существуют ли пакеты в системе или нет (0 пакет существует, 1 его нет)

использование -i, а не -s обеспечивает вы будет проверять именно этот пакет, а не наличие пакета, содержащего имя пакета в его имени.

например, если я ищу chromium (веб-браузер) в системе, где только chromium-bsu (игра) установлено,

# This exits with 1 because chromium is not installed
pacman -Qi chromium 
# This exits with 0 because chromium-bsu is installed
pacman -Qs chromium

As Случайный Гражданин указал, что вы, безусловно, хотите перенаправить любой вывод на /dev/null если вы пишете сценарий и не хотите, чтобы Pacman загрязнял ваш вывод:

pacman -Qi <packageName> > /dev/null

вы можете использовать инструмент управления пакетами arch Пакман.
Как вы можете видеть в Arch-Wiki на -Qs опция может использоваться для поиска внутри установленных пакетов.

если пакет существует, pacman -Qs выйдет с кодом выхода 0, в противном случае с кодом выхода 1

вы скрипт может выглядеть так:

package=firefox
if pacman -Qs $package > /dev/null ; then
  echo "The package $package is installed"
else
  echo "The package $package is not installed"
fi

на > /dev/null труба использована для того чтобы подавить напечатанный выход.


Я обычно просто делаю ls /bin | grep $package (замена $package на пакет, который я ищу). Это быстро для компьютера тоже.

это зависит от имени пакета, хотя, потому что это будет список всех установленных исполняемых файлов, которые имеют $package в их имени. Тем не менее, если у вас установлены исполняемые файлы с $package на их имя, есть большой шанс, что пакет, который вы ищете, уже установлен.

обновление

вот более точная один:

package="lshw";
check="$(sudo pacman -Qs --color always "${package}" | grep "local" | grep "${package} ")";
if [ -n "${check}" ] ; then
    echo "${package} is installed";
elif [ -z "${check}" ] ; then
    echo "${package} is NOT installed";
fi;

еще лучше, как насчет превращения его в функцию?

в приведенном ниже коде есть 2 примера. Вы можете использовать _install установить только один пакет. Вы можете использовать _installMany чтобы установить столько пакетов, сколько вы хотите. Я включил обе функции, потому что _installMany является своего рода сложным, и глядя на немного проще _install функция может помочь кому-то понять это.

#!/bin/bash
_isInstalled() {
    package="";
    check="$(sudo pacman -Qs --color always "${package}" | grep "local" | grep "${package} ")";
    if [ -n "${check}" ] ; then
        echo 0; #'0' means 'true' in Bash
        return; #true
    fi;
    echo 1; #'1' means 'false' in Bash
    return; #false
}

# `_install <pkg>`
_install() {
    package="";

    # If the package IS installed:
    if [[ $(_isInstalled "${package}") == 0 ]]; then
        echo "${package} is already installed.";
        return;
    fi;

    # If the package is NOT installed:
    if [[ $(_isInstalled "${package}") == 1 ]]; then
        sudo pacman -S "${package}";
    fi;
}

# `_installMany <pkg1> <pkg2> ...`
# Works the same as `_install` above,
#     but you can pass more than one package to this one.
_installMany() {
    # The packages that are not installed will be added to this array.
    toInstall=();

    for pkg; do
        # If the package IS installed, skip it.
        if [[ $(_isInstalled "${pkg}") == 0 ]]; then
            echo "${pkg} is already installed.";
            continue;
        fi;

        #Otherwise, add it to the list of packages to install.
        toInstall+=("${pkg}");
    done;

    # If no packages were added to the "${toInstall[@]}" array,
    #     don't do anything and stop this function.
    if [[ "${toInstall[@]}" == "" ]] ; then
        echo "All packages are already installed.";
        return;
    fi;

    # Otherwise, install all the packages that have been added to the "${toInstall[@]}" array.
    printf "Packages not installed:\n%s\n" "${toInstall[@]}";
    sudo pacman -S "${toInstall[@]}";
}

package="lshw";
_install "${package}";

packages=("lshw" "inkscape");
_installMany "${packages[@]}";
#Or,
_installMany "lshw" "inkscape"

попробуйте это:

isPackageInstalled() {
  pacman -Qi "$packageName" &> /dev/null
  echo $?
}

используя в скрипте так же просто, как

if [ $(isPackageInstalled 'libssl') ]; then 
    # do things here
    echo 'Package libssl is installed'
fi