Как узнать, установлен ли уже конкретный пакет в 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