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

xtupzzrd  于 2022-11-28  发布在  Linux
关注(0)|答案(6)|浏览(425)

我想写一个bash脚本,允许我检查,是否一个特定的包已经安装在arch linux。
我怎么能那样做呢?

62o28rlo

62o28rlo1#

您应该使用Pacman,它是Arch Linux的软件包管理器。
您希望使用-Q操作查询已安装的本地软件包数据库,并使用-i选项获取有关软件包的信息。
这给你

pacman -Qi <packageName>

然后,您可以使用退出代码来确定系统上是否存在软件包(0表示软件包存在,1表示不存在)
使用-i而不是-s可确保您将检查的正是该软件包,而不是名称中包含该软件包名称的软件包。
例如,如果我在只安装了chromium-bsu(游戏)的系统上搜索chromium(Web浏览器),

# 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
7xzttuei

7xzttuei2#

您可以使用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管道用于禁止打印输出。

vql8enpb

vql8enpb3#

我通常只做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;

更好的是,把它变成一个函数怎么样?
下面的代码中有两个例子。你可以使用_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"
qv7cva1a

qv7cva1a4#

试试这个:

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

在脚本中使用就像

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

velaa5lx5#

pacman -Q pkgName
如果未安装软件包,您将收到一条错误消息:

error: pacmage 'pkgName' was not found

如果安装了软件包,则打印一行:

pkgName x.y.z-r

pacman -Qi pkgName的行为方式相同,只是它打印有关现有包的详细信息。

ukdjmx9f

ukdjmx9f6#

我个人使用以下代码:
将此代码附加到您的~/.bashrc,然后获取源代码:

havei() {
  package=$1
  if $(pacman -Qi $package &>/dev/null); then
    echo -e "\e[92m[ 🗸 ] $package is installed \e[39m"
  else
    echo -e "\e[91m[ ❌ ] $package is not installed \e[39m"
  fi
}

然后,您可以在日常终端中简单地使用它:

havei firefox

相关问题