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?
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
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.
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é.
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"
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