簡體   English   中英

我怎樣才能知道特定的 package 是否已經安裝在 Arch Linux 中

[英]How can I find out, whether a specific package is already installed in Arch Linux

我想寫一個 bash 腳本,讓我檢查某個 package 是否已經安裝在 arch linux 中。

我怎樣才能做到這一點?

您應該使用Arch Linux的包管理器Pacman。

您希望使用-Q操作來查詢已安裝的本地包數據庫,並使用-i選項來獲取有關包的信息。

這給了你

pacman -Qi <packageName>

然后,您可以使用退出代碼來確定軟件包是否在系統上存在(0包存在,1則不存在)

-i而不是-s確保您將檢查該包的確切位置,而不是在其名稱中是否存在包含包名稱的包。

例如,如果我在安裝了chromium-bsu (游戲)的系統上搜索chromium (網絡瀏覽器),

# 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

您可以使用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管道用於抑制打印輸出。

我通常只做ls /bin | grep $package 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"

試試這個:

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

在腳本中使用就像這樣簡單

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

pacman -Q pkgName

如果未安裝 package,您將收到一條錯誤消息:

error: pacmage 'pkgName' was not found

如果安裝了 package,則會打印一行:

pkgName x.y.z-r

pacman -Qi pkgName的行為方式相同,只是打印有關現有 package 的詳細信息。

Personnaly,我使​​用以下內容:

將此附加到您的~/.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM