web-dev-qa-db-ja.com

Arch Linuxに特定のパッケージが既にインストールされているかどうか、どうすればわかりますか

Arch Linuxに特定のパッケージがすでにインストールされているかどうかを確認できるbashスクリプトを書きたいのですが。

どうやってやるの?

20
Random Citizen

Arch LinuxのパッケージマネージャーであるPacmanを使用する必要があります。

-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

ランダムな市民 が指摘したように、スクリプトを記述していて、パックマンに出力を汚染させたくない場合は、出力を/dev/nullにリダイレクトする必要があります。

pacman -Qi <packageName> > /dev/null
28
Fredszaq

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パイプは、印刷出力を抑制するために使用されます。

3
Random Citizen

通常は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を使用して、1つのパッケージのみをインストールできます。 _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"
1
GreenRaccoon23

これを試して:

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

スクリプトでの使用は、

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