web-dev-qa-db-fra.com

Comment savoir si un paquet spécifique est déjà installé dans Arch Linux

Je veux écrire un script bash me permettant de vérifier si un certain paquet est déjà installé dans Arch Linux.

Comment puis je faire ça?

15
Random Citizen

Vous devriez utiliser Pacman, le gestionnaire de paquets d’Arch Linux. 

Vous souhaitez utiliser l'opération -Q pour interroger la base de données de packages locale installée et l'option -i pour obtenir des informations sur le package.

Cela vous donne

pacman -Qi <packageName>

Vous pouvez ensuite utiliser le code de sortie pour déterminer si les packages existent ou non sur le système (0 le package existe, 1 il n'existe pas)

L'utilisation de -i au lieu de -s garantit que vous vérifierez exactement ce package et non la présence d'un package contenant le nom du package dans son nom.

Par exemple, si je recherche chromium (le navigateur Web) sur un système où seul chromium-bsu (le jeu) est installé,

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

Comme Random Citizen a fait remarquer, vous voulez certainement rediriger toute sortie vers /dev/null si vous écrivez un script et ne souhaitez pas que Pacman pollue votre sortie: 

pacman -Qi <packageName> > /dev/null
27
Fredszaq

Vous pouvez utiliser l'outil de gestion de paquets Arch pacman .
Comme vous pouvez le constater dans Arch-Wiki , l’option -Qs peut être utilisée pour effectuer une recherche dans les packages installés.

Si le paquet existe, pacman -Qs va sortir avec le code de sortie 0, sinon avec le code de sortie 1

Votre script pourrait ressembler à:

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

Le tube > /dev/null est utilisé pour supprimer la sortie imprimée.

3
Random Citizen

En général, je ne fais que ls /bin | grep $package (en remplaçant le paquet $ par le paquet que je cherche). C'est rapide pour l'ordinateur aussi.

Cela dépend cependant du nom du paquet, car cela listera tous les exécutables installés qui ont $ paquet dans leur nom. Néanmoins, si vous avez des exécutables installés avec $ paquet dans leur nom, il y a de grandes chances que le paquet que vous cherchez soit déjà installé.

Mettre à jour

En voici une plus précise:

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;

Mieux encore, pourquoi ne pas en faire une fonction? 

Il y a 2 exemples dans le code ci-dessous. Vous pouvez utiliser _install pour installer un seul paquet. Vous pouvez utiliser _installMany pour installer autant de packages que vous le souhaitez. J'ai inclus les deux fonctions parce que _installMany est un peu complexe et que regarder la fonction un peu plus simple _install pourrait aider quelqu'un à le comprendre.

#!/bin/bash
_isInstalled() {
    package="$1";
    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="$1";

    # 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"
1
GreenRaccoon23

Essaye ça:

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

Utiliser un script est aussi simple que

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