我怎样才能知道Arch Linux中是否已经安装了特定的软件包

时间:2014-10-09 09:03:49

标签: linux bash archlinux

我想编写一个bash脚本,允许我检查一下是否已经在arch linux中安装了某个软件包。

我该怎么做?

4 个答案:

答案 0 :(得分:28)

你应该使用Arch Linux的包管理器Pacman。

您希望使用-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

正如Random Citizen指出的那样,如果您正在编写脚本并且不希望Pacman污染您的输出,您当然希望将任何输出重定向到/dev/null

pacman -Qi <packageName> > /dev/null

答案 1 :(得分:3)

您可以使用arch包管理工具 pacman 正如您在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管道用于抑制打印输出。

答案 2 :(得分:1)

我通常只做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="$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"

答案 3 :(得分:1)

试试这个:

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

在脚本中使用就像

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